1. 程式人生 > >FFmpeg總結(六)AV系列結構體之AVPacket

FFmpeg總結(六)AV系列結構體之AVPacket

type 獲得 tty his err views pen required pan

AVPacket位置:libavcodec/avcodec.h下:

技術分享

AVPacket:

  • 通常通過demuxer導出的data packet作為解碼器的input data
  • 或是收到來自編碼器的data packet。通過muxer進入輸出的output data

看例如以下圖,更易理解:
技術分享

對於視頻來說,它通常應該包括一個壓縮的幀。對於音頻,可能包括多個壓縮幀,同意編碼器輸出為空的packet,沒有壓縮數據。僅僅包括數據(如一些更新參數的編碼)

AVPacket 是FFmpeg中為數不多的結構體,它的size是public ABI的一部分,因此它沒有libavcodec及libavformat主塊中獲得分配棧空間及加入新字段。

數據全部權的的語義決於buf字段,假設是組。分組數據是動態分配的。在調用av_packet_unref()把引用計數降到0之前。都是有效定義的。

假設buf字段沒有設置av_packet_ref()將拷貝一份取代添加的引用計數

  • 數據分配總是分配通過av_malloc()
  • 數據拷貝總是通過av_packet_ref()
  • 數據釋放總是通過av_packet_unref()
typedef struct AVPacket {

    AVBufferRef *buf; //一個引用指向packet數據存儲的buffer的引用計數,假設為NULL,packet數據沒有引用計數

    int64_t pts; //顯示時間戳(AVStream->time_base units)pts主要用於度量解碼後的視頻幀什麽時候被顯示出來

    int64_t dts; //解碼時間戳(AVStream->time_base units)
    //DTS主要用於視頻的解碼,在解碼階段使用.PTS主要用於視頻的同步和輸出.
//在display的時候使用.在沒有B frame的情況下.DTS和PTS的輸出順序是一樣的. uint8_t *data; int size; int stream_index; int flags; //AV_PKT_FLAG標識 AVPacketSideData *side_data; //容器中能提供的其它packet數據。packet中包括一些詳細信息 int side_data_elems; int64_t duration; // packet的時長(AVStream->time_base units) int64_t pos; //< byte position in stream, -1 if unknown #if FF_API_CONVERGENCE_DURATION /** * @deprecated Same as the duration field, but as int64_t. This was required * for Matroska subtitles, whose duration values could overflow when the * duration field was still an int. */ attribute_deprecated int64_t convergence_duration; #endif } AVPacket;

FFmpeg總結(六)AV系列結構體之AVPacket