解讀B站跨平臺播放器IJKPlayer的前世今生

最近幾年,伴隨着開發人員對移動端的跨平臺需要,B 站自研的 IJKPlayer 應運而生。它是一款基於 FFmpeg 的輕量級 Android/iOS 視頻播放器,具有 API 易於集成、編譯配置可裁剪、支持硬件加速解碼、DanmakuFlameMaster 架構清晰、簡單易用等優勢。作爲開源項目,IJKPlayer 還支持用戶根據業務類型進行定製,受到了越來越多的開發者的喜愛。那麼,B 站的這一開源明星項目究竟是怎樣煉成的?在開發過程中遇到過哪些技術難題?目前,經過多輪改造,堪稱“IJKPlayer2.0”的新版本又有哪些突破?InfoQ 近日採訪到 B 站資深開發工程師鄭翰超,瞭解到了 IJKPlayer 的前世今生。本文整理自 InfoQ 與鄭翰超的採訪全文。

InfoQ:請您簡單介紹下自己,以及目前所負責的工作。

鄭翰超:我在 2016 年加入 B 站,就職於移動技術部,現負責移動端播放器 IJKPlayer 相關優化和改造,以及新的多媒體技術探索和實現。

InfoQ:請您談談 B 站開源項目 IJKPlayer 的研發背景。

鄭翰超:作爲視頻網站,B 站從創建之初就非常重視播放體驗。考慮到移動端的跨平臺需要,因而決定自研跨平臺播放器。經過對比和選型,我們最終決定在 ffmpeg 的基礎上進行開發,將 ffmpeg 作爲我們的基礎軟件解碼和解封轉庫,然後跨平臺地實現了自定義的 IO 模塊、demux 模塊、渲染模塊,以及播控相關。另外,我們在國內較早開始嘗試硬件解碼,提升瞭解碼效率,降低了功耗,同時也實現了多種渲染模式的兼容,提供給用戶優質的播放體驗。

InfoQ:請您介紹下 IJKPlayer 播放器的演進歷程,目前性能的優化成果有哪些?

鄭翰超:IJKPlayer 自 2015 年開始研發,經過公司內部多位同事的努力,在 2016 年初上線,實現了基本播放和雙端的硬件解碼,並實現開源。2018 年初,IJKPlayer 經過一系列的性能優化和功能拓展達到了相對穩定的程度。目前,最新的 IJKPlayer 又經過了多輪改造,可以稱爲 IJKPlayer 2.0,我們針對 IO、demux 和 decode 進行了重構,完成了包括 DASH 在內的諸多重要功能,實現了性能的提升和極致的用戶體驗,後續將在合適的時間再次開源。

具體而言,主要性能指標包括:

1)極致的 80 分位首幀:線上用戶 80 分位首幀可以達到 500ms,其中 350ms 是從發起請求到讀取到第一幀的耗時。可以說,這是一個偏極致的優化,在硬解的播放器裏應該算是非常極限的。

2)低卡頓率:百分鐘卡頓 2.5 次左右。

3)解碼失敗率:因爲完備的解碼兼容策略,目前這個數值趨近於 0。

InfoQ:IJKPlayer 播放器與其他播放器(如 ExoPlayer、JiaoZiVideoPlayer、PLDroidPlayer 等)相比,有哪些優點?

鄭翰超:這幾款都是目前市面上比較優秀的播放軟件。相較而言,IJKPlayer 主要在研發的側重點上有所不同。ExoPlayer 專注於 Android,而 IJKPlayer 專注於跨平臺;JiaoZiVideoPlayer 專注於多播放內核切換,方便接入者使用不同的播放內核;PLDroidPlayer 專注於完整 SDK 的開發,但它目前應該還是閉源的,用戶難以定製。而 IJKPlayer 是開源的,支持用戶根據業務類型進行定製。

InfoQ:當用戶切換視頻畫質時,IJKPlayer 如何保持較高的音視頻播放質量?

鄭翰超:在切換視頻畫質時,主要應考慮如何保證視頻幀的連續性。我們通過 DASH 方案的實現和對解碼模塊的優化,基本可以達到完全流暢的視頻畫質切換。

InfoQ:您在優化 IJKPlayer 的過程中,遇到過哪些技術難點?是如何解決的?

鄭翰超:主要遇到的是硬件解碼方面,特別是 Android 硬解的困難。一是如何提高硬解效率;二是如何解決 Android 機型差異化的問題。

對應的解決方案是:多線程的硬解方案;通過 mediacodec 相關參數的獲取,以及對一些特殊硬解條件的判斷,嚴格確定手機的硬解能力。另外,我們制定了完備的硬解 fallback 邏輯,可以做到用戶無感。

InfoQ:請您談談 MPEG-DASH 協議在移動端的落地方案,該方案帶來了哪些變化?

鄭翰超:MPEG-DASH 格式是 2012 年制定完成的。之後,國外陸續有 Netflix、YouTube 等廠商跟進,而我們是國內第一家全面上線 DASH 的公司。對於移動端來說,主要的難點在於,DASH 只是一個標準,如何實現並應用到業務上是很大的挑戰,我們需要將 DASH 和自身業務特點相結合,充分發揮 DASH 的優勢,在這個過程中可能還需要做一些 DASH 的定製化工作。

具體落地過程的主要工作有:

  1. 需要重新開發播放器的 demux,以適配 DASH;

  2. 需要設計 DASH 中多 url 的傳遞和管理方案;

  3. 需要自研 ABR 算法,這是一個長期投入的過程;

  4. 需要改造播放器的 IO 層,以適應 DASH 音視頻分開的設計。

方案上線後爲我們帶來了如下變化:

  1. 完全無縫的清晰度切換;

  2. 靈活的分片,縮短了清晰度切換的時間;

  3. 針對性的 ABR 算法,可以降低卡頓的發生;

  4. 音視頻分開,可以在特殊場景下,節省視頻的帶寬開銷。

InfoQ:進入到 5G 時代,您對未來音視頻的發展有什麼展望?

鄭翰超:5G 時代,傳輸速度將不再是問題,高碼率的傳輸問題將得以解決。像 VR、全景視頻將不再受限於碼率和分辨率,可能會迎來機會。

專家介紹:
鄭翰超,現就職於 B 站移動技術部,負責移動端 IJKPlayer 播放相關工作,專注於跨平臺的多媒體播放體驗改善,主導了 IJKPlayer 重要功能的開發、性能優化、以及 DASH 在移動端的落地。

活動推薦:
除了鄭翰超老師的分享,本次 GMTC 全球大前端技術大會(深圳站)2019 我們還設置了小程序挑戰與應對、音視頻技術、Serverless 實戰、測試與安全、大前端工程化、Flutter 實戰、新興編程語言、團隊建設與管理等熱門技術專場。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章