临汾山东漯河饰品美体美文
投稿投诉
美文创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品
漯河衢州
兴义眉山
桂林阳泉
玉溪简阳
山东遂宁
永城新余
梧州洛阳
泸州温州
临汾清远
营口常熟
浙江大连
桐乡宜昌

ijkplayer基于rtsp直播延时的深度优化

6月22日 倾城傷投稿
  现在ijkPlayer是许多播放器、直播平台的首选,相信很多开发者都接触过ijkPlayer,无论是Android工程师还是iOS工程师。我曾经在Github上的ijkPlayer开源项目上提问过:视频流为1080P、30fps,如何优化RTSP直播的延时为大约100ms呢?发现大家对RTSP直播延时优化非常感兴趣,纷纷提问或者给出自己的观点。本文主要是总结,也是与大家探讨RTSP直播的延时优化。
  目录
  一、修改编译脚本支持RTSP
  二、修改播放器的option参数
  三、网络抖动的丢包
  四、解码器设为零延时
  五、减少FFmpeg拆帧等待延时
  1、找到当前帧结束符
  2、去掉parsepacket的while循环
  3、修改avparserparse2的帧偏移量
  4、去掉parserparse的寻找帧起始码
  5、修改parser。c的组帧方法一、修改编译脚本支持RTSP
  ijkPlayer默认是没有把RTSP协议编译进去,所以我们得修改编译脚本,原来的disable改为enable:exportCOMMONFFCFGFLAGSCOMMONFFCFGFLAGSenableprotocolrtpexportCOMMONFFCFGFLAGSCOMMONFFCFGFLAGSenableprotocoltcpexportCOMMONFFCFGFLAGSCOMMONFFCFGFLAGSenabledemuxerrtspexportCOMMONFFCFGFLAGSCOMMONFFCFGFLAGSenabledemuxersdpexportCOMMONFFCFGFLAGSCOMMONFFCFGFLAGSenabledemuxerrtp
  二、修改播放器的option参数丢帧阈值mediaPlayer。setOption(IjkMediaPlayer。OPTCATEGORYPLAYER,framedrop,30);视频帧率mediaPlayer。setOption(IjkMediaPlayer。OPTCATEGORYPLAYER,fps,30);环路滤波mediaPlayer。setOption(IjkMediaPlayer。OPTCATEGORYCODEC,skiploopfilter,48);设置无packet缓存mediaPlayer。setOption(IjkMediaPlayer。OPTCATEGORYPLAYER,packetbuffering,0);mediaPlayer。setOption(IjkMediaPlayer。OPTCATEGORYFORMAT,fflags,nobuffer);不限制拉流缓存大小mediaPlayer。setOption(IjkMediaPlayer。OPTCATEGORYPLAYER,infbuf,1);设置最大缓存数量mediaPlayer。setOption(IjkMediaPlayer。OPTCATEGORYFORMAT,maxbuffersize,1024);设置最小解码帧数mediaPlayer。setOption(IjkMediaPlayer。OPTCATEGORYPLAYER,minframes,3);启动预加载mediaPlayer。setOption(IjkMediaPlayer。OPTCATEGORYPLAYER,startonprepared,1);设置探测包数量mediaPlayer。setOption(IjkMediaPlayer。OPTCATEGORYFORMAT,probsize,4096);设置分析流时长mediaPlayer。setOption(IjkMediaPlayer。OPTCATEGORYFORMAT,analyzeduration,2000000);
  值得注意的是,ijkPlayer默认使用udp拉流,因为速度比较快。如果需要可靠且减少丢包,可以改为tcp协议:mediaPlayer。setOption(IjkMediaPlayer。OPTCATEGORYFORMAT,rtsptransport,tcp);
  另外,可以这样开启硬解码,如果打开硬解码失败,再自动切换到软解码:mediaPlayer。setOption(IjkMediaPlayer。OPTCATEGORYPLAYER,mediacodec,0);mediaPlayer。setOption(IjkMediaPlayer。OPTCATEGORYPLAYER,mediacodecautorotate,0);mediaPlayer。setOption(IjkMediaPlayer。OPTCATEGORYPLAYER,mediacodechandleresolutionchange,0);
  三、网络抖动的丢包
  在拉流时,音频流、视频流是单独保存到缓冲队列的。如果发生网络抖动,就会引起缓冲抖动(JitBuffer),可以总结为网络卡顿导致音视频缓冲队列增大,从而导致解码滞后、播放滞后。此时,我们需要主动丢包来跟进当前时间戳。因为音视频同步一般以音频时钟为基准,人们对音频更加敏感,所以我们优先丢掉视频队列的包。但是,丢视频数据包时,需要丢掉整个GOP的数据包,因为B帧、P帧依赖I帧来解码,否则会引起花屏。有一位开发者叫做暴走大牙,他的一篇关于ijkPlayer直播延时的文章写得很好:ijkplay播放直播流延时控制小结
  四、解码器设为零延时
  大家应该听过编码器的零延时(zerolatency),但可能没听过解码器零延时。其实解码器内部默认会缓存几帧数据,用于后续关联帧的解码,大概是35帧。经过反复测试,发现解码器的缓存帧会带来100多ms延时。也就是说,假如能够去掉缓存帧,就可以减少100多ms的延时。而在avcodec。h文件的AVCodecContext结构体有一个参数(flags)用来设置解码器延时:typedefstructAVCodecContext{。。。。。。。。。。。。}
  为了去掉解码器缓存帧,我们可以把flags设置为CODECFLAGLOWDELAY。在初始化解码器时进行设置:setdecoderaslowdedaycodecctxflagsCODECFLAGLOWDELAY;
  【免费分享】音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(CC,Linux,FFmpegwebRTCrtmphlsrtspffplaysrs等等)有需要的可以后台私信扣1免费领取
  五、减少FFmpeg拆帧等待延时
  FFmpeg拆帧是根据下一帧的起始码来作为当前帧结束符,起始码一般是:0x000x000x000x01或者0x000x000x01。这样就会带来一帧的延时,这一帧延时能不能去掉呢?如果有帧结束符,我们以帧结束符来拆帧,这样做就能解决一帧延时。现在,问题变成找到帧结束符,然后替换成下一帧起始码来拆帧。整个调用流程是:readframereadframeinternalparsepacketavparserparse2parserparseffcombineframe。流程图如下:
  1、找到当前帧结束符
  在rtpdec。c文件的rtpparsepacketinternal方法里,有获取帧结束符,也就是mark标志位,我们在这里设一个全局变量:staticintrtpparsepacketinternal(RTPDemuxContexts,AVPacketpkt,constuint8tbuf,intlen){。。。。。。if(buf〔1〕0x80)flagsRTPFLAGMARKER;。。。。。。}
  2、去掉parsepacket的while循环
  我们在外部调用libavformat模块的utils。c文件的readframe读取一帧数据,而readframe调用内部方法readframeinternal,readframeinternal接着调用parsepacket方法,在该方法里有一个while循环体。现在把循环体去掉,并且释放申请的内存:staticintparsepacket(AVFormatContexts,AVPacketpkt,intstreamindex){。。。。。。while(size0(pktflushpktgotoutput)){int64int64avinitpacket(outpkt);lenavparserparse2(stparser,stinternalavctx,outpkt。data,outpkt。size,data,size,pktpts,pktdts,pktpos);pktptspktdtsAVNOPTSVALUE;pktpos1;gotoutput!!outpkt。if(!outpkt。size){avpacketunref(outpkt);releasecurrentpacketavpacketunref(pkt);releasecurrentpacketreturn0;}。。。。。。retaddtopktbuf(sinternalparsequeue,outpkt,sinternalparsequeueend,1);avpacketunref(outpkt);if(ret0)}endofthestreamcloseandfreetheparserif(pktflushpkt){avparserclose(stparser);stparserNULL;}fail:avpacketunref(pkt);}
  3、修改avparserparse2的帧偏移量
  在libavcodec模块的parser。c文件中,parsepacket调用到avparserparse2来解释数据包,该方法内部有记录帧偏移量。原先是等待下一帧的起始码,现在改为当前帧结束符,所以要把下一帧起始码这个偏移量长度去掉:intavparserparse2(AVCodecParserContexts,AVCodecContextavctx,uint8tpoutbuf,intpoutbufsize,constuint8tbuf,intbufsize,int64tpts,int64tdts,int64tpos){。。。。。。WARNING:thereturnedindexcanbenegativeindexsparserparserparse(s,avctx,(constuint8t)poutbuf,poutbufsize,buf,bufsize);avassert0(index0x20000000);TheAPIdoesnotallowreturningAVERRORcodesdefineFILL(name)if(sname0avctxname0)avctxnamesnameif(avctxcodectypeAVMEDIATYPEVIDEO){FILL(fieldorder);}updatethefilepointerif(poutbufsize){videoframedontplusindexif(avctxcodectypeAVMEDIATYPEVIDEO){}else{}sfetchtimestamp1;}if(index0)index0;}
  4、去掉parserparse的寻找帧起始码
  avparserparse2调用到parserparse方法,而我们这里使用的是h264解码,所以在libavcodec模块的h264parser。c有一个结构体ffh264parser,把h264parse赋值给parserparse:AVCodecParserffh264parser{。codecids{AVCODECIDH264},。privdatasizesizeof(H264ParseContext),。parserinitinit,。parserparseh264parse,。parsercloseh264close,。splith264split,};
  现在我们需要h264parser。c文件的h264parse方法,去掉寻找下一帧起始码作为当前帧结束符的过程:staticinth264parse(AVCodecParserContexts,AVCodecContextavctx,constuint8tpoutbuf,intpoutbufsize,constuint8tbuf,intbufsize){。。。。。。if(sflagsPARSERFLAGCOMPLETEFRAMES){}else{TODO:dontusenextframestartcode,modifybyxufulongnexth264findframeend(p,buf,bufsize,avctx);if(ffcombineframe(pc,next,buf,bufsize)0){poutbufNULL;poutbufsize0;}if(next0next!ENDNOTFOUND){avassert1(pclastindexnext0);h264findframeend(p,pcbuffer〔pclastindexnext〕,next,avctx);updatestate}}。。。。。。}5、修改parser。c的组帧方法
  h264parse又调用parser。c的ffcombineframe组帧方法,我们在这里把mark替换起始码作为帧结束符:引用全局变量intffcombineframe(ParseContextpc,intnext,constuint8tbuf,intbufsize){。。。。。。copyintobufferendreturnif(nextENDNOTFOUND){voidnewbufferavfastrealloc(pcbuffer,pcbuffersize,bufsizepcindexAVINPUTBUFFERPADDINGSIZE);if(!newbuffer){pcindex0;returnAVERROR(ENOMEM);}memcpy(pcbuffer〔pcindex〕,buf,bufsize);return1;if(!markflag)return1;next0;}。。。。。。}
  经过以上修改,局域网用电脑推送1080P、30fps的视频流,Android设备拉流解码播放,整体延时可优化至130ms左右。而手机推流,延时可达到86ms。
  作者:徐福记456
  原文链接:https:blog。csdn。netu011686167articledetails85256101?spm1001。2014。3001。5502
