解码后的音频数据如何存储在ffmpeg AVFrame中?

How is decoded audio data stored in ffmpeg AVFrame?

在我开始编写代码进行音频混合之前,我正在寻找有关 ffmpeg 如何以帧形式存储解码音频数据的说明。 AVFrameint formatuint8_t* data[] 成员。如果我的理解是正确的,那么 data 中的字节应该在使用它之前转换为 format 的正确类型。所以如果 format == AV_SAMPLE_FMT_S16 做一个简单的 2x 级别提升,我会:

int16_t* audio_samples = frame->data[0];
int num_samples = frame->nb_samples * frame->channels;
for (int i = 0; i < num_samples; ++i) {
  audio_samples[i] = audio_samples[i] * 2;
}

这是处理事情的正确方法吗?

您对音频的理解似乎是正确的。 对于像 AV_SAMPLE_FMT_S16 这样的压缩格式,你只需要 AVFrame::data[0] 而对于像 AV_SAMPLE_FMT_FLTP 这样的平面格式,你也需要其他索引。

AV_SAMPLE_FMT_S16是有符号的16位格式,这意味着每个样本都在-32768,+32767之间。

因此,就您而言,您已经拥有所需的东西:
int16_t *audio_samples = frame->data[0]: 这是您当前的音频数据缓冲区。
num_samples = frame->nb_samples * frame->channels: num_samples这里是这个缓冲区的大小(单位s16)。

我不能说你在循环中的代码是完全错误的,这实际上应该可以工作,但问题是存在潜在的溢出风险,你应该实施饱和来修复它。

希望对您有所帮助。