[TOC]網絡
我發現 不少都是上來直接擼,擼完了發現其實仍是什麼都不會,本身知道ffmpeg有什麼自帶的東西能夠參考的也不瞭解,那還搞個🔨,,腦海中沒有大致的認知,很容易就迷失在細節裏沒法自拔,只知其術不知其道理,緊接着下一個階段就是找大佬萌新三連 數據結構
不要慌框架
這篇文章主要就是給你們一個大致的認知,來認識FFmpeg這個框架,由表及裏,由淺入深,解開她神祕的面紗 函數
祖傳ffmpeg結構圖鎮樓工具
其中 ffplay ffmpeg ffprobe 這三個是ffmpeg裏面的能編譯爲可執行文件的三個功能很強大的東西,這個在咱們上面下載的動態庫/靜態庫文件裏的post
ffplay: ffplay是一個很是經典的播放器實現,對於作播放器的朋友,寫播放器的時候必定要要去參考,像ijkplayer 就是基於ffplay,同步等地方改動的不多,大部分改動都在顯示的部分,主要是實現瞭解碼後的yuv數據上傳到opengles,以及封裝音頻播放的接口(AudioTrack)等。編碼
ffmpeg: ffmpeg這個工具裏面包含了不少功能,像軌道提取,視頻裁剪,轉碼、水印、濾鏡等功能加密
ffprobe: ffprobe是一個查看視頻格式信息的工具,包括封裝信息、視頻信息、音頻信息等插件
以上三個工具咱們下章講他一些經常使用的命令。3d
除了這三個工具類外,底層的組成部分有如下幾個:
avutil
核心的工具庫;其餘的模塊都會依賴這個庫,定義了一些經常使用的枚舉,工具類(加解密、時間、日誌,FIFO隊列、內存分配、大小端轉換等)
avformat
協議與格式庫; 這個模塊封裝了Protocol、Demuxer、Muxer層,是ffmpeg最重要的模塊之一,至關於Android中的 MediaExtracotor
avcodec
編解碼庫;封裝了Codec,該模塊內置不少解碼器,在本身的註冊列表中,一些有本身的License的第三方Codec,好比X264.fdk-aac等均可以經過插件的方式添加進來
avfilter
音視頻濾鏡庫;提供了不少音頻與視頻特效處理,能夠在編解碼過程當中直接調用該模塊爲音視頻數據作特效處理,這個處理是利用CPU進行處理的,音頻的處理通常都是比較快,影響不是特別的大 視頻的處理的,,效率是沒有利用OpenGL經過GPU進行處理快
avdevice
輸入輸出設備庫; 好比,須要編譯出播放聲音或者視頻的ffplay,就須要確保此模塊是打開狀態,同時也須要SDL庫的預編譯,這個設備模塊的播放聲音與播放視頻使用的都是SDL庫,也包含了其餘的輸入/輸出設備
swresample
音頻衝採樣模塊;能夠對數字音頻進行聲道數、採樣率、位寬等多種基本信息的轉換,好比將SimpleForamt爲AV_SAMPLE_FMT_FLTP
轉換爲AV_SAMPLE_FMT_S16P
格式的
swscale
圖像數據格式轉換模塊; 好比能夠將YUV數據轉換爲RGB數據,尺寸從1920 * 1080 縮放爲 800 * 480
postproc
avfilter的處理會依賴該模塊的一些函數
AVFormatContext
封裝格式上下文結構體,保存了視頻文件封裝格式相關信息AVInputFormat
demuxer結構體,每一種封裝格式對應一個該結構體(FLV MKV MP4 AVI) AVOutpuFormat
對應muxerAVStream
媒體文件中每一個視頻/音頻流對應一個該結構體AVCodecContext
編解碼器上下文結構,保存了飲品是編解碼相關的信息AVCodec
每一個視頻/音頻編解碼器對應一個結構體AVPacket
儲存街鳳凰後的一幀壓縮編碼數據AVFrame
儲存一陣解碼後的像素/採樣數據主要講 avformat
和avcodc
兩個庫的比較重要的函數
avformat_network_init()
註冊網絡,初始化網絡庫以及網絡加密協議相關的庫 (openssl)avformat_alloc_context()
負責申請一個AvFormatContext
結構的內存,並進行簡單的初始化avforamt_free_context()
釋放該結構體裏的全部東西,以及他自己 ,一般與avformat_alloc_context()
成對出現avformat_close_input()
關閉解複用器,關閉後就不須要調用avforamt_free_context()
進行釋放,由於他內部會調用avformat_free_context()
方法進行釋放avformat_open_input()
打開輸入文件avformat_find_stream_info()
獲取視頻文件信息av_read_frame()
讀取音視頻包AVPacketavformat_seek_file()
經過文件字節進行Seekav_seek_frame()
能夠經過相應的格式選擇Seek到關鍵幀仍是指定幀以及字節解複用的調用流程以下
更詳細的代碼會在後面的章節中有示例代碼
avcodec_alloc_context3()
分配解碼器的上下文avcodec_find_decoder()
根據Id查找解碼器avcodec_find_decoder_by_name()
根據解碼器名字查找解碼器avcodec_open2()
打開編解碼器avcodec_send_packet()
發送解封裝後的數據包avcodec_recive_frame()
接受解碼後的數據avcodec_free_context()
釋放解碼器上下文avcodec_close()
關閉解碼器解碼器的調用流程以下
關於FFmpeg的核心的結構體與函數,以及相應的解複用/解碼的流程先了解這麼多,有個大概的印象,咱們在後面的文章裏,就會慢慢體會到他們帶來的無窮快感
一袋米要抗幾樓 (痛みを感じるようにしましょう) 的佩恩警告⚠️ (づ。◕‿‿◕。)づ
未完持續。。。