一、AVPacket簡述
AVPacket是FFmpeg中實現視頻、音頻等傳輸的核心結構體之一,它用於存儲壓縮編碼後的視頻、音頻數據,是從輸入端到輸出端、從一個處理單元到另一個處理單元之間的橋樑。
AVPacket的結構體定義如下:
/** * This structure stores compressed data. It is typically exported by demuxers * and then passed as input to decoders, or received as output from encoders and * then passed to muxers. */ typedef struct AVPacket { /** * A reference to the reference-counted buffer where the packet data is stored. * May be NULL, then the packet data is not reference-counted. */ AVBufferRef *buf; ... } AVPacket;
AVPacket主要成員變數有buf、pts、dts、data等等,下面將對其中重要的成員變數進行詳細的闡述。
二、pts和dts的作用
pts和dts(Presentation Time Stamp和Decode Time Stamp)在AVPacket中扮演著十分重要的角色。它們分別表示解碼後的圖像和聲音應該在什麼時間顯示和播放。
pts即為顯示時間戳,展現了解碼後的圖像應該在哪個時間顯示,其單位一般是微秒(us),它和視頻播放時間是直接相關的。
AVRational time_base; // 時基,用於將時間戳pts從AV_TIME_BASE單位轉換為當前時間單位 int64_t pts; // 顯示時間戳 int64_t dts; // 解碼時間戳
AVPacket中的AVRational time_base可用於將pts從AV_TIME_BASE單位轉換為當前時間單位,其中AV_TIME_BASE的值為1000000,因此在使用pts進行視頻播放時,可以使用如下公式將pts值計算出來:
pts = packet.pts * av_q2d(stream_ctx->time_base) * 1000;
其中stream_ctx->time_base表示流的時基,av_q2d將AVRational類型轉化為double類型。
dts即為解碼時間戳,是指解碼器在解碼過程中,使用到該視頻幀的時間戳。
三、buf的作用
AVPacket中的buf表示視頻數據緩存區,用於存儲壓縮編碼後的視頻、音頻數據。buf一般都會被賦值為AVBufferRef類型。
AVBufferRef是用於解決數據拷貝和內存管理問題而設計的,它通過創建引用計數AVBuffer和AVBufferPool,來達到減少內存拷貝的效果。AVBufferRef的結構體定義如下:
typedef struct AVBufferRef { AVBuffer *buffer; uint8_t *data; ... } AVBufferRef;
其中AVBufferRef包含了一個AVBuffer類型指針,通過buffer來對AVBuffer和AVBufferPool進行引用計數和內存管理。
四、AVPacket的使用
AVPacket的使用主要分為以下三步:
1、初始化AVPacket
使用av_packet_alloc函數對AVPacket進行初始化,其中AVPacket的內存空間都會被FFmpeg自動分配。初始化後,需要對AVPacket進行必要的設置和賦值。
AVPacket *pkt = av_packet_alloc(); pkt->buf = NULL; pkt->data = NULL; pkt->size = 0; pkt->pts = AV_NOPTS_VALUE; pkt->dts = AV_NOPTS_VALUE; pkt->stream_index = -1;
2、填充AVPacket數據
將壓縮後的視頻數據存儲在AVPacket結構體中,並設置pts和dts等時間戳信息,對於音頻數據同理,下面為視頻數據存儲的代碼示例:
AVPacket *pkt = av_packet_alloc(); ... // 將壓縮後的視頻數據存儲在AVPacket結構體中 pkt->data = compressed_data; pkt->size = compressed_size; pkt->pts = pts; pkt->dts = dts; ...
3、釋放AVPacket
使用av_packet_free函數對AVPacket進行釋放操作。
av_packet_free(&pkt);
五、總結
AVPacket作為FFmpeg中實現視頻、音頻等傳輸的核心結構體之一,在音視頻處理中發揮了十分重要的作用。通過本文的闡述,我們可以清晰地了解到AVPacket的結構體定義、成員變數的作用,以及AVPacket的使用方法,這將為我們在進行音視頻處理時提供極大的幫助。
原創文章,作者:NDME,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/138493.html