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.mzph.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,并在另一个核上…