音视频播放卡顿问题解决:上行推流与抖动缓冲播放质量优化技巧

做直播或者在线点播的时候,你肯定碰到过观众说画面卡、声音断断续续的情况。这边主播明明网络看着没问题,那边观众就是刷不出来,要么加载半天出不来,要么放着放着突然卡住转圈。很多人第一反应就是怪观众网速太慢,或者服务器带宽不够,其实大部分时候,问题出在上行推流或者播放端的抖动缓冲没调好。

先说说上行推流这块,这是整个音视频链路的起点,起点出问题,后面再怎么调都救不回来。很多主播或者中小型平台,推流的时候只看总带宽够不够,忽略了网络波动的影响。比如你用普通家用网推流,哪怕办了100M的宽带,高峰期也会突然掉几兆的带宽,或者出现延迟抖动,本来一秒要发出去的数据,卡了半秒才到服务器,后面的数据包就堆在一起了,到播放端肯定乱。

想要优化上行推流,首先要做的是自适应码率调整。别固定死一个推流码率,现在很多推流工具都支持动态根据当前网络状况改码率。比如你本来计划用4Mbps推1080P,网络突然变差,就自动降到2Mbps推720P,网络恢复了再升回去,这样不会直接因为一两秒的网络抖动断流,观众那边顶多稍微模糊一点,总比卡住强。

然后推流的时候要选合适的GOP大小,也就是关键帧间隔。很多人为了省带宽,把GOP设得特别大,比如10秒才出一个关键帧,这样看起来码率确实低了,但如果中间丢包,播放端要等下一个关键帧才能恢复画面,一卡就是好几秒。一般来说,GOP设成2秒到3秒就刚好,既不会占太多额外带宽,丢包之后恢复也快。

还有不少人忽略了推流协议的选择。现在常用的就那几种,RTMP、RTSP、WebRTC,很多人不管什么场景都用RTMP,其实RTMP本身对丢包的处理不好,如果你是移动端推流,网络波动大,不如试试用基于UDP的RTC协议推流,延迟更低,丢包重传也更快,不容易卡。当然如果是普通的娱乐直播,RTMP也够用,重点还是要开推流端的抖动平滑处理,把突发的数据包先缓存一点点再发出去,避免一下子挤到服务器导致乱序。

说完了起点的推流,再说说播放端的抖动缓冲,这是直接影响观众播放体验的一步。哪怕推流和服务器都没问题,网络本身就有延迟抖动,不可能每一个数据包都准点到达播放端。抖动缓冲就是用来存这些先到的数据,等攒够了再送给解码器播放,缓冲设得太小,容易没等到数据就空了,播放就卡;设得太大,延迟又会变高,直播的时候评论都刷出来十分钟了,画面才跟上,也不行。

很多人现在要么固定缓冲大小,要么一上来就给个好几秒的缓冲,其实现在都用动态抖动缓冲了。根据当前的网络抖动情况自动调整缓冲大小,比如网络很稳定,抖动只有十几毫秒,那就把缓冲降到几百毫秒,延迟低体验好;如果网络波动大,抖动到了几百毫秒,就自动把缓冲拉大到一两秒,避免空缓冲卡顿。你看那些做低延迟直播的平台,基本都是用动态缓冲,既能保证不卡,又不会延迟太高。

还有一个容易忽略的点,就是乱序包的处理。因为网络传输的时候,先走的数据包可能反而后到,要是直接把乱序的包送给解码器,要么直接花屏,要么就卡住等迟到的包。好的处理方式是在抖动缓冲里给包排序,留出一点点窗口给迟到的包,只要不是迟到太久,排好序再给解码器,就不会卡。要是包真的丢了,也别直接卡住等重传,对于直播场景,可以直接丢掉丢包的那一小帧,用前一帧代替,或者做错误隐藏,观众几乎看不出来差别,总比卡住几秒钟等重传好。

