和直播一樣,短視頻想要做到“秒播”,不僅僅是要在短視頻小程序源碼上做優(yōu)化,還要在服務(wù)器上做優(yōu)化。移動(dòng)設(shè)備的視頻播放器是通過(guò)某個(gè)視頻url域名,通過(guò)DNS服務(wù)請(qǐng)求到IP地址,通過(guò)這個(gè)IP地址與視頻服務(wù)器建立TCP鏈接,在連接之上建立http協(xié)議,最終請(qǐng)求到數(shù)據(jù),通過(guò)播放器進(jìn)行解析,用戶看到畫面聽到聲音,一個(gè)短視頻的起播流程就結(jié)束了。
那么從這個(gè)起播過(guò)程入手,可以對(duì)以下環(huán)節(jié)做優(yōu)化:
一、域名解析
耗時(shí)原因:DNS請(qǐng)求包會(huì)先發(fā)到本地DNS服務(wù)器,如果查不到,會(huì)遞歸到根域名服務(wù)器,這個(gè)過(guò)程是比較耗時(shí)的。如果請(qǐng)求過(guò)了,或者期間有其他方請(qǐng)求過(guò)相同的域名,那域名服務(wù)器就會(huì)有緩存,再次請(qǐng)求的時(shí)候就很快了;但是一般緩存的周期很短,需要有人不停地請(qǐng)求才能保持更新,所以具有很大的不確定性。
解決方案:1、注意請(qǐng)求使用的IP協(xié)議版本,不管是直播還是短視頻,做播放的肯定都繞不過(guò)ffmpeg,在ffmpeg里為了兼容性,DNS請(qǐng)求的IP協(xié)議版本設(shè)置為AF_UNSPEC,這樣在請(qǐng)求的時(shí)候會(huì)先請(qǐng)求IPv6的地址,如果沒(méi)有再請(qǐng)求IPv4的地址,是很保險(xiǎn),但是在實(shí)際的項(xiàng)目中,沒(méi)有IPv6的地址,造成一直遞歸到根域名服務(wù)器也查不到IPv6地址,極大的浪費(fèi)了時(shí)間,可以使用AF_INET指定請(qǐng)求IPv4地址,節(jié)省一半以上的時(shí)間,首次請(qǐng)求或緩存過(guò)期后請(qǐng)求,耗時(shí)大概在大幾十毫秒到100毫秒左右。
2、預(yù)置或預(yù)解析域名IP地址,對(duì)于實(shí)現(xiàn)秒內(nèi)播放來(lái)說(shuō),100毫秒還是很大一筆時(shí)間,這個(gè)方案就是提前把域名解析出來(lái),這個(gè)方案就是提前把域名解析出來(lái),用的時(shí)候直接使用IP地址。但是這種方案有局限性,可能適合特定的音視頻直播,對(duì)于短視頻播放地址比較多樣來(lái)說(shuō)操作起來(lái)有一定難度,而且還存在CP切流和更換接入CP的情況。
二、Socket buffer
耗時(shí)原因:TCP connection在客戶端的具體操作中基本都是通過(guò)socket實(shí)現(xiàn)的。在socket中有一個(gè)緩沖區(qū)的概念,發(fā)送端先把數(shù)據(jù)寫到緩沖區(qū),接收端數(shù)據(jù)也是先經(jīng)過(guò)緩沖區(qū),再?gòu)木彌_區(qū)讀出,移動(dòng)設(shè)備作為接收端,接收端緩沖區(qū)設(shè)置的太小,影響效率,接收端緩沖區(qū)設(shè)置的太大,會(huì)短時(shí)間內(nèi)消耗帶寬,如果帶寬不夠會(huì)引起網(wǎng)絡(luò)傳輸問(wèn)題,還會(huì)造成流量的浪費(fèi)。這些都會(huì)影響首屏數(shù)據(jù)的及時(shí)送達(dá)。
解決方案:根據(jù)實(shí)際情況調(diào)整接收端緩沖區(qū)大小,通過(guò)計(jì)算和測(cè)試數(shù)據(jù)得到一個(gè)比較合理的值??梢栽趂fmpeg的network和tcp里進(jìn)行調(diào)整,這是比較低層的修改了,為了通用性可以擴(kuò)展http/tcp的選項(xiàng)并通過(guò)ffmpeg提供的AVDictionary機(jī)制在avformat API這一層進(jìn)行透?jìng)飨嚓P(guān)設(shè)置參數(shù)。
三、Probe buffer
耗時(shí)原因:播放端一開始并不能得到要播放的視頻的相關(guān)信息,比如封裝格式、分辨率,音視頻編碼等信息,需要先讀一段數(shù)據(jù)進(jìn)來(lái),再對(duì)這段數(shù)據(jù)進(jìn)行探測(cè),從而得出相應(yīng)的信息。而存放這段探測(cè)數(shù)據(jù)需要一個(gè)buffer,這個(gè)buffer若設(shè)置的太小可能導(dǎo)致分析不出信息導(dǎo)致重新探測(cè),但是若設(shè)置的太大就會(huì)增加收流的時(shí)間從而影響了首屏的播放,所以太小太大都會(huì)引起延遲。
解決方案:根據(jù)實(shí)際情況調(diào)整這個(gè)buffer,通過(guò)計(jì)算和測(cè)試數(shù)據(jù)得到一個(gè)比較合理的值。可以通過(guò)ffmpeg的AVFormatContext結(jié)構(gòu)體的probesize和max_analy_duration把對(duì)buffer的限制透?jìng)飨氯ァ?/span>
以上就是讓短視頻做到”秒播”的一些解決方案,由于篇幅的原因,剩余的幾個(gè)方面我們留到下期再說(shuō)。
聯(lián)系客服