短視頻的首屏秒開優化

點播的首屏秒開方案也可以先參考一下直播中的首屏加載優化

前置 metadata

播放器在網絡點播場景下去請求 MP4 視頻數據,需要先獲取到文件的 metadata,解析出該文件的編碼、幀率等信息后才能開始邊下邊播。如果 MP4 的 metadata 數據塊被編碼在文件尾部,這種情況會導致播放器只有下載完整個文件后才能成功解析并播放這個視頻。對于這種視頻,我們最好能夠在服務端將其重新編碼,將 metadata 數據塊轉移到靠近文件頭部的位置,保證播放器在線請求時能較快播放。比如 FFmpeg 的下列命令就可以支持這個操作:

ffmpeg -i bad.mp4 -movflags faststart good.mp4

優化 FFmpeg 的播放參數

基于 FFmpeg 實現的播放器,在播放視頻時都會調用到一個 avformat_find_stream_info (libavformat/utils.c) 函數,該函數的作用是讀取一定長度的碼流數據,來分析碼流的基本信息,為視頻中各個媒體流的 AVStream 結構體填充好相應的數據。這個函數中做了查找合適的解碼器、打開解碼器、讀取一定的音視頻幀數據、嘗試解碼音視頻幀等工作,基本上完成了解碼的整個流程。在不清楚視頻數據的格式又要做到較好的兼容性時,這個過程是比較耗時的,從而會影響到播放器首屏秒開。

在外部可以通過設置 probesizeanalyzeduration 兩個參數來控制該函數讀取的數據量大小和分析時長為比較小的值來降低 avformat_find_stream_info 的耗時,從而優化播放器首屏秒開。但是,需要注意的是這兩個參數設置過小時,可能會造成預讀數據不足,無法解析出碼流信息,從而導致播放失敗、無音頻或無視頻的情況。所以,在服務端對視頻格式進行標準化轉碼,從而確定視頻格式,進而再去推算 avformat_find_stream_info 分析碼流信息所兼容的最小的 probesizeanalyzeduration,就能在保證播放成功率的情況下最大限度地區優化首屏秒開。

在我們能控制視頻格式達到標準化后,我們可以直接修改 avformat_find_stream_info 的實現邏輯,針對該視頻格式做優化,進而優化首屏秒開。比如,你可以試試將函數中用到的一個變量 fps_analyze_framecount 初始化為 0 試試效果。

甚至,我們可以進一步直接去掉 avformat_find_stream_info 這個過程,自定義完成解碼環境初始化。參見:VLC優化(1) avformat_find_stream_info 接口延遲降低FFMPEG avformat_find_stream_info 替換

avformat_find_stream_info 代碼的分析,還可以看看這里:FFmpeg源代碼簡單分析:avformat_find_stream_info()

選擇合適的緩沖策略

在點播場景下,為了減少播放過程中的卡頓,通常會緩沖一定的數據后再解碼播放,這是一種播放策略。

為了加快首屏播放速度,也可以選擇降低首次緩沖的數據量。甚至在第一幀沒有渲染出來的情況下,不做任何緩沖,有數據就直接塞給解碼器解碼播放。

在 iOS 平臺上,使用系統的 AVPlayer 時,屬性 automaticallyWaitsToMinimizeStalling 就是控制播放器緩沖策略的。當該值為 YES 時,AVPlayer 會努力嘗試延遲開始播放,加載足夠的數據來保證整個播放過程中盡量卡頓最少。這個接口在 iOS 10 及以上版本才開放,在 iOS 10 之前的版本,在播放 HLS 這種流媒體視頻時,效果如同 automaticallyWaitsToMinimizeStalling 為 YES,播放基于文件的視頻資源,包括通過網絡傳輸的網絡視頻文件,則效果如同 automaticallyWaitsToMinimizeStalling 為 NO。

使用 HTTPDNS 加快建連

在現在的網絡視頻播放場景中,對視頻資源的訪問通常都要經過 CDN 網絡進行內容分發和調度。如果調度得當,將訪問資源時的節點調度到離得近、速度快的節點,會大大加快首屏播放。

這時候我們可以使用與 CDN 網絡配套的 HTTPDNS 服務。HTTPDNS 使用 HTTP 協議進行域名解析,代替現有基于 UDP 的 DNS 協議,域名解析請求直接發送到相應的 HTTPDNS 服務器,從而繞過運營商的 Local DNS,能夠避免 Local DNS 造成的域名劫持問題和調度不精準問題。

以 iOS 上的 AVPlayer 為例,當使用 HTTPDNS 時,可以用視頻資源 URL 對應的 Host 向 HTTPDNS 請求節點 IP,然后用節點 IP 替換 URL 中的 Host 部分,再在 HTTP Header 里設置原 Host。這樣即可通過 IP 直連的方式訪問 HTTPDNS 返回的較優節點。

示例代碼大致如下:

// 假設原視頻 URL 是:http://www.example.com/abc.mp4
// 假設從 HTTPDNS 服務獲取的 www.example.com 這個 Host 對應的 IP 是:192.168.1.1
// 那么處理后的 URL 是:http://192.168.1.1/abc.mp4

NSMutableDictionary *headers = [NSMutableDictionary dictionary];
[headers setObject:@"www.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 時,是會失敗的。因為 HTTPS 在證書驗證的過程,會出現 domain 不匹配導致 SSL/TLS 握手不成功。這時候的方案參考 HTTPS(含SNI)業務場景“IP直連”方案說明iOS HTTPS SNI 業務場景“IP直連”方案說明

提升 CDN 命中率

通常 CDN 的緩存命中策略是與訪問資源的 URL 有關。如果命中策略是 URL 全匹配,那么就要盡量保證 URL 的變化性較低。比如:盡量不要在 URL 的參數中帶上隨機性的值,這樣會造成 CDN 緩存命中下降,從而導致不斷回源,這樣訪問資源耗時也就增加了。當然這樣就失去了一些靈活性。

CDN 方面其實可以提供一些配置策略,比如:根據域名可配置對其緩存命中策略忽略掉某些參數。這樣就能保證一定的靈活性了。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內容