投诉 评论

少年歌行落明轩多天才?无心入魔比肩无双剑仙,他靠仙人六博刘学义、李宏毅主演的武侠剧《少年歌行》已经更新到了30集,新的剧情中发生了三件大事,其一就是白王的眼睛可以治疗了,这对于萧瑟来说无疑是一个大威胁,毕竟白王恢复眼睛,萧瑟和萧羽都……ijkplayer基于rtsp直播延时的深度优化现在ijkPlayer是许多播放器、直播平台的首选,相信很多开发者都接触过ijkPlayer,无论是Android工程师还是iOS工程师。我曾经在Github上的ijkPlay……就喜欢辣目洋子这种身材,就算胖的都没脚腕了,但却没有什么赘肉哈喽,大家好,我是biu时尚,很高兴又和大家分享明星时尚与搭配技巧!希望我的文章让你对时尚更加的感兴趣,让本身就好看的你,更加的有魅力!不同身材的女孩子会选择的服装也是不……朱小伟二婚被嘲,陈萌紧锁眉头疑似不满众所周知,朱小伟是大陆歌手朱之文(大衣哥)的儿子,今年22岁,经历过一段失败的婚姻,从结婚到离婚仅仅用了一年的时间。他的第一次婚姻还得从2020年说起,在2020年国庆节……融资月报中国机器人行业12月融资事件盘点PART01投融资事件情况概览2022。12中国机器人行业据机器人大讲堂立德智库不完全统计,2022年12月,中国机器人行业共发生32起重要投融资事件,……黑色丝袜搭配长靴,冬季里的搭配很简单,穿出个性也不难到了冬季,依旧有一些美女出门逛街,她们也很会搭配,穿搭也简单一些,黑色丝袜搭配过膝靴,也是不少美女喜欢的风格,这位美女选择黑的过膝靴,真皮的款式,显得身材很好,也穿搭出自信的感……地产文旅,华侨城遭受双重考验今年五一的旅游市场,不出意外地格外冷清。各地景区的客流量相对往年都有大幅降低,西安兵马俑景区的导游称,今年五一的游客还没兵马俑多,三亚酒店的平均入住率仅为20。57,行情……企业海外参展需求复苏,展览公司接单忙视频加载中。。。(央视财经《天下财经》)参加境外展会是外贸企业开拓国际市场的重要渠道。近段时间,随着防疫政策逐步优化调整,组织外贸企业参加境外展会的专业服务机构重新忙碌起……这两味药煮水喝,可治腰疼腿疼胳膊疼颈椎疼肩膀疼大家好,我是中医骨病科阎医生。天气一冷,来找我看病的老人明显多了起来。大多数都是本身就有风湿关节炎,经冷风一吹,关节疼痛、肿胀的问题就进一步加重了。《黄帝内经》中这……易梦玲费加罗十二月刊封面,穿白色深V吊带裙性感美艳,身材好辣头条创作挑战赛易梦玲费加罗十二月刊封面释出,之前赵露思也拍过这个系列的封面,这次易梦玲的又出来了,感觉比起赵露思的易梦玲的好像更性感美艳一些。赵露思的之前也写过,大家感兴……浙江的网红镇是怎样打造的?近年来,浙江知名度高、曝光率高的村庄越来越多,在全国乡村建设热潮中形成了独特的网红现象。这些村庄通过挖掘特色、科学规划、众筹资金、网络营销等方式,走出了一条收获颇丰的网红之路,……11月PMI深蹲之后,应是起跳经济周期动态追踪系列之55本文原载于经济机器公众号(ID:EconomicMachine),转载请注明出处。今日,11月份PMI数据出炉。制造业PMI录得48,读数……
他是NBA隐藏最深的时间管理大师,杰伦布朗那些鲜为人知的故事NBA的时间管理大师有多少?杰伦布朗绝对是隐藏最深的一个。同样信奉斋月文化的欧文,如果有他一半的睿智,那就可以普度众生了!杰伦布朗接受采访布朗的场外时间总安排的滴水……360又立功!西北工业大学遭美国国安局网络攻击,已被掌握证据如果你再说360是流氓,我第一个不同意!2016年,360放弃93亿美元市值,毅然从美国退市,尽管回到A股用了两年半的时间,但这一切都是值得的。据央视新闻网消息,西……滦南供电能源清洁发展振兴乡村经济我们这里是利用沼气发电,越是节假日的时候越要加强值班,不过有你们来检查一下我就放心多了当大家都沉浸在国庆假期的欢庆之时,滦南县扒齿港镇富瑞慈新能源科技有限公司的发电机组仍在隆隆……预算两三千,还想要高画质,TCLV8G与海信E5H谁更值得买最近计划换一台新电视,所以想好好做做功课,毕竟一换就是几年,得精心选择一番才行。经过大家的推荐我发现大家选电视机关注的都是分区背光、色准、低蓝光护眼、价格这几个方面。经过最终的……俗话人到七十古来稀,70岁后如何养生延寿?6个细节要重视古时有句话叫作人到七十古来稀,那时人们的生活条件和医疗水平都很低,活到七十岁的人很少见,能活到的人都是人们眼中的长寿老人了。可是到现在人们的平均寿命都到了83。6岁,七十岁的老……巴音布鲁克太阳祭坛巴音布鲁克草原我是去过多次的,让我久久难以忘怀的,是绿草茵茵的草地,如梦如幻的九曲十八弯,如诗如画的皑皑雪山,颇感震撼的太阳祭坛。每次去,我都喜欢独行。一个人,远离人群,……中国信通院Q3申请进网检测手机产品126款,5G手机款型占比IT之家12月28日消息,中国信通院今日发布报告称,2022年第三季度,我国手机市场中5G手机产品继续呈现稳定发展态势;4G手机产品款型数略有回落,4G手机频率特征变化不大,4……5种富含胆碱的植物性食物,这是一种保持大脑健康的关键营养物质胆碱是一种重要的必需营养素,因其对认知和大脑健康的益处而闻名,通常与动物性食物有关蛋黄就是第一大类。胆碱是一种重要的营养物质和水溶性化合物,虽然它在技术上不被归类为维生素……秋天吃柚子真不错!吃完柚子别扔皮,还有妙用金秋时节,又闻到柚子的芬芳,小二也喜欢在饭后来一瓣柚子,消食解腻。柚子属于柑橘类水果,现代营养学研究发现,其中含有多种有益于人体健康的物质。都说柚子好,究竟好在哪里……国足对手大名单公布,已成头球队,国足头球却失传日本足协近日公布了2022年6月的4场麒麟杯比赛大名单,高大强壮的186CM球员伊藤洋辉首次入选日本国足。此外,身高188CM的富安健洋、184CM的镰田大地、189CM的吉田……你要让别人觉得不好惹大家对伙房有意见,可以单独给我说。谁要是继续在这里嚷嚷,就是骂我呢!一个月前的一次早会上,一位退役人员,因对伙房里的饭菜不满,一直鼓动大家去闹事。办公室主任听到后,……把握现在,珍惜当下,防患未然人在不幸时最明白。平常你好我好大家好,吃肉,喝酒,恩爱有加,情同手足。而一旦到倒霉情况下,就会有些人坐视不理,看着你嘲笑,有些人过河拆桥,乘火打劫。于是便明白了哪位是真朋友,哪……

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找