在开始编写代码进行音频混合之前,我正在寻求有关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;
}
这是正确的处理方式吗?
答案 0 :(得分: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)。
我不能说循环中的代码是完全错误的,这实际上应该可以工作,但是问题是存在潜在的溢出风险,您应该实现饱和来对其进行修复。
希望有帮助。
答案 1 :(得分:0)
举起袖子并解决此类问题非常关键...您告诉我们,如果音频曲线以零为中心,曲线的一半在零以上,另一半在零以下,将会发生什么...那么,如果系统假设取而代之的是音频曲线从零到+1变化,您的上述方法可行吗?
一种好的方法是将一个已知的音频曲线发送到正在运行的程序中...要么合成该音频曲线,要么找到一个文件,或者其中音频是简单的正弦曲线,从最小到最大变化...将为您提供一个已知的起点,并使您可以回答问题。
它还有一种可视化音频曲线的方法...将其转储到文件中,然后在命令行上使用gnuplot进行绘制,或者编写一个实用程序库,您可以直接从代码中调用...在将音频输出到一个文件通常有助于将每个音频样本数据点转换为其等效的整数,然后只需绘制包含垂直整数列的文件即可... gnuplot使用单线实现此目的
这些必不可少的工具将使您独立,并极大地提高您的工作效率,使您无需等待几天就可以回答自己的问题-欢迎来到信号处理领域