2、FFmpeg的模塊結構

[TOC]網絡

開始前的BB

我發現 不少都是上來直接擼,擼完了發現其實仍是什麼都不會,本身知道ffmpeg有什麼自帶的東西能夠參考的也不瞭解,那還搞個🔨,,腦海中沒有大致的認知,很容易就迷失在細節裏沒法自拔,只知其術不知其道理,緊接着下一個階段就是找大佬萌新三連 數據結構

不要慌框架

這篇文章主要就是給你們一個大致的認知,來認識FFmpeg這個框架,由表及裏,由淺入深,解開她神祕的面紗 函數

FFmpeg框架的結構

祖傳ffmpeg結構圖鎮樓工具

FFmpeg結構

其中 ffplay ffmpeg ffprobe 這三個是ffmpeg裏面的能編譯爲可執行文件的三個功能很強大的東西,這個在咱們上面下載的動態庫/靜態庫文件裏的post

  • ffplay: ffplay是一個很是經典的播放器實現,對於作播放器的朋友,寫播放器的時候必定要要去參考,像ijkplayer 就是基於ffplay,同步等地方改動的不多,大部分改動都在顯示的部分,主要是實現瞭解碼後的yuv數據上傳到opengles,以及封裝音頻播放的接口(AudioTrack)等。編碼

  • ffmpeg: ffmpeg這個工具裏面包含了不少功能,像軌道提取,視頻裁剪,轉碼、水印、濾鏡等功能加密

  • ffprobe: ffprobe是一個查看視頻格式信息的工具,包括封裝信息、視頻信息、音頻信息等插件

以上三個工具咱們下章講他一些經常使用的命令。3d

底層支撐庫簡介

除了這三個工具類外,底層的組成部分有如下幾個:

avutil

avutil 核心的工具庫;其餘的模塊都會依賴這個庫,定義了一些經常使用的枚舉,工具類(加解密、時間、日誌,FIFO隊列、內存分配、大小端轉換等)

avformat

avformat 協議與格式庫; 這個模塊封裝了Protocol、Demuxer、Muxer層,是ffmpeg最重要的模塊之一,至關於Android中的 MediaExtracotor

avcodec

avcodec 編解碼庫;封裝了Codec,該模塊內置不少解碼器,在本身的註冊列表中,一些有本身的License的第三方Codec,好比X264.fdk-aac等均可以經過插件的方式添加進來

avfilter

avfilter 音視頻濾鏡庫;提供了不少音頻與視頻特效處理,能夠在編解碼過程當中直接調用該模塊爲音視頻數據作特效處理,這個處理是利用CPU進行處理的,音頻的處理通常都是比較快,影響不是特別的大 視頻的處理的,,效率是沒有利用OpenGL經過GPU進行處理快

avdevice

avdevice 輸入輸出設備庫; 好比,須要編譯出播放聲音或者視頻的ffplay,就須要確保此模塊是打開狀態,同時也須要SDL庫的預編譯,這個設備模塊的播放聲音與播放視頻使用的都是SDL庫,也包含了其餘的輸入/輸出設備

swresample

swresample 音頻衝採樣模塊;能夠對數字音頻進行聲道數、採樣率、位寬等多種基本信息的轉換,好比將SimpleForamt爲AV_SAMPLE_FMT_FLTP轉換爲AV_SAMPLE_FMT_S16P格式的

swscale

swscale 圖像數據格式轉換模塊; 好比能夠將YUV數據轉換爲RGB數據,尺寸從1920 * 1080 縮放爲 800 * 480

postproc

postproc avfilter的處理會依賴該模塊的一些函數

經常使用數據結構

  • AVFormatContext 封裝格式上下文結構體,保存了視頻文件封裝格式相關信息
  • AVInputFormat demuxer結構體,每一種封裝格式對應一個該結構體(FLV MKV MP4 AVI) AVOutpuFormat 對應muxer
  • AVStream 媒體文件中每一個視頻/音頻流對應一個該結構體
  • AVCodecContext 編解碼器上下文結構,保存了飲品是編解碼相關的信息
  • AVCodec每一個視頻/音頻編解碼器對應一個結構體
  • AVPacket 儲存街鳳凰後的一幀壓縮編碼數據
  • AVFrame 儲存一陣解碼後的像素/採樣數據

經常使用核心函數

主要講 avformatavcodc兩個庫的比較重要的函數

avformat

  • 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() 讀取音視頻包AVPacket
  • avformat_seek_file() 經過文件字節進行Seek
  • av_seek_frame() 能夠經過相應的格式選擇Seek到關鍵幀仍是指定幀以及字節

解複用的調用流程以下

  1. 分配一個AVFormatContext的上下文
  2. 打開視頻文件
  3. 尋找到對應的流信息
  4. 循環讀取流/或者在中間seek到指定的位置
  5. 結束讀取,關閉流,釋放空間

更詳細的代碼會在後面的章節中有示例代碼

avcodec

  • 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()關閉解碼器

解碼器的調用流程以下

  1. 分配一個AVCodecContext
  2. 將AVStream裏的Codec的參數傳遞到AVCodecContext
  3. 根據Id或者名字尋找的相應的解碼器
  4. 打開解碼器
  5. 發送AVPacket(解封裝的數據) ---> 接受到解碼後的數據(YUV/PCM)
  6. 關閉解碼器,釋放AVCodecContext

關於FFmpeg的核心的結構體與函數,以及相應的解複用/解碼的流程先了解這麼多,有個大概的印象,咱們在後面的文章裏,就會慢慢體會到他們帶來的無窮快感

一袋米要抗幾樓 (痛みを感じるようにしましょう) 的佩恩警告⚠️ (づ。◕‿‿◕。)づ

未完持續。。。

相關文章
相關標籤/搜索