nec*_*ato 2 c audio ffmpeg decoding
在开始编写音频混合代码之前,我正在寻求有关 ffmpeg 如何在帧中存储解码的音频数据的说明。AVFrame
有int format
和uint8_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)
这是正确的处理方式吗?
您对音频的理解似乎是正确的。对于打包格式,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)。
我不能说循环中的代码是错误的,这实际上可能会起作用,但问题是存在潜在的溢出风险,您应该实现饱和来防止它。