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

nec*_*ato 2 c audio ffmpeg decoding

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

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;
}
Run Code Online (Sandbox Code Playgroud)

这是正确的处理方式吗?

the*_*ilz 5

您对音频的理解似乎是正确的。对于打包格式,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->channelsnum_samples这是该缓冲区的大小(单位 s16)。

我不能说循环中的代码是错误的,这实际上可能会起作用,但问题是存在潜在的溢出风险,您应该实现饱和来防止它。