解码后的音频数据如何存储在 ffmpeg AVFrame 中?
Posted
技术标签:
【中文标题】解码后的音频数据如何存储在 ffmpeg AVFrame 中?【英文标题】:How is decoded audio data stored in ffmpeg AVFrame? 【发布时间】:2018-12-21 18:44:13 【问题描述】:在我开始编写代码以进行音频混合之前,我正在寻找有关 ffmpeg 如何将解码的音频数据存储在帧中的说明。 AVFrame
有 int format
和 uint8_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->data[0]
:这是你当前的音频数据缓冲区。num_samples = frame->nb_samples * frame->channels
:num_samples
这是这个缓冲区的大小(单位s16)。
我不能说循环中的代码完全错误,这实际上应该可以工作,但问题是存在潜在的溢出风险,你应该实施饱和来修复它。
希望对您有所帮助。
【讨论】:
以上是关于解码后的音频数据如何存储在 ffmpeg AVFrame 中?的主要内容,如果未能解决你的问题,请参考以下文章