对于点播来说,其实也有抖动缓冲的优化空间。很多人看在线视频,拖动进度条之后半天出不来画面,就是因为缓冲策略不对。拖动进度条之后,不需要一下子把整段都缓冲下来,先只缓冲接下来几秒钟的数据,快速出画面,然后再后台慢慢缓冲后面的内容,这样体验比等个十几秒再出画面好太多。

还有一些细节优化,不管是推流还是播放,都可以用上。比如错链重试,推流的时候如果临时断了,能自动重连,不用主播手动重启推流;播放的时候如果当前CDN节点卡,能自动切到低延迟的备用节点,观众都感觉不出来切换。另外码率适配也要做在播放端,播放器根据观众当前的下载速度自动切清晰度,别让用户自己选,用户哪知道自己现在网速够不够4K,自动切比手动选体验好太多。

我之前碰到过一个做企业内训直播的客户,一开始他们固定推流码率,用的是10M的固定码率,很多讲师在公司会议室用Wifi推流,一到多人连网的时候就卡,直播间一半人都说看不了。后来改了自适应码率,把GOP从10秒改成2秒,推流协议换成了带抖动平滑的RTC,上行卡顿直接少了80%。然后播放端原来固定3秒缓冲,改成动态缓冲,最低能到500毫秒,最高不超过2秒,既解决了卡顿,延迟也从原来的四五秒降到了1秒多,观众反馈一下子就好起来了。

其实音视频卡顿不是什么没法解决的大问题,大部分时候都不是带宽不够,而是细节没调好。从起点的上行推流控制码率、选对协议、调好关键帧,再到播放端动态调整抖动缓冲,处理好乱序丢包,每一步做好,就能解决绝大多数卡顿问题。不用一开始就砸钱升带宽升服务器,先把这些参数调对,就能省下不少成本,还能获得更好的播放体验。

音视频卡顿,上行推流优化,抖动缓冲,播放质量优化,音视频推流,推流码率,关键帧间隔,动态抖动缓冲,丢包处理,音视频播放

[Q]:音视频播放卡顿一定是观众网速太慢导致的吗?
[A]:不一定,大部分卡顿问题其实出在上行推流设置不当或者播放端抖动缓冲参数不合理,网络带宽不足只是原因之一。
[Q]:上行推流怎么优化能减少后续播放卡顿?
[A]:可以开启自适应码率,根据实时网络动态调整输出码率;把GOP(关键帧间隔)设置在2-3秒,丢包后能快速恢复画面;根据场景选择合适的推流协议,同时开启推流端抖动平滑处理。
[Q]:GOP太大为什么会导致播放卡顿?
[A]:GOP太大意味着关键帧间隔久,如果传输中出现丢包,播放端需要等到下一个关键帧才能恢复正常画面,卡顿时间会被拉长,严重影响观看体验。
[Q]:推流协议选哪个能减少卡顿?
[A]:如果是移动端推流、网络波动大的场景,优先选基于UDP的RTC协议,它丢包重传更快、延迟更低;普通娱乐直播用RTMP也可以满足需求。
[Q]:抖动缓冲到底是什么,为什么能影响播放质量?
[A]:抖动缓冲是播放端用来缓存还没播放的数据包,应对网络延迟波动的模块。它能等迟到的数据包到齐再播放,避免没数据可播导致的卡顿。
[Q]:抖动缓冲是不是设置越大越好?
[A]:不是,缓冲太大虽然不容易空缓冲卡顿,但会导致播放延迟变高,直播场景会出现评论和画面不同步的问题,目前更推荐用动态抖动缓冲,根据网络状况自动调整大小。
[Q]:播放端遇到乱序数据包该怎么处理?
[A]:可以在抖动缓冲中预留一小段排序窗口,给迟到的数据包留出排序时间,排好序后再送给解码器解码,就能避免因为乱序导致的卡顿花屏。
[Q]:点播拖动进度条后卡顿怎么优化?
[A]:拖动进度条后不需要一次性缓冲整段视频,优先缓冲接下来几秒钟的内容,先快速出画面,再在后台慢慢缓冲后续内容,能大幅提升体验。
share