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

C 解码后的音频数据如何存储在ffmpeg AVFrame中?,c,audio,ffmpeg,decoding,C,Audio,Ffmpeg,Decoding,在我开始编写音频混音代码之前,我正在寻找关于ffmpeg如何在帧中存储解码音频数据的澄清。AVFrame具有int格式和uint8_t*数据[]成员。如果我的理解是正确的,那么在使用数据之前,应该将数据中的字节转换为适当的格式类型。因此,如果format==AV_SAMPLE_FMT_S16,那么要实现一个简单的2x级提升,我会: int16_t* audio_samples = frame->data[0]; int num_samples = frame->nb_samples

在我开始编写音频混音代码之前,我正在寻找关于ffmpeg如何在帧中存储解码音频数据的澄清。AVFrame具有int格式和uint8_t*数据[]成员。如果我的理解是正确的,那么在使用数据之前,应该将数据中的字节转换为适当的格式类型。因此,如果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\u t*audio\u samples=frame->data[0]:这是您当前的音频数据缓冲区。 num_samples=frame->nb_samples*frame->channels:num_samples这里是这个缓冲单元s16的大小

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


希望能有所帮助。

您对音频的理解似乎是正确的。 对于压缩格式(如AV_SAMPLE_FMT_S16),您只需要AVFrame::data[0],对于平面格式(如AV_SAMPLE_FMT_FLTP),您还需要其他索引

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

因此,在您的情况下,您已经拥有了您所需要的: int16\u t*audio\u samples=frame->data[0]:这是您当前的音频数据缓冲区。 num_samples=frame->nb_samples*frame->channels:num_samples这里是这个缓冲单元s16的大小

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

希望有帮助