type
status
date
slug
summary
tags
category
icon
password
Property
Mar 25, 2023 08:46 AM
前置知识

FFmpeg 流程

从本地⽂件读取PCM数据进⾏AAC格式编码,然后将编码后的AAC数据存储到本地⽂件。 示例的流程如下所示:
notion image
对于 flush encoder的操作
编码器通常的冲洗⽅法:调⽤⼀次 avcodec_send_frame(NULL)(返回成功),然后不停调⽤ avcodec_receive_packet() 直到其返回 AVERROR_EOF,取出所有缓存帧,avcodec_receive_packet() 返回 AVERROR_EOF 这⼀次是没有有效数据的,仅仅获取到⼀个结束标志

相关结构体

  • AVCodec :是 FFmpeg 中的 libavcodec 库中定义的一个结构体,用于表示音视频编解码器的信息。
    • AVCodec 结构体的定义如下:
    • AVCodec 结构体中包含了音视频编解码器的名称、媒体类型、编解码器 ID、描述、支持的编解码器配置文件、编解码器的初始化、编码、解码、关闭和刷新函数等信息。
    • 在 FFmpeg 中,可以使用 avcodec_find_decoder() 或 avcodec_find_encoder() 函数查找特定的音视频编解码器,并使用找到的编解码器的 AVCodec 结构体信息来打开编解码器并初始化编解码器上下文。
  • AVCodecContext :是 FFmpeg 中的 libavcodec 库中定义的一个结构体,用于表示音视频编解码器的上下文信息。
    • AVCodecContext 结构体的定义如下:
    • AVCodecContext 结构体中包含了音视频编解码器的上下文信息,如比特率、帧率、像素格式、采样格式、通道布局等信息。这些信息可以被设置和读取,以控制编解码器的行为和获取编解码器的状态。
    • 在 FFmpeg 中,可以使用 avcodec_alloc_context3() 函数分配一个 AVCodecContext 上下文结构体,并使用 avcodec_open2() 函数将其与特定的音视频编解码器关联。

PCM 样本格式

notion image

FFmpeg 支持的 PCM 数据格式

notion image
notion image
s是有符号,u是无符号,f是浮点数。 be是⼤端,le是小端。

FFmpeg 中 Packed 和 Planar 的 PCM 数据区别

notion image
notion image
notion image
notion image
notion image

PCM 字节序

notion image

libfdk_aac 编码器

libfdk_aac 是一种高质量的 AAC 音频编码器,是 Fraunhofer Gesellschaft 开发的自由软件库,用于编码高品质的音频流,特别适用于音乐流媒体和高保真音频存储。它可以产生比许多其他 AAC 编码器更高的音频质量,并具有更高的编码效率。

PCM 编码为 AAC 代码

  • check_sample_fmt()检测该编码器是否支持该采样格式
    • 相关依据为源码中的定义:以 AV_SAMPLE_FMT_NONE 为结尾
      notion image
  • check_sample_rate() : 检测该编码器是否支持该采样率
    • 相关依据为源码中的定义:以 0 为结尾
notion image
  • check_channel_layout():检查该编解码器是否支持特定的声道布局
    • 需要注意的是,并不是每个编解码器都会提供支持的声道布局列表,因此该函数只能用作参考,而不是确定该编解码器是否支持特定声道布局的唯一方法。
 
FFmpeg 视频编码MSYS2 编译 FFmpeg 库