ffmpeg編解碼器相關函數

文章目錄

    • 🎯 你需要理解的核心結構體:
    • 📦 常用函數及使用順序(以解碼為例)
      • 1?? `avcodec_find_decoder()` / `avcodec_find_encoder()`
      • 2?? `avcodec_alloc_context3()`
      • 3?? `avcodec_parameters_to_context()`
      • 4?? `avcodec_open2()`
      • 5?? `avcodec_send_packet()`(解碼)
      • 6?? `avcodec_receive_frame()`(解碼)
    • 🔁 對于編碼流程:
    • 🧹 最后清理函數
    • ? 編解碼核心流程總結(解碼):
      • 1. **AVFormatContext**
      • 2. **AVInputFormat**
      • 3. **AVStream**
      • 4. **AVCodecContext**
      • 5. **AVCodec**
      • 6. **AVPacket**
      • 7. **AVFrame**
      • 典型工作流程



🎯 你需要理解的核心結構體:

結構體名作用
AVCodec表示一個具體的編解碼器(如 H264 解碼器)
AVCodecContext編解碼器上下文,保存編解碼過程中的狀態和參數
AVCodecParameters存儲編碼參數,來自媒體容器(需要轉換為 AVCodecContext)
AVPacket表示壓縮的數據包(來自媒體文件或編碼后)
AVFrame表示解碼后的原始幀(音頻/視頻)

📦 常用函數及使用順序(以解碼為例)

1?? avcodec_find_decoder() / avcodec_find_encoder()

查找指定類型的編解碼器(如 H264 解碼器)

const AVCodec *codec = avcodec_find_decoder(codec_id);
  • codec_id:如 AV_CODEC_ID_H264, AV_CODEC_ID_AAC
  • 返回 AVCodec*,如果找不到返回 NULL

2?? avcodec_alloc_context3()

創建并初始化一個 AVCodecContext,用于后續打開編解碼器。

AVCodecContext *codec_ctx = avcodec_alloc_context3(codec);

3?? avcodec_parameters_to_context()

AVFormatContext 中的 AVCodecParameters 拷貝到 AVCodecContext

avcodec_parameters_to_context(codec_ctx, codecpar);
  • codecpar 來自 AVFormatContext->streams[i]->codecpar

4?? avcodec_open2()

打開編解碼器,準備進行解碼或編碼。

avcodec_open2(codec_ctx, codec, NULL);

5?? avcodec_send_packet()(解碼)

發送壓縮包(如視頻數據包)給解碼器處理。

avcodec_send_packet(codec_ctx, &pkt);
  • 解碼器內部有緩存,你可能需要多次調用 receive_frame

6?? avcodec_receive_frame()(解碼)

從解碼器中取出解碼好的幀。

ret = avcodec_receive_frame(codec_ctx, frame);
  • 當返回 AVERROR(EAGAIN),表示還需要更多數據才能解出新幀
  • AVFrame 結構保存了解碼后的一幀音視頻數據(如 YUV 圖像或 PCM 音頻)

🔁 對于編碼流程:

  1. 創建 AVFrame(填充原始音視頻數據)
  2. 調用 avcodec_send_frame() 送幀進去
  3. 調用 avcodec_receive_packet() 取出壓縮后的 AVPacket

