解码后的音频数据如何存储在ffmpeg AVFrame中?
How is decoded audio data stored in ffmpeg AVFrame?
在我开始编写代码进行音频混合之前,我正在寻找有关 ffmpeg 如何以帧形式存储解码音频数据的说明。 AVFrame
有 int format
和 uint8_t* data[]
成员。如果我的理解是正确的,那么 data
中的字节应该在使用它之前转换为 format
的正确类型。所以如果 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_t *audio_samples = frame->data[0]
: 这是您当前的音频数据缓冲区。
num_samples = frame->nb_samples * frame->channels
: num_samples
这里是这个缓冲区的大小(单位s16)。
我不能说你在循环中的代码是完全错误的,这实际上应该可以工作,但问题是存在潜在的溢出风险,你应该实施饱和来修复它。
希望对您有所帮助。
在我开始编写代码进行音频混合之前,我正在寻找有关 ffmpeg 如何以帧形式存储解码音频数据的说明。 AVFrame
有 int format
和 uint8_t* data[]
成员。如果我的理解是正确的,那么 data
中的字节应该在使用它之前转换为 format
的正确类型。所以如果 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_t *audio_samples = frame->data[0]
: 这是您当前的音频数据缓冲区。
num_samples = frame->nb_samples * frame->channels
: num_samples
这里是这个缓冲区的大小(单位s16)。
我不能说你在循环中的代码是完全错误的,这实际上应该可以工作,但问题是存在潜在的溢出风险,你应该实施饱和来修复它。
希望对您有所帮助。