从PCM中删除通道

从PCM中删除通道,c,audio,pcm,C,Audio,Pcm,我扩展了“libtinyalsa”(ALSA的一个非常小的版本),使用一种方法对输入和输出PCM音频进行重新采样(使用libresample,例如从48 kHz到44.1 kHz) 现在我想用一个“下混”(这个词对吗?)方法来扩展它 我有5.1声道PCM,只需要2声道立体声音频(左和右): “向下混合”这个词对吗 我怎样才能用C来做这个 我对C和PCM没有真正的了解-简单的答案是非常受欢迎的 带着亲切的问候和提前的感谢 我相信将5.1 PCM流下混音到立体声可以这样做: L = clamp(

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

现在我想用一个“下混”(这个词对吗?)方法来扩展它

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

  • “向下混合”这个词对吗
  • 我怎样才能用C来做这个
我对C和PCM没有真正的了解-简单的答案是非常受欢迎的


带着亲切的问候和提前的感谢

我相信将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)
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];
}
例如,您可以参考以获取此示例


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

我认为将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)
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];
}
例如,您可以参考以获取此示例


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

5.1 PCM可能已经进行了编码,从而有效地混合到2个通道。如果是这种情况,您应该能够忽略5.1通道,并将其视为两个通道。如果是这种情况,但您需要消除5.1 PCM的所有跟踪,而不仅仅是让它在2通道输出上正确播放,您需要首先使用5.1通道解码器库

如果您确实有一个真正的5.1通道编码输出,那么您将得到如下结果:

L = clamp((FL + RL + C*0.708 + LFE*0.708) / 2) 
R = clamp((FR + RR + C*0.708 + LFE*0.708) / 2)
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];
}
将以相同的方式交错,即

output_buffer[i] = left;
output_buffer[i + 1] = right;
请注意,根据所需的结果和约束,有不同的混合方式。但那是一整罐虫子


你还应该问问自己,你是否真的在使用适合这份工作的工具。现有的库可以完成所有这些事情,而ALSA本身已经具备了相当复杂的混合能力。有关其他一些解决方案,请参见此处:

5.1 PCM的编码方式可能已经使其有效地混合为2个通道。如果是这种情况,您应该能够忽略5.1通道,并将其视为两个通道。如果是这种情况,但您需要消除5.1 PCM的所有跟踪,而不仅仅是让它在2通道输出上正确播放,您需要首先使用5.1通道解码器库

如果您确实有一个真正的5.1通道编码输出,那么您将得到如下结果:

L = clamp((FL + RL + C*0.708 + LFE*0.708) / 2) 
R = clamp((FR + RR + C*0.708 + LFE*0.708) / 2)
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];
}
将以相同的方式交错,即

output_buffer[i] = left;
output_buffer[i + 1] = right;
请注意,根据所需的结果和约束,有不同的混合方式。但那是一整罐虫子


你还应该问问自己,你是否真的在使用适合这份工作的工具。现有的库可以完成所有这些事情,而ALSA本身已经具备了相当复杂的混合能力。有关其他解决方案,请参见此处:

非常感谢您的Android示例,我认为它可以帮助我。非常感谢您的Android示例,我认为它可以帮助我。感谢您的示例,这是一个良好的开端。我会试试我的运气:)谢谢你的例子,这是一个好的开始。我会试试我的运气:)