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

Posted

技术标签:

【中文标题】解码后的音频数据如何存储在 ffmpeg AVFrame 中?【英文标题】:How is decoded audio data stored in ffmpeg AVFrame? 【发布时间】:2018-12-21 18:44:13 【问题描述】:

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

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;

这是正确的处理方式吗?

【问题讨论】:

【参考方案1】:

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

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

所以,在你的情况下,你已经有了你需要的东西:int16_t *audio_samples = frame-&gt;data[0]:这是你当前的音频数据缓冲区。num_samples = frame-&gt;nb_samples * frame-&gt;channelsnum_samples这是这个缓冲区的大小(单位s16)。

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

希望对您有所帮助。

【讨论】:

以上是关于解码后的音频数据如何存储在 ffmpeg AVFrame 中?的主要内容,如果未能解决你的问题,请参考以下文章

FFmpeg学习3:播放音频

FFmpeg进行音频的解码和播放

(四)Android通过ffmpeg解码音频

第十章 视频播放器开发之音频播放

ffmpeg解码后的视频帧怎样显示出来

FFmpeg: AVFrame中的data和extend_data的区别