🧹 最后清理函數

  • avcodec_free_context(&codec_ctx);
  • av_frame_free(&frame);
  • av_packet_unref(&packet);(或 av_packet_free()

? 編解碼核心流程總結(解碼):

// 1. 找到解碼器
const AVCodec *codec = avcodec_find_decoder(codec_id);// 2. 分配上下文
AVCodecContext *codec_ctx = avcodec_alloc_context3(codec);// 3. 從 AVCodecParameters 拷貝參數
avcodec_parameters_to_context(codec_ctx, codecpar);// 4. 打開解碼器
avcodec_open2(codec_ctx, codec, NULL);// 5. 循環解碼
while (av_read_frame(fmt_ctx, &pkt) >= 0) {if (pkt.stream_index == video_stream_index) {avcodec_send_packet(codec_ctx, &pkt);while (avcodec_receive_frame(codec_ctx, frame) == 0) {// 處理解碼后的 frame,比如顯示或保存}}av_packet_unref(&pkt);
}// 6. 清理資源
avcodec_free_context(&codec_ctx);

在 FFmpeg 中,處理音視頻數據的各個組件是基于不同的結構體來管理的。這里我會簡要講解一下與音視頻解復用、編碼解碼相關的結構體,重點關注 AVFormatContextAVInputFormatAVStreamAVCodecContextAVCodecAVPacketAVFrame 等。

1. AVFormatContext

AVFormatContext 是 FFmpeg 中的核心結構體之一,它表示多媒體文件的封裝格式上下文。它用于管理和存儲整個媒體文件的各種信息,如文件格式、流信息、解復用器等。它是解碼過程中最為關鍵的結構體之一。

  • 字段簡介

    • format_name:媒體文件的格式名稱(例如 MP4、AVI)。
    • pb:指向輸入流的指針,用于讀取數據。
    • streams:指向 AVStream 結構體的數組,表示文件中的每一個流(視頻流、音頻流等)。
    • flags:文件格式的標志。
    • nb_streams:流的數量。

    AVFormatContext 用于存儲和管理與文件格式相關的上下文信息。每當你打開一個文件(通過 avformat_open_input 函數),都會創建一個 AVFormatContext

2. AVInputFormat

AVInputFormat 是一個輸入格式的抽象層,它定義了如何解復用一個媒體文件的格式。每個格式(如 MP4、AVI、MKV)都對應一個 AVInputFormat

  • 功能

    • 用于定義如何打開、讀取和解碼媒體文件(即數據流的讀取和分割方式)。
    • 它包含一組回調函數,如 read_header(讀取文件頭)、read_packet(讀取數據包)、close(關閉文件)。

    AVInputFormat 是 FFmpeg 在解復用過程中使用的一個接口,用于解析不同的文件格式。

3. AVStream

AVStream 表示媒體流(如視頻流或音頻流),它通常是 AVFormatContext 結構體中的一個成員。每個 AVStream 描述了一個流的所有信息,例如編碼參數、流類型等。

  • 字段簡介

    • codecpar:指向 AVCodecParameters 的指針,包含了流的編解碼參數。
    • codec:指向 AVCodecContext 的指針,存儲該流的解碼上下文。
    • time_base:時間基準,用于表示時間戳(即時間單位)。

    每個媒體文件可能包含多個流,如視頻流、音頻流、字幕流等,AVStream 就是用來存儲這些流的信息。

4. AVCodecContext

AVCodecContext 是解碼和編碼的上下文,它包含了與特定解碼器或編碼器相關的所有信息。每個流(如視頻流、音頻流)通常都會有一個對應的 AVCodecContext

  • 字段簡介

    • codec:指向 AVCodec 的指針,表示該流的解碼器或編碼器。
    • widthheight:視頻流的分辨率(僅對視頻流有效)。
    • sample_rate:音頻流的采樣率。
    • bit_rate:音視頻流的比特率。

    AVCodecContext 是配置編解碼器時的關鍵結構體,包含了用于解碼或編碼的參數和信息。

5. AVCodec

AVCodec 是一個解碼器或編碼器的實現結構體。FFmpeg 支持大量的視頻和音頻編碼格式,每種編碼格式都對應一個 AVCodec 實現。

  • 字段簡介

    • name:解碼器或編碼器的名稱(例如 H.264、AAC)。
    • id:該解碼器或編碼器的唯一標識符。
    • type:解碼器或編碼器的類型(音頻、視頻、字幕等)。

    AVCodec 是實現具體編解碼操作的核心,它提供了操作數據流的接口,如 decodeencode 函數。

6. AVPacket

AVPacket 是一個數據包,它表示了經過解復用后的數據。解復用器將文件中的媒體流拆分成多個數據包,編碼器或解碼器將這些數據包傳遞給編解碼器進行解碼或編碼。

  • 字段簡介

    • data:指向數據的指針,存儲音視頻數據。
    • size:數據的大小(字節數)。
    • ptsdts:時間戳,表示數據的呈現時間和解碼時間。

    AVPacket 是傳遞音視頻數據的核心結構,通常在解碼或編碼時作為數據傳輸的載體。

7. AVFrame

AVFrame 是解碼后的幀數據結構,它存儲了音視頻解碼后的數據(例如視頻幀或音頻樣本)。

  • 字段簡介

    • data:指向音視頻幀數據的指針。
    • linesize:每行數據的大小,用于視頻數據。
    • widthheight:視頻幀的分辨率。
    • nb_samples:音頻幀的樣本數量。

    AVFrame 是音視頻數據處理的主要結構體,解碼后的視頻幀或音頻樣本通常存儲在此結構體中。

典型工作流程

  1. 打開文件:使用 avformat_open_input 打開媒體文件,獲取 AVFormatContext
  2. 讀取頭部信息:通過 avformat_find_stream_info 獲取流的信息。
  3. 查找解碼器:根據流類型(視頻流或音頻流),使用 avcodec_find_decoder 查找相應的解碼器。
  4. 打開解碼器:使用 avcodec_open2 打開解碼器,獲得 AVCodecContext
  5. 解碼數據:通過 av_read_frame 讀取每個數據包(AVPacket),然后通過 avcodec_receive_frame 解碼并存儲到 AVFrame
  6. 處理解碼后的數據:解碼后的數據可以用于播放或其他操作。

這些結構體和相關的 API 是 FFmpeg 進行音視頻處理的核心部分。希望這些解釋能幫助你更好地理解 FFmpeg 的基本流程和相關結構體。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/76552.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76552.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76552.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

尚硅谷2019版Java網絡編程筆記

第14章 網絡編程 網絡編程概述 什么是網絡編程? 網絡編程是通過網絡協議實現計算機之間的數據交換。Java提供了強大的網絡編程支持,隱藏了底層細節,開發者可以輕松實現網絡通信。 網絡編程的核心問題 如何定位網絡上的主機:通…

解決【遠程主機可能不符合 glibc 和 libstdc++ Vs code 服務器的先決條件】

可能是因為vscode不支持遠程操作系統的版本,要么升級操作系統要么回退vscode版本 vscode回退1.97版本下載地址: 1.97版本VSCODE

forms+windows添加激活水印

formswindows添加激活水印 多語言水印文本,根據系統語言自動切換。水印顯示在每個屏幕的右下角,位置動態調整。半透明灰色文字,微軟雅黑字體。窗口無邊框、置頂、透明背景,不干擾用戶操作。支持多顯示器。高DPI適配。 效果圖&am…

LeetCode --- 444 周賽

題目列表 3507. 移除最小數對使數組有序 I 3508. 設計路由器 3509. 最大化交錯和為 K 的子序列乘積 3510. 移除最小數對使數組有序 II 一、移除最小數對使數組有序 I & II 由于數組是給定的,所以本題的操作步驟是固定的,我們只要能快速模擬操作的過…

限流、降級、熔斷、隔離?

在微服務架構中,服務限流、降級、熔斷和隔離是保障系統高可用性的核心手段,但它們解決的問題和應用場景不同。以下是它們的區別、解決方案和實際案例的詳細說明: 一、服務限流(Rate Limiting) 定義:通過限…

Day22 -php開發01--留言板+知識點(超全局變量 文件包含 數據庫操作 第三方插件)

環境要求:php7.0.9 小皮 navicat phpstorm24.1 知識點:會寫(留言板 留言板后臺) 超全局變量 三方插件的使用 文件包含 1、開啟小皮并利用navicat新建一個數據庫 注意:本地的服務mysql關閉后 才可打開小皮。屬…

制造一只電子喵 (qwen2.5:0.5b 微調 LoRA 使用 llama-factory)

AI (神經網絡模型) 可以認為是計算機的一種新的 “編程” 方式. 為了充分利用計算機, 只學習傳統的編程 (編程語言/代碼) 是不夠的, 我們還要掌握 AI. 本文以 qwen2.5 和 llama-factory 舉栗, 介紹語言模型 (LLM) 的微調 (LoRA SFT). 為了方便上手, 此處選擇使用小模型 (qwen2…

LeetCode 解題思路 37(Hot 100)

解題思路: 初始化: 初始化最大舉行 max 和棧 stack。左右補零: 考慮柱子遞增的邊界情況, 初始化填充柱狀圖 newHeights。遍歷處理: 對于每一根遍歷到的柱子 newHeights[i],若柱子高度小于棧口索引&#xf…

HTML — 過渡與動畫

HTML過渡與動畫是提升網頁交互體驗的核心技術,主要通過CSS實現動態效果。 過渡 CSS過渡(Transition)介紹 適用于元素屬性變化時的平滑漸變效果,如懸停變色、尺寸調整。通過定義transition-property(過渡屬性&#xf…

跨站請求是什么?

介紹 跨站請求(Cross-Site Request)通常是指瀏覽器在訪問一個網站時,向另一個域名的網站發送請求的行為。這個概念在 Web 安全中非常重要,尤其是在涉及到“跨站請求偽造(CSRF)”和“跨域資源共享&#xff…

Web攻防—SSRF服務端請求偽造Gopher偽協議無回顯利用

前言 重學Top10的第二篇,希望各位大佬不要見笑。 SSRF原理 SSRF又叫服務端請求偽造,是一種由服務端發起的惡意請求,SSRF發生在應用程序允許攻擊者誘使服務器向任意域或資源發送未經授權的請求時。服務器充當代理,執行攻擊者構造…

Hibernate:讓對象與數據庫無縫對話的全自動ORM框架

一、為什么需要全自動ORM? 在手動編寫SQL的時代,開發者需要在Java代碼和數據庫表之間來回切換: // Java對象 public class User {private Long id;private String name;// getters and setters }// SQL語句 SELECT * FROM user WHERE id ?…

C語言超詳細指針知識(一)

通過前面一段時間C語言的學習,我們了解了數組,函數,操作符等的相關知識,今天我們將要開始進行指針的學習,這是C語言中較難掌握的一個部分,一定要認真學習!!! 1.內存與地址…

程序化廣告行業(70/89):ABTester系統助力落地頁優化實踐

程序化廣告行業(70/89):ABTester系統助力落地頁優化實踐 在程序化廣告領域摸爬滾打多年,深知持續學習和知識共享的重要性。寫這篇博客,就是希望能和大家一起深入探索程序化廣告行業,共同學習、共同進步。今…

項目管理(高軟56)

系列文章目錄 項目管理 文章目錄 系列文章目錄前言一、進度管理二、配置管理三、質量四、風險管理五、真題總結 前言 本節主要講項目管理知識,這些知識聽的有點意思啊。對于技術人想創業,單干的都很有必要聽聽。 一、進度管理 二、配置管理 三、質量 四…

常見的后綴名

.exe .exe(“executable”(可執行的))是 Windows 操作系統中最常見的可執行文件擴展名。此類文件包含了計算機能夠直接運行的機器碼指令。當用戶雙擊 .exe 文件時,操作系統會讀取其中的指令并執行相應的程序或任務。…

XILINX DDR3專題---(1)IP核時鐘框架介紹

1.什么是Reference Clock,這個時鐘一定是200MHz嗎? 2.為什么APP_DATA是128bit,怎么算出來的? 3.APP :MEM的比值一定是1:4嗎? 4.NO BUFFER是什么意思? 5.什么情況下Reference Clock的時鐘源可…

Doris 安裝部署、實際應用及優化實踐:對比 ClickHouse 的深度解析

在實時分析、報表系統以及高并發 OLAP 查詢等場景中,列式存儲數據庫因其卓越的查詢性能逐漸成為主流。Doris 和 ClickHouse 是近年來最受歡迎的兩款開源 OLAP 引擎,本文將系統介紹 Doris 的安裝部署、應用場景及優化實踐,并與 ClickHouse 做一…

OracleLinuxR5U5系統重啟后啟動數據庫oracle23ai

1、切換到oracle用戶 [rootOracleLinux-R9-U5 ~]# su oracle2、查看oracle是否配置了ORACLE_SID [oracleOracleLinux-R9-U5 root]$ cd ~ [oracleOracleLinux-R9-U5 ~]$ cat .bash_profile3、輸出內容如下: [oracleOracleLinux-R9-U5 ~]$ cat .bash_profile # .ba…

【正點原子】STM32MP257 同構多核架構下的 ADC 電壓采集與處理應用開發實戰

在嵌入式系統中,ADC模擬電壓的讀取是常見的需求。如何高效、并發、且可控地完成數據采集與處理?本篇文章通過雙線程分別綁定在 Linux 系統的不同 CPU 核心上,采集 /sys/bus/iio 接口的 ADC 原始值與縮放系數 scale,并在另一個核上…