關於FFMPEG的解碼模型
FFMPEG程式碼量很大,所以如果只是看程式碼必然容易從入門到放棄,為了更好的瞭解這座寶庫,我選擇了gdb除錯ffmpeg_g的方式。從實際的效果看,確實能夠比較清晰的順利整個FFMPEG的脈絡。這次我想了解的是ffmpeg到底是如何將h264碼流解碼成yuv的,選用的測試命令如下:
./ffmpeg_g -i test.h264 -vcodec rawvideo -an out.yuv
外部通過avcodec_send_packet呼叫,將需要解碼的pkt包提交給後臺的解碼執行緒,後臺解碼執行緒再呼叫h264解碼回撥函式進行解碼。
解碼執行緒的建立
使用gdb工具,在解碼回撥h264_decode_frame設定斷點,可以得到如下呼叫堆疊。
可以確定,這是一個專門用於解碼的執行緒,從程式碼中索引執行緒工作回撥函式frame_worker_thread,只有建立它的時候有呼叫。
在此行再設定斷點,我們可以知道到底是誰建立了它,以及什麼時候建立的。
從堆疊看就是在呼叫avcodec_open2開啟解碼器的時候,ffmpeg就已經為我們構建瞭解碼模型!
推包
這一部分講一講ffmpeg是如何將包推送給後臺執行緒的。我們注意觀察解碼執行緒,看看它到底是如何接收外界包的
很明顯,外界是將資料裝載到了PerThreadContext::avpkt這個變數中,對於PerThreadContext,我們先按下不表,只需瞭解它就是一個執行緒結構體物件罷了,裝載了各種執行緒所需的資料,包括外界給它的包。換言之,只需按圖索驥跟蹤這個變數,就可以知道是誰,通過什麼樣的方式給它傳資料的。經過一番折騰,我確實找到了一個地方
為了確認,在此處設定斷點,ffmpeg確實在不斷的呼叫此函式推包。而最外層API函式正是我們常用的avcodec_send_packet。
相關文章
- FFmpeg開發筆記(五):ffmpeg解碼的基本流程詳解(ffmpeg3新解碼api)筆記API
- ffmpeg軟解碼遇到的坑
- FFmpeg音訊解碼音訊
- ffmpeg解碼基本流程
- MediaCodec解碼FFmpeg AvPacket
- ffmpeg解碼音訊流音訊
- ffmpeg記憶體模型記憶體模型
- 關於盒模型相關的問題模型
- 關於Actor模型的實現模型
- 關於貧血模型模型
- NDK開發——FFmpeg視訊解碼
- FFmpeg和avconv編解碼工具
- 模型的威力:基於模型,快速梳理原始碼模型原始碼
- laravel Eloquent模型 關於模型關聯屬性獲取Laravel模型
- 關於 CSS 盒子模型CSS模型
- 基於ffmpeg的Android播放器開原始碼 Posted onAndroid播放器原始碼
- 關於mysql忘記密碼的解決策略MySql密碼
- FFMpeg對MPEG2 TS流解碼的流程分析
- 關於盒子模型的BFC總結模型
- FFmpeg開發筆記(九):ffmpeg解碼rtsp流並使用SDL同步播放筆記
- FFMPEG視音訊編解碼學習(1)音訊
- AAAI 2020 論文解讀:關於生成模型的那些事AI模型
- 關於DPM(Deformable Part Model)演算法中模型結構的解釋ORM演算法模型
- FFMpeg對MPEG2 TS流解碼的流程分析[2]
- 關於四色模型的一點困惑模型
- 關於分類的線性模型的討論模型
- ffmpeg入門到實戰-ffmpeg是怎麼轉碼的?
- 關於cookie的詳解Cookie
- FFmpeg開發筆記(八):ffmpeg解碼音訊並使用SDL同步音訊播放筆記音訊
- 關於模型關聯 獲取不到關聯資訊 求教模型
- 關於DPM(Deformable Part Model)演算法中模型視覺化的解釋ORM演算法模型視覺化
- FFmpeg命令影片音訊轉碼引數詳解音訊
- FFmpeg學習之一(FFmpeg原始碼編譯)原始碼編譯
- 關於建立3D線框模型的解答3D模型
- 關於密碼密碼
- JavaCV FFmpeg AAC編碼Java
- FFmpeg開發筆記(二十四)Linux環境給FFmpeg整合AV1的編解碼器筆記Linux
- 關於SIP的原始碼地址原始碼