type
status
date
slug
summary
tags
category
icon
password
Property
Mar 25, 2023 08:46 AM
前置知识
FFmpeg 流程
从本地⽂件读取PCM数据进⾏AAC格式编码,然后将编码后的AAC数据存储到本地⽂件。
示例的流程如下所示:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fb9de8737-1823-4e7b-838d-01ff2dcbfcef%2FUntitled.png?table=block&id=96e67507-3606-48ef-9ff8-1c01eeb827a7)
对于 flush encoder的操作:
编码器通常的冲洗⽅法:调⽤⼀次 avcodec_send_frame(NULL)(返回成功),然后不停调⽤
avcodec_receive_packet() 直到其返回 AVERROR_EOF,取出所有缓存帧,avcodec_receive_packet() 返回 AVERROR_EOF 这⼀次是没有有效数据的,仅仅获取到⼀个结束标志
相关结构体
AVCodec
:是 FFmpeg 中的 libavcodec 库中定义的一个结构体,用于表示音视频编解码器的信息。- AVCodec 结构体中包含了音视频编解码器的名称、媒体类型、编解码器 ID、描述、支持的编解码器配置文件、编解码器的初始化、编码、解码、关闭和刷新函数等信息。
- 在 FFmpeg 中,可以使用 avcodec_find_decoder() 或 avcodec_find_encoder() 函数查找特定的音视频编解码器,并使用找到的编解码器的 AVCodec 结构体信息来打开编解码器并初始化编解码器上下文。
AVCodec 结构体的定义如下:
AVCodecContext
:是 FFmpeg 中的 libavcodec 库中定义的一个结构体,用于表示音视频编解码器的上下文信息。- AVCodecContext 结构体中包含了音视频编解码器的上下文信息,如比特率、帧率、像素格式、采样格式、通道布局等信息。这些信息可以被设置和读取,以控制编解码器的行为和获取编解码器的状态。
- 在 FFmpeg 中,可以使用 avcodec_alloc_context3() 函数分配一个 AVCodecContext 上下文结构体,并使用 avcodec_open2() 函数将其与特定的音视频编解码器关联。
AVCodecContext 结构体的定义如下:
PCM 样本格式
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fe22b64ba-a783-4906-a9bc-5ac4135caab8%2FUntitled.png?table=block&id=3d3850b1-e93e-4812-a8c0-2c40b2ec0b5e)
FFmpeg 支持的 PCM 数据格式
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fb68d51d9-6b06-4f6f-8922-aca98f6c8e2c%2FUntitled.png?table=block&id=cf53a247-8920-4c36-9a5f-749861b0585a)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fa8b4d219-43ac-4638-965e-f6cafa0f1954%2FUntitled.png?table=block&id=8ecac49f-8980-4b18-b3b1-f4487e0f1575)
s是有符号,u是无符号,f是浮点数。
be是⼤端,le是小端。
FFmpeg 中 Packed 和 Planar 的 PCM 数据区别
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F8a12d3e8-e6bd-46d0-b3c9-e4e0c465f401%2FUntitled.png?table=block&id=efafb846-ee00-4aa8-a855-1dd608c529a0)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F5eadfb09-7d8f-4d6e-892d-7973dbe77ace%2FUntitled.png?table=block&id=33b7ff84-582a-4c52-88ff-5296ad5b96f8)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F79cf85b2-548c-45e4-87dd-2ceff7a1d483%2FUntitled.png?table=block&id=7d6b7716-398b-4760-a8b8-32778c10ae53)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fff64c97c-1973-4472-a974-dccd6b7efdf9%2FUntitled.png?table=block&id=c7b8a90c-d91e-427c-b661-19bbdc3a8f4e)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F7b6b2672-fb2b-4736-858a-21783ac63ca0%2FUntitled.png?table=block&id=4942068b-6f3f-4ca2-ae4b-b1e5eea05acc)
PCM 字节序
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F74b714e3-3aba-4142-b954-3e90bf8709ee%2FUntitled.png?table=block&id=f754fda3-8e0e-4843-9624-80bac0ad8b35)
libfdk_aac 编码器
libfdk_aac 是一种高质量的 AAC 音频编码器,是 Fraunhofer Gesellschaft 开发的自由软件库,用于编码高品质的音频流,特别适用于音乐流媒体和高保真音频存储。它可以产生比许多其他 AAC 编码器更高的音频质量,并具有更高的编码效率。
PCM 编码为 AAC 代码
check_sample_fmt()
:检测该编码器是否支持该采样格式
相关依据为源码中的定义:以 AV_SAMPLE_FMT_NONE 为结尾
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F5c668935-abda-41bc-b438-f549bb91f521%2FUntitled.png?table=block&id=611f0812-ebea-4052-9350-4e1ab00a4fbc)
check_sample_rate()
: 检测该编码器是否支持该采样率
相关依据为源码中的定义:以 0 为结尾
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fa7712b35-a255-4009-a548-429cf22daabc%2FUntitled.png?table=block&id=ef18c088-5a79-4e1c-9164-1dd22b74cba2)
check_channel_layout()
:检查该编解码器是否支持特定的声道布局
需要注意的是,并不是每个编解码器都会提供支持的声道布局列表,因此该函数只能用作参考,而不是确定该编解码器是否支持特定声道布局的唯一方法。
- 作者:OctalZero
- 链接:https://octalzero.com/article/88a0d789-5f79-46d9-8706-2c5f063a5157
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章