當前位置:
首頁 > 最新 > AS基於ffmpeg的視頻播放庫封裝

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解碼器源代碼簡單分析:概述


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!

TAG: |