視頻播放卡頓是音視頻業(yè)務(wù)里一個(gè)常見的問題,引起視頻播放卡頓的主要原因通常包括:
- 網(wǎng)絡(luò)帶寬速度不夠特咆,造成音視頻數(shù)據(jù)無法及時(shí)完成下載季惩。
- 設(shè)備解碼性能不足录粱,造成音視頻數(shù)據(jù)無法及時(shí)完成解碼或渲染。
基于這些原因画拾,我們可以考慮下面的方案來對(duì)播放過程中的卡頓進(jìn)行優(yōu)化啥繁。
使用 HTTPDNS 優(yōu)化網(wǎng)絡(luò)連接
在現(xiàn)在的網(wǎng)絡(luò)視頻播放場(chǎng)景中,對(duì)視頻資源的訪問通常都要經(jīng)過 CDN 網(wǎng)絡(luò)進(jìn)行內(nèi)容分發(fā)和調(diào)度青抛。如果 CDN 線路質(zhì)量不好旗闽,那么久很可能造成播放時(shí)音視頻數(shù)據(jù)下載的延遲,從而引起播放的卡頓蜜另。
這時(shí)候我們可以使用與 CDN 網(wǎng)絡(luò)配套的 HTTPDNS 服務(wù)适室。HTTPDNS 使用 HTTP 協(xié)議進(jìn)行域名解析,代替現(xiàn)有基于 UDP 的 DNS 協(xié)議举瑰,域名解析請(qǐng)求直接發(fā)送到相應(yīng)的 HTTPDNS 服務(wù)器捣辆,從而提供更優(yōu)的線路選擇。
以 iOS 上的 AVPlayer 為例此迅,當(dāng)使用 HTTPDNS 時(shí)汽畴,可以用視頻資源 URL 對(duì)應(yīng)的 Host 向 HTTPDNS 請(qǐng)求節(jié)點(diǎn) IP,然后用節(jié)點(diǎn) IP 替換 URL 中的 Host 部分邮屁,再在 HTTP Header 里設(shè)置原 Host整袁。這樣即可通過 IP 直連的方式訪問 HTTPDNS 返回的較優(yōu)節(jié)點(diǎn)。
示例代碼大致如下:
// 假設(shè)原視頻 URL 是:http://wwww.example.com/abc.mp4
// 假設(shè)從 HTTPDNS 服務(wù)獲取的 wwww.example.com 這個(gè) Host 對(duì)于的 IP 是:192.168.1.1
// 那么處理后的 URL 是:http://192.168.1.1/abc.mp4
NSMutableDictionary *headers = [NSMutableDictionary dictionary];
[headers setObject:@"wwww.example.com" forKey:@"Host"];
NSURL *videoURL = [NSURL URLWithString:@"http://192.168.1.1/abc.mp4"];
AVAsset *asset = [AVURLAsset URLAssetWithURL:videoURL options:@{@"AVURLAssetHTTPHeaderFieldsKey": headers}];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset];
AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
這種方案在使用 HTTPS 時(shí)佑吝,是會(huì)失敗的坐昙。因?yàn)?HTTPS 在證書驗(yàn)證的過程,會(huì)出現(xiàn) domain 不匹配導(dǎo)致 SSL/TLS 握手不成功芋忿。這時(shí)候的方案參考 HTTPS(含SNI)業(yè)務(wù)場(chǎng)景“IP直連”方案說明 和 iOS HTTPS SNI 業(yè)務(wù)場(chǎng)景“IP直連”方案說明炸客。
優(yōu)化緩沖策略
在點(diǎn)播場(chǎng)景下,為了減少播放過程中的卡頓戈钢,可以在緩沖一定的數(shù)據(jù)后再解碼播放痹仙。但是這樣,就會(huì)影響視頻的首屏播放速度殉了。
增大播放器的緩沖區(qū)开仰,使得每次下載時(shí)能夠加載足夠的數(shù)據(jù)再進(jìn)行播放,能夠降低播放過程中卡頓的頻次薪铜,但是這樣也會(huì)延長首屏播放速度以及每次卡頓后恢復(fù)播放的速度众弓。所以對(duì)于緩沖區(qū)的大小的設(shè)置,需要考慮卡頓和快速開播兩個(gè)因素隔箍,盡量取得平衡谓娃。
在 iOS 平臺(tái)上,使用系統(tǒng)的 AVPlayer 時(shí)蜒滩,屬性 automaticallyWaitsToMinimizeStalling
就是控制播放器緩沖策略的滨达。當(dāng)該值為 YES 時(shí)奶稠,AVPlayer 會(huì)努力嘗試延遲開始播放,加載足夠的數(shù)據(jù)來保證整個(gè)播放過程中盡量卡頓最少捡遍。這個(gè)接口在 iOS 10 及以上版本才開放锌订,在 iOS 10 之前的版本,在播放 HLS 這種流媒體視頻時(shí)画株,效果如同 automaticallyWaitsToMinimizeStalling
為 YES瀑志,播放基于文件的視頻資源,包括通過網(wǎng)絡(luò)傳輸?shù)木W(wǎng)絡(luò)視頻文件污秆,則效果如同 automaticallyWaitsToMinimizeStalling
為 NO。
支持硬解
對(duì)于清晰度較高的視頻昧甘,對(duì)于解碼的性能消耗也會(huì)較大良拼,如果設(shè)備的性能不足,則可能會(huì)造成解碼速度趕不上播放速度充边,從而造成卡頓庸推。在實(shí)際情況中,可以盡量選擇使用硬解浇冰,通過 GPU 來進(jìn)行解碼贬媒。
碼流切換
720P、1080P 等清晰度較高的碼流肘习,對(duì)于網(wǎng)速的要求以及設(shè)備性能的要求都會(huì)相對(duì)較高际乘,在發(fā)生卡頓的情況下,可以考慮將播放的視頻切換到較低清晰度的碼流漂佩,從而優(yōu)化網(wǎng)絡(luò)加載速度脖含,降低對(duì)設(shè)備性能的消耗,優(yōu)化視頻播放的卡頓投蝉。