目錄
- 參考
- 概述
- FFmpeg中的libx264編碼流程
1. 參考
2. 概述
本文主要參考[1],為了更加清晰地展現(xiàn)出編碼過程中FFmpeg與libx264的交互流程。
編碼流程主要有三個步驟:
- 編碼器初始化:打開編碼器并設(shè)置各種編碼參數(shù)。
- 編碼:輸入待編碼的圖像數(shù)據(jù)和一些參數(shù),獲取編碼后的數(shù)據(jù)。
- 關(guān)閉編碼器:釋放各種資源。
FFmpeg的編解碼的API詳細(xì)介紹可參考FFmpeg音頻解碼#編解碼API介紹部分。
3. FFmpeg中的libx264編碼流程
FFmpeg的libx264編碼器AVCodec ff_libx264_encoder
定義在libavcodec/libx264.c
。是H.264編碼庫libx264的一個wrapper,libavcodec和libx264中間的一個代理,必要時對libx264和FFmpeg定義的一些數(shù)據(jù)結(jié)構(gòu)進(jìn)行轉(zhuǎn)換。
3.1 編碼器初始化
ff_libx264_encoder#init.png
- 虛線的箭頭表示在某些特定情況下會調(diào)用。
- 以x264開頭的結(jié)構(gòu)體和函數(shù)為libx264中定義的。
- x264_param_default():設(shè)置默認(rèn)參數(shù)。
- x264_param_default_preset():設(shè)置preset、tune對應(yīng)的一些編碼參數(shù),在preset或tune不為空時設(shè)置,先設(shè)置preset對應(yīng)的一些編碼參數(shù),再設(shè)置tune對應(yīng)的一些編碼參數(shù)。
- x264_param_apply_profile():設(shè)置profile對應(yīng)的一些編碼參數(shù),在profile不為空時設(shè)置。
- 設(shè)置的各種參數(shù)有兩個來源:
AVCodecContext
和X264Context
,X264Context
保存在AVCodecContext.priv_data
中。AVCodecContext
包含了一些編碼器的通用選項(xiàng)。X264Context
包含了一些libx264的特有選項(xiàng)。 - x264_encoder_open():打開編碼器,返回一個編碼器句柄
x264_t *
。 - x264_encoder_headers():需要全局頭的時候,輸出頭信息。
3.2 編碼
ff_libx264_encoder#encode.png
-
x264_encoder_encode
為執(zhí)行編碼的函數(shù),輸入的待編碼的數(shù)據(jù)為x264_picture_t
中,輸出的編碼數(shù)據(jù)為x264_nal_t
數(shù)組。 - 在輸入端
ff_libx264_encoder
把AVFrame
中的待編碼的數(shù)據(jù)的buffer地址賦給了x264_picture_t
中的對應(yīng)變量,數(shù)據(jù)buffer是原來AVFrame
中分配的,沒有數(shù)據(jù)拷貝的過程。 - 在輸出端
ff_libx264_encoder
把已編碼的數(shù)據(jù)從x264_nal_t
數(shù)組拷貝到AVPacket
中。 - x264_encoder_delayed_frames:返回當(dāng)前延遲的(緩沖的)幀的數(shù)量。
x264_encoder_encode
的調(diào)用會循環(huán)進(jìn)行直到x264_encoder_delayed_frames
返回的值為0,圖中沒有表示出來。
3.3 關(guān)閉編碼器
ff_libx264_encoder#close.png