FFMPEG關鍵結構體

// FFMPEG關鍵結構體:
// 轉載 http://blog.csdn.net/leixiaohua1020/article/details/14214577
// 2016.2.26緩存

 

AVFrame(位於avcodec.h)結構體通常用於存儲原始數據。
===============================================================================
下面看幾個主要變量的做用(在這裏考慮解碼的狀況):
uint8_t *data[AV_NUM_DATA_POINTERS]:解碼後原始數據(對視頻來講是YUV,RGB,對音頻來講是PCM)
int linesize[AV_NUM_DATA_POINTERS]:data中「一行」數據的大小。注意:未必等於圖像的寬,通常大於圖像的寬。
int width, height:視頻幀寬和高(1920x1080,1280x720...)
int nb_samples:音頻的一個AVFrame中可能包含多個音頻幀,在此標記包含了幾個
int format:解碼後原始數據類型(YUV420,YUV422,RGB24...)
int key_frame:是不是關鍵幀
enum AVPictureType pict_type:幀類型(I,B,P...)
AVRational sample_aspect_ratio:寬高比(16:9,4:3...)
int64_t pts:顯示時間戳
int coded_picture_number:編碼幀序號
int display_picture_number:顯示幀序號
int8_t *qscale_table:QP表
uint8_t *mbskip_table:跳過宏塊表
int16_t (*motion_val[2])[2]:運動矢量表
uint32_t *mb_type:宏塊類型表
short *dct_coeff:DCT係數,這個沒有提取過
int8_t *ref_index[2]:運動估計參考幀列表(貌似H.264這種比較新的標準纔會涉及到多參考幀)
int interlaced_frame:是不是隔行掃描
uint8_t motion_subsample_log2:一個宏塊中的運動矢量採樣個數,取log的數據結構

 

AVFormatContext(位於avformat.h)是一個貫穿始終的數據結構,不少函數都要用到它做爲參數,
它是FFMPEG解封裝(flv,mp4,rmvb,avi)功能的結構體。
===============================================================================
下面看幾個主要變量的做用(在這裏考慮解碼的狀況):
struct AVInputFormat *iformat:輸入數據的封裝格式
AVIOContext *pb:輸入數據的緩存
unsigned int nb_streams:視音頻流的個數
AVStream **streams:視音頻流
char filename[1024]:文件名
int64_t duration:時長(單位:微秒us,轉換爲秒須要除以1000000)
int bit_rate:比特率(單位bps,轉換爲kbps須要除以1000)
AVDictionary *metadata:元數據函數

 

AVCodecContext(位於avcodec.h)中不少的參數是編碼的時候使用的
===============================================================================
下面挑一些關鍵的變量來看看(這裏只考慮解碼)。
enum AVMediaType codec_type:編解碼器的類型(視頻,音頻...)
struct AVCodec *codec:採用的解碼器AVCodec(H.264,MPEG2...)
int bit_rate:平均比特率
uint8_t *extradata; int extradata_size:針對特定編碼器包含的附加信息(例如對於H.264解碼器來講,存儲SPS,PPS等)
AVRational time_base:根據該參數,能夠把PTS轉化爲實際的時間(單位爲秒s)
int width, height:若是是視頻的話,表明寬和高
int refs:運動估計參考幀的個數(H.264的話會有多幀,MPEG2這類的通常就沒有了)
int sample_rate:採樣率(音頻)
int channels:聲道數(音頻)
enum AVSampleFormat sample_fmt:採樣格式
int profile:型(H.264裏面就有,其餘編碼標準應該也有)
int level:級(和profile差不太多)ui

 

AVIOContext(位於avio.h)是FFMPEG管理輸入輸出數據的結構體。
===============================================================================
AVIOContext中有如下幾個變量比較重要:
unsigned char *buffer:緩存開始位置
int buffer_size:緩存大小(默認32768)
unsigned char *buf_ptr:當前指針讀取到的位置
unsigned char *buf_end:緩存結束的位置
void *opaque:URLContext結構體編碼

 

AVCodec(位於avcodec.h)是存儲編解碼器信息的結構體。
===============================================================================
下面說一下最主要的幾個變量:
const char *name:編解碼器的名字,比較短
const char *long_name:編解碼器的名字,全稱,比較長
enum AVMediaType type:指明瞭類型,是視頻,音頻,仍是字幕
enum AVCodecID id:ID,不重複
const AVRational *supported_framerates:支持的幀率(僅視頻)
const enum AVPixelFormat *pix_fmts:支持的像素格式(僅視頻)
const int *supported_samplerates:支持的採樣率(僅音頻)
const enum AVSampleFormat *sample_fmts:支持的採樣格式(僅音頻)
const uint64_t *channel_layouts:支持的聲道數(僅音頻)
int priv_data_size:私有數據的大小.net

 

AVStream(位於avformat.h)是存儲每個視頻/音頻流信息的結構體。
===============================================================================
重要的變量以下所示:
int index:標識該視頻/音頻流
AVCodecContext *codec:指向該視頻/音頻流的AVCodecContext(它們是一一對應的關係)
AVRational time_base:時基。經過該值能夠把PTS,DTS轉化爲真正的時間。FFMPEG其餘結構體中也有這個字段,
可是根據個人經驗,只有AVStream中的time_base是可用的。PTS*time_base=真正的時間
int64_t duration:該視頻/音頻流長度
AVDictionary *metadata:元數據信息
AVRational avg_frame_rate:幀率(注:對視頻來講,這個挺重要的)
AVPacket attached_pic:附帶的圖片。好比說一些MP3,AAC音頻文件附帶的專輯封面。指針

 

AVPacket(位於avcodec.h)是存儲壓縮編碼數據相關信息的結構體。
===============================================================================
重要的變量有如下幾個:
uint8_t *data:壓縮編碼的數據。
例如對於H.264來講。1個AVPacket的data一般對應一個NAL。
注意:在這裏只是對應,而不是如出一轍。他們之間有微小的差異:使用FFMPEG類庫分離出多媒體文件中的H.264碼流
所以在使用FFMPEG進行視音頻處理的時候,經常能夠將獲得的AVPacket的data數據直接寫成文件,從而獲得視音頻的碼流文件。
int size:data的大小
int64_t pts:顯示時間戳
int64_t dts:解碼時間戳
int stream_index:標識該AVPacket所屬的視頻/音頻流。code

相關文章
相關標籤/搜索