AVPacket實現視頻數據傳輸的核心結構體

一、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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
NDME的頭像NDME
上一篇 2024-10-04 00:21
下一篇 2024-10-04 00:21

相關推薦

  • Vue TS工程結構用法介紹

    在本篇文章中,我們將從多個方面對Vue TS工程結構進行詳細的闡述,涵蓋文件結構、路由配置、組件間通訊、狀態管理等內容,並給出對應的代碼示例。 一、文件結構 一個好的文件結構可以極…

    編程 2025-04-29
  • Python程序的三種基本控制結構

    控制結構是編程語言中非常重要的一部分,它們指導著程序如何在不同的情況下執行相應的指令。Python作為一種高級編程語言,也擁有三種基本的控制結構:順序結構、選擇結構和循環結構。 一…

    編程 2025-04-29
  • Think-ORM數據模型及資料庫核心操作

    本文主要介紹Think-ORM數據模型建立和資料庫核心操作。 一、模型定義 Think-ORM是一個開源的ORM框架,用於簡化在PHP應用中(特別是ThinkPHP)與關係資料庫之…

    編程 2025-04-27
  • Lidar避障與AI結構光避障哪個更好?

    簡單回答:Lidar避障適用於需要高精度避障的場景,而AI結構光避障更適用於需要快速響應的場景。 一、Lidar避障 Lidar,即激光雷達,通過激光束掃描環境獲取點雲數據,從而實…

    編程 2025-04-27
  • Switch C:多選結構的利器

    在編寫程序時,我們經常需要根據某些條件執行不同的代碼,這時就需要使用選擇結構。在C語言中,有if語句、switch語句等多種選擇結構可供使用。其中,switch語句是一種非常強大的…

    編程 2025-04-25
  • 《Windows核心編程第7版》綜述

    一、Windows核心編程第7版pdf 《Windows核心編程第7版》是由Jeffrey Richter和Christophe Nasarre共同編寫的Windows編程書籍,出…

    編程 2025-04-25
  • Python分支結構的詳細闡述

    一、if語句的基本語法 if 條件: 代碼語句1 代碼語句2 …… if語句是Python分支結構中最基本也是最常用的結構,它的基本語法如上所示。if語句會先判斷條件是否成立,如果…

    編程 2025-04-24
  • 深入理解 Vue 目錄結構

    Vue 是一款由 Evan You 開發的流行 JavaScript 框架。Vue 具有響應式視圖和組件化的思想,讓開發者可以輕鬆構建互動式的 Web 應用。那麼在 Vue 開發中…

    編程 2025-04-24
  • 短視頻同行截流

    一、截流技術概述 截流是指在數據傳輸過程中,將一部分數據截取下來然後轉發到另一個網路節點的技術。針對短視頻同行截流技術,目的在於為用戶提供更好的觀看體驗,同時避免了短視頻平台因流量…

    編程 2025-04-24
  • 媒體查詢CSS:響應式設計的核心

    一、什麼是媒體查詢CSS? 媒體查詢是CSS3中引入的一種特性,它允許我們針對不同的設備和屏幕尺寸編寫不同的樣式規則。它可以判斷用戶使用的設備特性和瀏覽器窗口大小,並針對性地載入不…

    編程 2025-04-24

發表回復

登錄後才能評論