2

我已经扩展了“libtinyalsa”(ALSA 的一个非常小的版本),其中包含一种重新采样输入和输出 PCM 音频的方法(使用 libresample,例如从 48 kHz 到 44.1 kHz)。

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

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

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

我对 C 和 PCM 没有真正的了解 - 非常欢迎简单的答案。

提前致以诚挚的问候和感谢!

4

2 回答 2

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)

例如,您可以参考Android 中的缩混效果作为示例。

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

于 2013-02-04T16:21:38.940 回答
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

于 2013-02-04T16:58:29.303 回答