# 對視頻播放器的研究

關鍵詞:ijkplayer / 播放器 / 視頻技術

本次筆記主要梳理了幾家主流視頻播放器的調研和對視頻技術的初步分析。

1. 對幾家視頻播放器的調研對比 #

(1)ijkplayer
- 支持 Android 和 iOS 平臺;
- API 易於集成;
- 編譯配置可裁剪,方便控制安裝包大小;
- 支持硬件加速解碼;
- 移除了 ffmpeg 視頻內核中不常用的特性以減小體積;
- 使用各種平臺原生的渲染方式進行優化,修復一些在線視頻播放的 BUG;
- 開源;

(2)Vitamio
- 支持 Android 和 iOS 平臺;
- 支持硬件解碼與 GPU 渲染,API 接口簡潔易用;
- 目前,全球已經有超過一萬種應用在使用 vitamio,覆蓋用戶超過 5 億;
- 可播放 720P 甚至 1080P 高清 MKV / FLV / MP4 / MOV / TS / RMVB等常見格式的視頻
- 支持 MMS / RTSP / RTSP / HLS(m3u8) 等常見協議,包括點播與直播;
- 高級功能收費;

(3)VLC
- 全名是 Video Lan Client,是一個開源的、跨平臺的視頻播放器,支持大量的音視頻傳輸、封裝和編碼格式
- 幾乎支持所有的視頻格式,也很注重版權方面的問題,程序結構的擴展性好;
- 開源;
- 項目龐大;

(4)優酷
- 優酷公司開放的播放器框架,支持 Android / iOS / Web 平臺,用於播放優酷視頻網站的視頻;
- 呵呵,比較封閉;
- 接口不夠豐富,不支持 1080P;
- 不開源;

對我個人而言,更喜歡 ijkplayer,有以下幾個原因:
1. 它開源,便於掌握關鍵機制和定製功能;
2. 項目代碼比較精簡,相對於 VLC 來說,研究難度小一些;
3. 功能強大,主流視頻格式和協議都支持;

2. 視頻技術的初步分析 #

  1. 接入模塊基於網絡協議從視頻流中提取真正的視頻數據,並存放到下載緩衝區中;
  2. 解複用模塊將音頻和視頻內容分離開;
  3. 解碼模塊分別對音頻和視頻內容進行解碼,把壓縮的數據還原成原始音視頻數據,類似一張張位圖格式的圖像,並存入解碼緩衝區;
  4. 輸出模塊,從解碼緩衝區讀取數據並完成渲染實現視頻的播放;
  5. 控制器模塊,通過與其它模塊的交互,完成同步音視頻流,進行控制播放速度以及暫停快進等操作,獲取視頻流的媒體信息,調整視頻亮度等功能;

3. 關於 ijkplayer #

  1. 準備軟硬件。準備 PC 機,JDK,Android SDK,Android NDK,git,yasm 編譯器環境;
  2. 下載項目代碼。git clone ijkplayer 源代碼和 ffmpeg 源代碼;
  3. 編譯播放器內核。編譯 ffmpeg 生成庫(libijkffmpeg.so 用於解碼,libijksdl.so 用於播放和顯示,其它平臺庫用於 ijkplayer 編譯);
  4. 編譯播放器工程。編譯 ijkplayer 生成庫(libijkplayer.so 支持播放器主要的功能實現);
  5. 基於 Android 開發環境,導入 3 和 4 中的庫文件,並基於 ijkplayer 源碼中的內容,構建項目工程完成播放器應用的開發;

ffmpeg 編譯之後主要是用於生成 libijksdl.so,ibijkffmpeg.so
兩個分別主宰不同的方向:libijksdl.so 用於繪圖顯示(視頻播放線程等和鍵鼠操控);libijkffmpeg.so用於數據解碼等處理;

整體解碼內核使用了 3 個第三方庫:
1. ffmpeg 生成 libijkffmpeg.so
2. sdl 生成 libijksdl.so
3. libyuv 被靜態鏈接進 sdl 中

作者的播放器庫:
libijkplayer.so
基於 ffplay,增加了不少東西,是 player 級別的關鍵代碼
作者自主功能主要在 libijkplayer.so 這塊

4. 播放器技術能力瞭解的重點 #

  1. 如何定製化視頻框架;
  2. 實時碼率是否可以獲取;
  3. 視頻分片的統計信息(分片下載時延,分片大小等)是否可以獲取;
  4. 播放器緩衝區模型和機制是否瞭解,是否可以限定初始緩衝量的大小(緩衝區作爲重點調研下,如“播放器到底有幾個緩衝區,怎麼分,完全開源的應該怎麼設置,解碼緩衝區用來設置已經解碼的還是待解碼的”等問題);
  5. 是否可以直接在播放內部通過緩存區填充情況計算流量和速率;
  6. 是否支持 HTTP + Range 的播放方式(當前多數主流視頻網站已更新爲當前這種機制);
  7. VR 產品和應用發展迅速,後續在現場會議,演唱會,遊戲等行業會大行其道,對於 VR 視頻的播放,如何解決同傳統視頻播放有什麼差別;

5. 其它 #

http://dranger.com/ffmpeg/
這應該是目前網絡上大多數教程的參考源。

http://blog.csdn.net/leixiaohua1020/article/details/15811977
這是一個總結性的文章,作者對 FFmpeg 的底層做了很多的研究,Android 端太少,但是源碼分析的很不錯,唯一可惜的是作者沒有敢去分析 ffplay 的源碼,要不我們的工作量或者我們對播放的原理理解就會進入一個新的高度

http://dande618.github.io/blog/2013/10/29/FFMepg/
這個博客的代碼對音頻進行了較好的處理(雖然不大懂,但確實可以工作)

http://www.cnblogs.com/tanlon/p/3966130.html
這個博客的作者對很多音視頻相關的內容進行了多個平臺的實踐,值得參考

https://github.com/dxjia/ffmpeg-jni-sample
這位作者使用 FFmpeg 將本地視頻轉成 gif 圖片播放,源碼由於環境的緣故還沒有測試,但好歹是一個突破。

http://blog.csdn.net/jwzhangjie/article/details/9111547
本地視頻播放器開發–SDL 編譯編譯中編譯出 sdl 的支持庫,只可惜是本地的

End.

Note by HF.

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