从PCM中删除频道

时间:2013-02-04 15:33:04

标签: c audio pcm

我已经扩展了“libtinyalsa”(ALSA的一个非常小的版本),并提供了一种重新采样的方法。传出的PCM音频(具有libresample,例如从48 kHz到44.1 kHz)。

现在我想用“downMixing”(这是正确的词?)方法扩展它。

我有5.1声道PCM,只需要2声道立体声音频(左右):

  • 是“downMixing”正确的词?
  • 我怎么能在C中做到这一点?

我对C和PCM一无所知 - 简单的答案非常受欢迎。

亲切的问候&提前谢谢!

2 个答案:

答案 0 :(得分:3)

我相信将5.1 PCM流缩混到立体声可以这样做:

L = clamp((FL + RL + C*0.708 + LFE*0.708) / 2) 
R = clamp((FR + RR + C*0.708 + LFE*0.708) / 2)

您可以参考,例如以downmix effect in Android为例。

或者只选择您要保留的两个频道(例如FL和FR)并跳过其他频道的样本。

答案 1 :(得分:1)

5.1 PCM可能已经被编码,有效地混合到2个通道。如果是这种情况,您应该可以忽略5.1通道并将其视为两个通道。如果是这种情况,但你需要摆脱5.1 PCM的所有痕迹,而不是让它在2声道输出上正确播放,你需要先使用5.1声道解码器库。

如果你真的有一个真正的5.1声道编码输出,那么你会得到它:

for(i = 0; i < buffer_end; i += 6) {
    front_left = buffer[i + 0];
    front_right = buffer[i + 1];
    center = buffer[i + 2];
    lfe = buffer[i + 3]; // (sub-woofer)
    back_left = buffer[i + 4];
    back_right = buffer[i + 5];
}

混合将是:

left = (front_left + back_left)/2 + (lfe + front_center)/4;
right = (front_right + back_right)/2 + (lfe + front_center)/4;

将以相同的方式交错,即

output_buffer[i] = left;
output_buffer[i + 1] = right;

请注意,根据您所需的结果和约束条件,有不同的混音方式。但这是一整套蠕虫。

你也应该问问自己,你是否真的在使用正确的工具。存在所有这些事情的图书馆,ALSA本身已经能够进行相当复杂的混合。请参阅此处了解其他解决方案:http://www.halfgaar.net/surround-sound-in-linux