Toggle navigation
Toggle navigation
此项目
正在载入...
Sign in
胡斌
/
srs
转到一个项目
Toggle navigation
项目
群组
代码片段
帮助
Toggle navigation pinning
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Authored by
winlin
2014-11-08 09:12:52 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
1074c8d9b27752048eee47500c66220fa331e033
1074c8d9
1 parent
496f4246
for bug #66, use new api to directly sendout h264 raw data.
隐藏空白字符变更
内嵌
并排对比
正在显示
3 个修改的文件
包含
34 行增加
和
34 行删除
trunk/research/librtmp/srs_h264_raw_publish.c
trunk/src/libs/srs_librtmp.cpp
trunk/src/libs/srs_librtmp.hpp
trunk/research/librtmp/srs_h264_raw_publish.c
查看文件 @
1074c8d
...
...
@@ -157,18 +157,9 @@ int main(int argc, char** argv)
goto
rtmp_destroy
;
}
// convert the h264 packet to rtmp packet.
char
*
rtmp_data
=
NULL
;
int
rtmp_size
=
0
;
u_int32_t
timestamp
=
0
;
if
(
srs_h264_to_rtmp
(
data
,
size
,
dts
,
pts
,
&
rtmp_data
,
&
rtmp_size
,
&
timestamp
)
!=
0
)
{
srs_trace
(
"h264 raw data to rtmp data failed."
);
goto
rtmp_destroy
;
}
// send out the rtmp packet.
int
type
=
SRS_RTMP_TYPE_VIDEO
;
if
(
srs_write_packet
(
rtmp
,
type
,
timestamp
,
rtmp_data
,
rtmp_size
)
!=
0
)
{
// send out the h264 packet over RTMP
if
(
srs_write_h264_raw_frame
(
rtmp
,
data
,
size
,
dts
,
pts
)
!=
0
)
{
srs_trace
(
"send h264 raw data failed."
);
goto
rtmp_destroy
;
}
...
...
@@ -176,7 +167,7 @@ int main(int argc, char** argv)
// H.264-AVC-ISO_IEC_14496-10.pdf, page 44.
u_int8_t
nut
=
(
char
)
data
[
0
]
&
0x1f
;
srs_trace
(
"sent packet: type=%s, time=%d, size=%d, fps=%d, b[0]=%#x(%s)"
,
srs_type2string
(
type
),
timestamp
,
rtmp_
size
,
fps
,
nut
,
srs_type2string
(
SRS_RTMP_TYPE_VIDEO
),
dts
,
size
,
fps
,
nut
,
(
nut
==
7
?
"SPS"
:
(
nut
==
8
?
"PPS"
:
(
nut
==
5
?
"I"
:
(
nut
==
1
?
"P"
:
"Unknown"
)))));
// @remark, when use encode device, it not need to sleep.
...
...
trunk/src/libs/srs_librtmp.cpp
查看文件 @
1074c8d
...
...
@@ -70,6 +70,9 @@ struct Context
SimpleSocketStream
*
skt
;
int
stream_id
;
// for h264 raw stream
SrsStream
raw_stream
;
Context
()
{
rtmp
=
NULL
;
skt
=
NULL
;
...
...
@@ -996,22 +999,31 @@ char* srs_amf0_human_print(srs_amf0_t amf0, char** pdata, int* psize)
return
any
->
human_print
(
pdata
,
psize
);
}
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
)
int
srs_
write_h264_raw_frame
(
srs_rtmp_t
rtmp
,
char
*
frame
,
int
frame_size
,
u_int32_t
dts
,
u_int32_t
pts
)
{
srs_assert
(
h264_raw_size
>
0
);
int
ret
=
ERROR_SUCCESS
;
srs_assert
(
frame_size
>
0
);
// the timestamp in rtmp message header is dts.
*
ptimestamp
=
dts
;
srs_assert
(
rtmp
!=
NULL
);
Context
*
context
=
(
Context
*
)
rtmp
;
if
((
ret
=
context
->
raw_stream
.
initialize
(
frame
,
frame_size
))
!=
ERROR_SUCCESS
)
{
return
ret
;
}
/*// the timestamp in rtmp message header is dts.
u_int32_t timestamp = dts;
// for h264 in RTMP video payload, there is 5bytes header:
// 1bytes, FrameType | CodecID
// 1bytes, AVCPacketType
// 3bytes, CompositionTime, the cts.
// @see: E.4.3 Video Tags, video_file_format_spec_v10_1.pdf, page 78
*
prtmp_size
=
h264_raw_size
+
5
;
char
*
p
=
new
char
[
*
prtmp_size
];
memcpy
(
p
+
5
,
h264_raw_data
,
h264_raw_size
);
*
prtmp_data
=
p
;
int size = h264_raw_size + 5;
char* data = new char[size];
memcpy(data + 5, h264_raw_data, h264_raw_size);
// 5bits, 7.3.1 NAL unit syntax,
// H.264-AVC-ISO_IEC_14496-10.pdf, page 44.
...
...
@@ -1044,9 +1056,9 @@ int srs_h264_to_rtmp(char* h264_raw_data, int h264_raw_size, u_int32_t dts, u_in
char* pp = (char*)&cts;
*p++ = pp[2];
*p++ = pp[1];
*
p
++
=
pp
[
0
];
*p++ = pp[0];
*/
return
0
;
return
ret
;
}
int
srs_h264_startswith_annexb
(
char
*
h264_raw_data
,
int
h264_raw_size
,
int
*
pnb_start_code
)
...
...
trunk/src/libs/srs_librtmp.hpp
查看文件 @
1074c8d
...
...
@@ -337,24 +337,21 @@ extern char* srs_amf0_human_print(srs_amf0_t amf0, char** pdata, int* psize);
**************************************************************
*************************************************************/
/**
* convert h264 stream data to rtmp packet.
* @param h264_raw_data the input h264 raw data, a encoded h.264 I/P/B frame data.
* @paam h264_raw_size the size of h264 raw data. assert > 0.
* write h.264 raw frame to rtmp server.
* @param frame the input h264 raw data, an encoded h.264 I/P/B frame data.
* it must be prefixed by h.264 annexb format, by N[00] 00 00 01, where N>=0,
* for instance, 00 00 00 01 67 42 80 29 95 A0 14 01 6E 40
* @paam frame_size the size of h264 raw data. assert frame_size > 0.
* @param dts the dts of h.264 raw data.
* @param pts the pts of h.264 raw data.
* @param prtmp_data the output rtmp format packet, which can be send by srs_write_packet.
* @param prtmp_size the size of rtmp packet, for srs_write_packet.
* @param ptimestamp the timestamp of rtmp packet, for srs_write_packet.
*
* @remark, user should free the h264_raw_data.
* @remark, user should free the prtmp_data if success.
* @remark, user should free the frame.
* @remark, the tbn of dts/pts is 1/1000 for RTMP, that is, in ms.
*
* @return 0, success; otherswise, failed.
*/
extern
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
extern
int
srs_write_h264_raw_frame
(
srs_rtmp_t
rtmp
,
char
*
frame
,
int
frame_size
,
u_int32_t
dts
,
u_int32_t
pts
);
/**
* whether h264 raw data starts with the annexb,
...
...
请
注册
或
登录
后发表评论