AS基於ffmpeg的視頻播放庫封裝
分享
做android開發的朋友如果還不懂android組件化開發建議去學習下。傳送門:https://www.jianshu.com/p/40e745038471
as基於ffmpeg的視頻播放庫封裝
GIF
ffmpeg學習算起來有一個月了,但是並沒有把學到的知識做個總結,所以打算通過封裝一個簡單的基於ffmpeg的android視頻播放鏈接庫來作為一個學習小結。
本篇文章只是繼續基於上一篇「Android項目依賴的Library模塊中使用ffmpeg」了解ffmpeg的使用,並不是介紹as基於ffmpeg的視頻播放庫封裝的過程,不過我會將完成的這個鏈接庫開源到github供大家學習,還有完整的學習資料分享到網盤,到時候會以文章的形式推送給大家,希望能夠幫助想開始折騰ffmpeg的朋友們能夠快速的"入門"。
寫完這篇文章之後將不會繼續更新ffmpeg的文章了,有了入門的基礎今後學習起來也就容易些了,網上有很多ffmpeg的教程,只要看完我這幾篇關於ffmpeg的文章還有關於ndk開發的文章再去看網上的教程就能看得懂了吧,因為我也是之前看網上的文章都看不懂,而現在再去看就能看懂了。
其實不是我懶寫了,而是我要將精力轉去學習jvm,學習java高並發編程。
ffmpeg的解碼流程中常用方法介紹
介紹幾個上次寫的測試代碼中用到的函數
av_register_all()
註冊復用器,編碼器等。
該函數在所有基於ffmpeg的應用程序中幾乎都是第一個被調用的,只有調用了該函數,才能使用復用器,編碼器等。
該方法首先確定是不是已經初始化過了(initialized),
如果沒有,就調用avcodec_register_all()註冊編解碼器。
ffmpeg自帶了RTMP協議的支持,只有使用 rtmpt://, rtmpe://, rtmpte://等的時候才會使用librtmp庫。
avformat_network_init(void)
源碼注釋翻譯:
對網路組件進行全局初始化。這是可選的,但建議使用,因為它避免了隱式地為每個會話設置設置的開銷。
如果在某些主要版本的bump中使用網路協議,調用這個函數將成為強制性的。
網路來源注釋:
如果我們需要用到網路功能,那麼我們需要調用一下avformat_network_init這個方法。
原碼分析得出:
如果我們在非windows平台下又不需要用加解密功能,調用該方法就沒有任何意義,
而如果我們在非windows平台下但我們需要用到加解密功能,就需要調用該方法。
avformat_open_input()
源碼注釋:
該函數用於打開多媒體數據並且獲得一些相關的信息。
它的聲明位於libavformatavformat.h
方法定義:
int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options);
源碼注釋:
打開輸入流並讀取頭部信息。編解碼器打開必須使用avformat_close_input()關閉流。
參數解釋:
ps #指向用戶提供的AVFormatContext(由avformat_alloc_context分配)。可能是指向NULL的指針,在這種情況下,AVFormatContext由這個函數分配並寫入ps。
filename #要打開的流的文件名。
fmt #如果非null,這個參數強制一個特定的輸入格式,否則將自動檢測格式。如mp4,flv,avi等,一般傳0,讓ffmpeg根據讀取的文件頭信息自動檢測格式。
#自己的理解fmt=0時avformat_open_input方法中會調用read_header()來讀取多媒體數據文件頭,根據讀取的文件頭信息自動檢測格式。
options #一個AVFormatContext和demuxer-private選項的字典。在返回時,該參數將被銷毀,並替換為包含未找到的選項的命令,可能是NULL。成功時返回0,失敗時為負。
來源網路的注釋:
ps:函數調用成功之後處理過的AVFormatContext結構體。
file:打開的視音頻流的URL。
fmt:強制指定AVFormatContext中AVInputFormat的。這個參數一般情況下可以設置為NULL,這樣FFmpeg可以自動檢測AVInputFormat。
dictionay:附加的一些選項,一般情況下可以設置為NULL。
函數執行成功的話,其返回值大於等於0。
該方法中會調用read_header()讀取多媒體數據文件頭,根據視音頻流創建相應的AVStream。
avformat_close_input()
該函數用於關閉一個AVFormatContext,一般情況下是和avformat_open_input()成對使用的。
avformat_close_input()的聲明位於libavformatavformat.h
avformat_find_stream_info()
使用avformat_find_stream_info讀取部分視頻做探測獲取流信息。
參數1: #指向用戶提供的AVFormatContext
參數2: #如果非null,那麼ic.nb_streams就是指向字典的長數組指針,其中第i個成員包含與第i個流對應的編解碼選項。返回時,每個字典都將填入未找到的選項。
FFmpeg的庫函數源代碼分析文章列表:
【架構圖】
FFmpeg源代碼結構圖 -解碼
FFmpeg源代碼結構圖 -編碼
【通用】
FFmpeg源代碼簡單分析:av_register_all()
FFmpeg源代碼簡單分析:avcodec_register_all()
FFmpeg源代碼簡單分析:內存的分配和釋放(av_malloc()、av_free()等)
FFmpeg源代碼簡單分析:常見結構體的初始化和銷毀(AVFormatContext,AVFrame等)
FFmpeg源代碼簡單分析:avio_open2()
FFmpeg源代碼簡單分析:av_find_decoder()和av_find_encoder()
FFmpeg源代碼簡單分析:avcodec_open2()
FFmpeg源代碼簡單分析:avcodec_close()
【解碼】
圖解FFMPEG打開媒體的函數avformat_open_input
FFmpeg源代碼簡單分析:avformat_open_input()
FFmpeg源代碼簡單分析:avformat_find_stream_info()
FFmpeg源代碼簡單分析:av_read_frame()
FFmpeg源代碼簡單分析:avcodec_decode_video2()
FFmpeg源代碼簡單分析:avformat_close_input()
【編碼】
FFmpeg源代碼簡單分析:avformat_alloc_output_context2()
FFmpeg源代碼簡單分析:avformat_write_header()
FFmpeg源代碼簡單分析:avcodec_encode_video()
FFmpeg源代碼簡單分析:av_write_frame()
FFmpeg源代碼簡單分析:av_write_trailer()
【其它】
FFmpeg源代碼簡單分析:日誌輸出系統(av_log()等)
FFmpeg源代碼簡單分析:結構體成員管理系統-AVClass
FFmpeg源代碼簡單分析:結構體成員管理系統-AVOption
FFmpeg源代碼簡單分析:libswscale的sws_getContext()
FFmpeg源代碼簡單分析:libswscale的sws_scale()
FFmpeg源代碼簡單分析:libavdevice的avdevice_register_all()
FFmpeg源代碼簡單分析:libavdevice的gdigrab
【腳本】
FFmpeg源代碼簡單分析:makefile
FFmpeg源代碼簡單分析:configure
【H.264】
FFmpeg的H.264解碼器源代碼簡單分析:概述
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)