正在显示
3 个修改的文件
包含
43 行增加
和
46 行删除
@@ -37,26 +37,30 @@ gcc srs_h264_raw_publish.c ../../objs/lib/srs_librtmp.a -g -O0 -lstdc++ -o srs_h | @@ -37,26 +37,30 @@ gcc srs_h264_raw_publish.c ../../objs/lib/srs_librtmp.a -g -O0 -lstdc++ -o srs_h | ||
37 | 37 | ||
38 | #define srs_trace(msg, ...) printf(msg, ##__VA_ARGS__);printf("\n") | 38 | #define srs_trace(msg, ...) printf(msg, ##__VA_ARGS__);printf("\n") |
39 | 39 | ||
40 | -int read_h264_frame(char* data, int size, char** p, int fps, | 40 | +int read_h264_frame(char* data, int size, char** pp, int fps, |
41 | char** frame, int* frame_size, int* dts, int* pts) | 41 | char** frame, int* frame_size, int* dts, int* pts) |
42 | { | 42 | { |
43 | + char* p = *pp; | ||
44 | + | ||
43 | // @remark, for this demo, to publish h264 raw file to SRS, | 45 | // @remark, for this demo, to publish h264 raw file to SRS, |
44 | // we search the h264 frame from the buffer which cached the h264 data. | 46 | // we search the h264 frame from the buffer which cached the h264 data. |
45 | // please get h264 raw data from device, it always a encoded frame. | 47 | // please get h264 raw data from device, it always a encoded frame. |
46 | int pnb_start_code = 0; | 48 | int pnb_start_code = 0; |
47 | - if (!srs_h264_startswith_annexb(*p, size - (*p - data), &pnb_start_code)) { | 49 | + if (!srs_h264_startswith_annexb(p, size - (p - data), &pnb_start_code)) { |
48 | srs_trace("h264 raw data invalid."); | 50 | srs_trace("h264 raw data invalid."); |
49 | return -1; | 51 | return -1; |
50 | } | 52 | } |
51 | - *p += pnb_start_code; | 53 | + p += pnb_start_code; |
52 | 54 | ||
53 | - *frame = *p; | ||
54 | - for (;*p < data + size; *p = *p + 1) { | ||
55 | - if (srs_h264_startswith_annexb(*p, size - (*p - data), &pnb_start_code)) { | 55 | + *frame = p; |
56 | + for (;p < data + size; p++) { | ||
57 | + if (srs_h264_startswith_annexb(p, size - (p - data), &pnb_start_code)) { | ||
56 | break; | 58 | break; |
57 | } | 59 | } |
58 | } | 60 | } |
59 | - *frame_size = *p - *frame; | 61 | + |
62 | + *pp = p; | ||
63 | + *frame_size = p - *frame; | ||
60 | if (*frame_size <= 0) { | 64 | if (*frame_size <= 0) { |
61 | srs_trace("h264 raw data invalid."); | 65 | srs_trace("h264 raw data invalid."); |
62 | return -1; | 66 | return -1; |
@@ -157,18 +161,9 @@ int main(int argc, char** argv) | @@ -157,18 +161,9 @@ int main(int argc, char** argv) | ||
157 | goto rtmp_destroy; | 161 | goto rtmp_destroy; |
158 | } | 162 | } |
159 | 163 | ||
160 | - // convert the h264 packet to rtmp packet. | ||
161 | - char* rtmp_data = NULL; | ||
162 | - int rtmp_size = 0; | ||
163 | - u_int32_t timestamp = 0; | ||
164 | - if (srs_h264_to_rtmp(data, size, dts, pts, &rtmp_data, &rtmp_size, ×tamp) != 0) { | ||
165 | - srs_trace("h264 raw data to rtmp data failed."); | ||
166 | - goto rtmp_destroy; | ||
167 | - } | ||
168 | - | ||
169 | - // send out the rtmp packet. | ||
170 | - int type = SRS_RTMP_TYPE_VIDEO; | ||
171 | - if (srs_write_packet(rtmp, type, timestamp, rtmp_data, rtmp_size) != 0) { | 164 | + // send out the h264 packet over RTMP |
165 | + if (srs_write_h264_raw_frame(rtmp, data, size, dts, pts) != 0) { | ||
166 | + srs_trace("send h264 raw data failed."); | ||
172 | goto rtmp_destroy; | 167 | goto rtmp_destroy; |
173 | } | 168 | } |
174 | 169 | ||
@@ -176,7 +171,7 @@ int main(int argc, char** argv) | @@ -176,7 +171,7 @@ int main(int argc, char** argv) | ||
176 | // H.264-AVC-ISO_IEC_14496-10.pdf, page 44. | 171 | // H.264-AVC-ISO_IEC_14496-10.pdf, page 44. |
177 | u_int8_t nut = (char)data[0] & 0x1f; | 172 | u_int8_t nut = (char)data[0] & 0x1f; |
178 | srs_trace("sent packet: type=%s, time=%d, size=%d, fps=%d, b[0]=%#x(%s)", | 173 | srs_trace("sent packet: type=%s, time=%d, size=%d, fps=%d, b[0]=%#x(%s)", |
179 | - srs_type2string(type), timestamp, rtmp_size, fps, nut, | 174 | + srs_type2string(SRS_RTMP_TYPE_VIDEO), dts, size, fps, (char)data[0], |
180 | (nut == 7? "SPS":(nut == 8? "PPS":(nut == 5? "I":(nut == 1? "P":"Unknown"))))); | 175 | (nut == 7? "SPS":(nut == 8? "PPS":(nut == 5? "I":(nut == 1? "P":"Unknown"))))); |
181 | 176 | ||
182 | // @remark, when use encode device, it not need to sleep. | 177 | // @remark, when use encode device, it not need to sleep. |
@@ -996,27 +996,31 @@ char* srs_amf0_human_print(srs_amf0_t amf0, char** pdata, int* psize) | @@ -996,27 +996,31 @@ char* srs_amf0_human_print(srs_amf0_t amf0, char** pdata, int* psize) | ||
996 | return any->human_print(pdata, psize); | 996 | return any->human_print(pdata, psize); |
997 | } | 997 | } |
998 | 998 | ||
999 | -int srs_h264_to_rtmp(char* h264_raw_data, int h264_raw_size, u_int32_t dts, u_int32_t pts, char** prtmp_data, int* prtmp_size, u_int32_t* ptimestamp) | 999 | +int srs_write_h264_raw_frame(srs_rtmp_t rtmp, char* frame, int frame_size, u_int32_t dts, u_int32_t pts) |
1000 | { | 1000 | { |
1001 | - srs_assert(h264_raw_size > 0); | 1001 | + int ret = ERROR_SUCCESS; |
1002 | + | ||
1003 | + srs_assert(frame_size > 1); | ||
1004 | + | ||
1005 | + srs_assert(rtmp != NULL); | ||
1006 | + Context* context = (Context*)rtmp; | ||
1007 | + | ||
1008 | + // 5bits, 7.3.1 NAL unit syntax, | ||
1009 | + // H.264-AVC-ISO_IEC_14496-10.pdf, page 44. | ||
1010 | + // 7: SPS, 8: PPS, 5: I Frame, 1: P Frame | ||
1011 | + u_int8_t nal_unit_type = (char)frame[0] & 0x1f; | ||
1002 | 1012 | ||
1003 | - // the timestamp in rtmp message header is dts. | ||
1004 | - *ptimestamp = dts; | 1013 | + /*// the timestamp in rtmp message header is dts. |
1014 | + u_int32_t timestamp = dts; | ||
1005 | 1015 | ||
1006 | // for h264 in RTMP video payload, there is 5bytes header: | 1016 | // for h264 in RTMP video payload, there is 5bytes header: |
1007 | // 1bytes, FrameType | CodecID | 1017 | // 1bytes, FrameType | CodecID |
1008 | // 1bytes, AVCPacketType | 1018 | // 1bytes, AVCPacketType |
1009 | // 3bytes, CompositionTime, the cts. | 1019 | // 3bytes, CompositionTime, the cts. |
1010 | // @see: E.4.3 Video Tags, video_file_format_spec_v10_1.pdf, page 78 | 1020 | // @see: E.4.3 Video Tags, video_file_format_spec_v10_1.pdf, page 78 |
1011 | - *prtmp_size = h264_raw_size + 5; | ||
1012 | - char* p = new char[*prtmp_size]; | ||
1013 | - memcpy(p + 5, h264_raw_data, h264_raw_size); | ||
1014 | - *prtmp_data = p; | ||
1015 | - | ||
1016 | - // 5bits, 7.3.1 NAL unit syntax, | ||
1017 | - // H.264-AVC-ISO_IEC_14496-10.pdf, page 44. | ||
1018 | - // 7: SPS, 8: PPS, 5: I Frame, 1: P Frame | ||
1019 | - u_int8_t nal_unit_type = (char)h264_raw_data[0] & 0x1f; | 1021 | + int size = h264_raw_size + 5; |
1022 | + char* data = new char[size]; | ||
1023 | + memcpy(data + 5, h264_raw_data, h264_raw_size); | ||
1020 | 1024 | ||
1021 | // Frame Type, Type of video frame. | 1025 | // Frame Type, Type of video frame. |
1022 | // @see: E.4.3 Video Tags, video_file_format_spec_v10_1.pdf, page 78 | 1026 | // @see: E.4.3 Video Tags, video_file_format_spec_v10_1.pdf, page 78 |
@@ -1044,9 +1048,9 @@ int srs_h264_to_rtmp(char* h264_raw_data, int h264_raw_size, u_int32_t dts, u_in | @@ -1044,9 +1048,9 @@ int srs_h264_to_rtmp(char* h264_raw_data, int h264_raw_size, u_int32_t dts, u_in | ||
1044 | char* pp = (char*)&cts; | 1048 | char* pp = (char*)&cts; |
1045 | *p++ = pp[2]; | 1049 | *p++ = pp[2]; |
1046 | *p++ = pp[1]; | 1050 | *p++ = pp[1]; |
1047 | - *p++ = pp[0]; | 1051 | + *p++ = pp[0];*/ |
1048 | 1052 | ||
1049 | - return 0; | 1053 | + return ret; |
1050 | } | 1054 | } |
1051 | 1055 | ||
1052 | int srs_h264_startswith_annexb(char* h264_raw_data, int h264_raw_size, int* pnb_start_code) | 1056 | int srs_h264_startswith_annexb(char* h264_raw_data, int h264_raw_size, int* pnb_start_code) |
@@ -337,24 +337,22 @@ extern char* srs_amf0_human_print(srs_amf0_t amf0, char** pdata, int* psize); | @@ -337,24 +337,22 @@ extern char* srs_amf0_human_print(srs_amf0_t amf0, char** pdata, int* psize); | ||
337 | ************************************************************** | 337 | ************************************************************** |
338 | *************************************************************/ | 338 | *************************************************************/ |
339 | /** | 339 | /** |
340 | -* convert h264 stream data to rtmp packet. | ||
341 | -* @param h264_raw_data the input h264 raw data, a encoded h.264 I/P/B frame data. | ||
342 | -* @paam h264_raw_size the size of h264 raw data. assert > 0. | 340 | +* write h.264 raw frame over RTMP to rtmp server. |
341 | +* @param frame the input h264 raw data, an encoded h.264 I/P/B frame data. | ||
342 | +* the frame without h.264 annexb header, by N[00] 00 00 01, where N>=0, | ||
343 | +* for instance, header(00 00 00 01) + frame(67 42 80 29 95 A0 14 01 6E 40) | ||
344 | +* @paam frame_size the size of h264 raw data. | ||
345 | +* assert frame_size > 1, at least has 1 bytes header. | ||
343 | * @param dts the dts of h.264 raw data. | 346 | * @param dts the dts of h.264 raw data. |
344 | * @param pts the pts of h.264 raw data. | 347 | * @param pts the pts of h.264 raw data. |
345 | -* @param prtmp_data the output rtmp format packet, which can be send by srs_write_packet. | ||
346 | -* @param prtmp_size the size of rtmp packet, for srs_write_packet. | ||
347 | -* @param ptimestamp the timestamp of rtmp packet, for srs_write_packet. | ||
348 | * | 348 | * |
349 | -* @remark, user should free the h264_raw_data. | ||
350 | -* @remark, user should free the prtmp_data if success. | 349 | +* @remark, user should free the frame. |
351 | * @remark, the tbn of dts/pts is 1/1000 for RTMP, that is, in ms. | 350 | * @remark, the tbn of dts/pts is 1/1000 for RTMP, that is, in ms. |
352 | * | 351 | * |
353 | * @return 0, success; otherswise, failed. | 352 | * @return 0, success; otherswise, failed. |
354 | */ | 353 | */ |
355 | -extern int srs_h264_to_rtmp( | ||
356 | - char* h264_raw_data, int h264_raw_size, u_int32_t dts, u_int32_t pts, | ||
357 | - char** prtmp_data, int* prtmp_size, u_int32_t* ptimestamp | 354 | +extern int srs_write_h264_raw_frame(srs_rtmp_t rtmp, |
355 | + char* frame, int frame_size, u_int32_t dts, u_int32_t pts | ||
358 | ); | 356 | ); |
359 | /** | 357 | /** |
360 | * whether h264 raw data starts with the annexb, | 358 | * whether h264 raw data starts with the annexb, |
-
请 注册 或 登录 后发表评论