Audio 48Khz立体声大端PCM至16Khz单声道大端PCM音频输入

Audio 48Khz立体声大端PCM至16Khz单声道大端PCM音频输入,audio,rust,Audio,Rust,我在这方面已经做了一段时间了,但从来没有想到如何让它工作。我有一个48Khz 16位立体声大端符号PCM音频的Vec,我需要这是16Khz 16位单声道小端符号PCM音频 我试过使用libsamplerate和fon板条箱,但我无法为它们找到答案 目前我可以将BE转换为LE,这是我首先做的。然后我想把Vec放在fon板条箱的音频中: //输入数据不正确 让mut input=crate::jni_util::jarray_to_vec::(env,jshort_数组)。expect(“转换输入数

我在这方面已经做了一段时间了,但从来没有想到如何让它工作。我有一个48Khz 16位立体声大端符号PCM音频的Vec,我需要这是16Khz 16位单声道小端符号PCM音频

我试过使用libsamplerate和fon板条箱,但我无法为它们找到答案

目前我可以将BE转换为LE,这是我首先做的。然后我想把Vec放在fon板条箱的音频中:

//输入数据不正确
让mut input=crate::jni_util::jarray_to_vec::(env,jshort_数组)。expect(“转换输入数据时出错!”);
//首先将endianness从BE更改为LE
LittleEndian::from_slice_i16(&mut input.as_mut_slice());
//从48Khz立体声的输入数据中获取音频对象
让input_buf=Audio:::带有_i16_缓冲区(48_000,input.as_slice());
它在最后一行失败了,
在“断言失败:”(left==right)
时惊慌失措,这对我来说没有任何意义。在立体声信号中,为什么左声道与右声道相等

任何帮助都是非常感谢的,我已经在这个问题上被困太久了


非常感谢!

我认为这可能是因为输入片的项目数不均匀,超出了with_i16_buffer()函数的预期。如果我将向量传递给
音频:::with_i16_buffer()函数
对于偶数个项目,它可以工作,但是对于奇数个项目,我会得到与您相同的恐慌。如果我打印回溯,它是由带有i16缓冲区的断言引起的:163
assert_eq!(0,bytes%size_of::())
其中F是帧大小(在本例中为Stereo16,每帧需要两个i16数字).我想这意味着你的数据已经是单声道的了?如果没有更多的上下文,很难判断。你能提供一些关于输入数据的更多信息吗


由于您希望输出无论如何都是单声道的,因此您可能希望使用
音频:::with_i16_buffer()
,但是如果输入数据是立体声的,则需要在使用_i16_buffer()将其传递到数组之前删除数组中的所有其他项(或者平均每两个i16数字,或者以任何方式转换数据).

Hm我自己也没想到会出现这样的问题。输入音频来自Discord,应该是48Khz 16位立体声交错带符号pcm音频。我会试一试单声道,看看会发生什么,否则从阵列末端移除一个元素可能没什么问题,因为一个元素不会产生一个信号语言上有很大的不同。不是最干净的解决方案,而是