0

我有 2 个或更多音频帧,其结构如下:

   int sample_rate;    // The sample-rate of this buffer (48000 or 44100 normaly)
   int no_channels;    // The number of audio channels
   int no_samples;     // The number of audio samples per channel (n elements in data array)
   float* p_data;      // The audio data

添加 2 个音频缓冲区非常简单:frameInput1; 帧输入2;

    frameOutput.sample_rate = 48000;
    frameOutput.no_channel = 1;
    frameOutput.no_sample = 1000;
    frameOutput.p_data = (float*)malloc(frameOutput.no_sample * frameOutput.no_channel * sizeof(float))

    for(int i=0; i<frameOutput.no_sample; i++){
         frameOutput.p_data[i] = frameInput1.p_data[i] + frameInput2.p_data[i];
     }

我创建了一个具有相同样本的音频缓冲区,并为数据数组中的每个样本添加了输入帧

但是如果我有不同 no_sample 或不同 sample_rate 的音频缓冲区?

例如:

     input1.sample_rate = 48000hz; input1.no_sample = 1000 ;
     input2.sample_rate = 44100hz; input2.no_sample = 600 ;

如何添加这两个输入?

4

2 回答 2

0

只需根据 sample_rate 缩放缓冲区中的地址:

float in1_rate_scale = float(input1.sample_rate) / frameOutput.sample_rate;
float in2_rate_scale = float(input2.sample_rate) / frameOutput.sample_rate;

for (int i = 0; i < frameOutput.no_sample; i++) {
    frameOutput.p_data[i] = frameInput1.p_data[i*in1_rate_scale] + frameInput2.p_data[i * in2_rate_scale];
}

无论如何,请记住,仅添加“音量”值是错误的,当两个缓冲区中的响度最大时,您很容易溢出。但这是另一个问题,也是你面临的另一个问题。

于 2021-09-04T22:58:16.090 回答
0

我假设您的程序正在处理两个音频流,每个流都为您提供一系列音频缓冲区。

如果是这样,那么每个缓冲区中的音频帧数不是音频的基本特征,而只是音频样本如何打包在一起的副作用(例如,流 A 的生产者决定放置 1000 个样本一起放入一个缓冲区,而流 B 的生产者决定只将 600 个样本放在一起)。

理想情况下,您可以告诉您的两个流生产者为您提供具有固定(且相等)帧数的音频缓冲区,以便您可以逐字添加样本,但如果您不能让他们这样做,那么您将需要实现某种缓冲机制,将来自两个缓冲区中较大者的“额外”帧保存在某种 FIFO 队列中,然后将它们用作下一次混合操作中的第一个样本。这可能会有点复杂,所以除非性能是您最关心的问题,否则我建议只保留音频帧的 FIFO 队列(例如std::dequeue<float>或类似)对于每个输入流,并始终将所有新接收到的音频帧从该输入流推送到该 FIFO 队列的尾部,然后在需要时根据需要从每个 FIFO 队列的头部弹出帧将音频混合在一起。这样,您就可以将音频的混合与输入音频缓冲区的大小分离,这样无论输入流为您生成什么,您的混合代码都可以正常工作。(请注意,您可以产生的输出/混合音频缓冲区的最大大小将等于当时最短 FIFO 队列中的音频帧数)

处理不同的采样率是一个更难解决的问题,特别是如果您希望输出音频具有良好的音质。为了正确处理它,您需要使用采样率转换器算法(例如libsamplerate)将一个流的采样率转换为等于另一个流的采样率(或者如果您愿意, 将两个流的采样率转换为等于输出流的采样率)。完成此操作后,您可以像以前一样将两个匹配速率的流逐个样本添加在一起。

于 2021-09-04T23:44:00.597 回答