librtmp使用扩展时间戳时服务器会将连接断开解释资料Word格式文档下载.docx
- 文档编号:1500876
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:10
- 大小:722.76KB
librtmp使用扩展时间戳时服务器会将连接断开解释资料Word格式文档下载.docx
《librtmp使用扩展时间戳时服务器会将连接断开解释资料Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《librtmp使用扩展时间戳时服务器会将连接断开解释资料Word格式文档下载.docx(10页珍藏版)》请在冰点文库上搜索。
6.1.3.ExtendedTimestamp
[plain]viewplaincopyprint?
1Thisfieldistransmittedonlywhenthenormaltimestampinthe
2chunkmessageheaderissetto0x00ffffff.Ifnormaltimestampis
3settoanyvaluelessthan0x00ffffff,thisfieldMUSTNOTbe
4present.ThisfieldMUSTNOTbepresentifthetimestampfieldisnot
5present.<
spanstyle="
color:
rgb(255,0,0);
"
>
Type3chunksMUSTNOThavethisfield.<
/span>
Thisfieldistransmittedonlywhenthenormaltimestampinthe
chunkmessageheaderissetto0x00ffffff.Ifnormaltimestampis
settoanyvaluelessthan0x00ffffff,thisfieldMUSTNOTbe
present.ThisfieldMUSTNOTbepresentifthetimestampfieldisnot
present.Type3chunksMUSTNOThavethisfield.
有可能是adobe变更了这个协议,也就是说,FMLE给FMS,FMS给flash-player,都是带这个时间戳的。
收包时,服务器端则需要检测下,若接下来的4字节不是extendedtimestamp,那么就忽略就好了。
发包时,只能采取配置,要么发,要么不发。
默认发就好了。
看nginx-rtmp代码:
[cpp]viewplaincopyprint?
6ngx_rtmp_recv(ngx_event_t*rev)
7{
8for(;
;
){
9/*parseheaders*/
10if(b->
pos==b->
start){
11/*chunkbasicheader*/
12fmt=(*p>
6)&
0x03;
13csid=*p++&
0x3f;
14if(fmt<
=2){
15/*timestamp:
big-endian3b->
little-endian4b*/
16pp=(u_char*)timestamp;
17ext=(timestamp==0x00ffffff);
18if(fmt<
=1){
19/*size:
little-endian4btype*/
20pp=(u_char*)&
h->
mlen;
21h->
type=*(uint8_t*)p++;
22if(fmt==0){
23/*stream:
little-endian4b->
24pp=(u_char*)&
msid;
25}
26}
27}
28/*extendedheader*/
29if(ext){
30pp=(u_char*)timestamp;
31pp[3]=*p++;
32pp[2]=*p++;
33pp[1]=*p++;
34pp[0]=*p++;
35}
ngx_rtmp_recv(ngx_event_t*rev)
{
for(;
){
/*parseheaders*/
if(b->
start){
/*chunkbasicheader*/
fmt=(*p>
csid=*p++&
if(fmt<
=2){
/*timestamp:
little-endian4b*/
pp=(u_char*)timestamp;
ext=(timestamp==0x00ffffff);
=1){
/*size:
little-endian4btype*/
pp=(u_char*)&
h->
if(fmt==0){
/*stream:
}
/*extendedheader*/
if(ext){
pp[3]=*p++;
pp[2]=*p++;
pp[1]=*p++;
pp[0]=*p++;
可见,不管是什么chunk,只要有extended-timestamp,nginx-rtmp都会读这个。
所以nginx-rtmp对接FMLE是没有问题的,对接librtmp有问题。
更好的做法是判断下读出来的extendedtimestamp是否是和之前的一样,如果不是一样说明没有发,就忽略。
nginx-rtmp发包的逻辑:
36ngx_rtmp_prepare_message
37{
38/*createfmt3headerforsuccessivefragments*/
39thsize=p-out->
buf->
pos;
40ngx_memcpy(th,out->
pos,thsize);
41th[0]|=0xc0;
42/*messageheader*/
43if(fmt<
=2){
44}
45
46/*extendedheader*/
47if(ext_timestamp){
48pp=(u_char*)&
ext_timestamp;
49*p++=pp[3];
50*p++=pp[2];
51*p++=pp[1];
52*p++=pp[0];
53
54/*ThisCONTRADICTSthestandard
55*butthat'
sthewayflashclient
56*wantsdatatobeencoded;
57*ffmpegcomplains*/
58if(cscf->
play_time_fix){
59ngx_memcpy(&
th[thsize],p-4,4);
60thsize+=4;
61}
62}
ngx_rtmp_prepare_message
/*createfmt3headerforsuccessivefragments*/
thsize=p-out->
ngx_memcpy(th,out->
th[0]|=0xc0;
/*messageheader*/
=2){
if(ext_timestamp){
*p++=pp[3];
*p++=pp[2];
*p++=pp[1];
*p++=pp[0];
/*ThisCONTRADICTSthestandard
*butthat'
sthewayflashclient
*wantsdatatobeencoded;
*ffmpegcomplains*/
if(cscf->
play_time_fix){
ngx_memcpy(&
thsize+=4;
nginx-rtmp还特意说明了flash客户端就是和rtmp规范不一样。
out->
pos就是指向包的第一个chunk,若有extended-timestamp,那么肯定会在第一个包加上extendedtimestamp;
后面还有个th和thsize,就是给后续的type=3的chunk包的,会加上这4字节的extendedtimestamp:
63/*ThisCONTRADICTSthestandard
64*butthat'
65*wantsdatatobeencoded;
66*ffmpegcomplains*/
67if(cscf->
68ngx_memcpy(&
69thsize+=4;
70}
71
72/*appendheaderstosuccessivefragments*/
73for(out=out->
next;
out;
out=out->
next){
74out->
pos-=thsize;
75ngx_memcpy(out->
pos,th,thsize);
76}
/*appendheaderstosuccessivefragments*/
for(out=out->
next){
out->
ngx_memcpy(out->
所以nginx-rtmp收发包都是需要这个extended-timestamp,对于chunktype为3的包。
另外,把chunksize设置大一点,最大是65536,避免发type=3的chunk包,也是一个很好的方法。
不过视频的I帧一般较大,超过64KB也有可能。
Themaximumchunksizecanbe65536bytesandminimum128bytes.
按照这种规则,即type=3的chunk也发extended-timestamp,是没有问题:
FMLE一直没有断开,客户端也没有断开。
服务器端是srs(simplertmpserver),也没有断开:
时间已经超过了24位,使用extended-timestamp:
77(gdb)p/x21039918
78$1=0x1410b2e
(gdb)p/x21039918
$1=0x1410b2e
而nginx呢,是采用第一个包发完全的extended-timestamp,但是后续都是发type=1的chunk,即时间戳差值。
完毕。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- librtmp 使用 扩展 时间 服务器 连接 断开 解释 资料