我已经在这方面工作了一段时间,但一直没有想出如何让它工作。我有一个48 this的Vec 16位立体声大端签名PCM音频,我需要这是16千赫16位单声道小端签名PCM音频。
我尝试过使用libsamplerate和fon板条箱,但我无法同时使用这两种工具。
目前,我可以将BE转换为LE,这是我首先要做的。然后我想将Vec放入fon机箱中的音频中:
//Input data is BE
let mut input = crate::jni_util::jarray_to_vec::<i16>(env, jshort_array).expect("Something went wrong converting the input data!");
//First change the endianness from BE to LE
LittleEndian::from_slice_i16(&mut input.as_mut_slice());
//Get an Audio<Stereo16> object from the input data at 48Khz Stereo
let input_buf = Audio::<Stereo16>::with_i16_buffer(48_000, input.as_slice());它在panicked at 'assertion failed: '(left == right)'的最后一行失败了,这对我来说没有任何意义。在立体声信号中,为什么左声道等于右声道?
任何帮助都是非常感谢的,我已经在这个问题上纠结太久了:"D
非常感谢!
发布于 2021-03-12 08:15:46
我认为这可能是由于输入切片的条目数量不同于with_i16_buffer()函数所期望的数量。如果我向Audio::<Stereo16>::with_i16_buffer()传递一个包含偶数个项目的向量,它可以工作,但是当项目数量为奇数时,我会得到与您相同的恐慌。如果我打印回溯,它是由with_i16_buffer:163 assert_eq!(0, bytes % size_of::<F>())中的断言引起的,其中F是帧大小(在本例中是Stereo16,它要求每帧有两个i16编号)。我猜这在某种程度上意味着你的数据已经是单声道了?在这里如果没有更多的上下文就很难判断。你能提供更多关于输入数据的信息吗?
因为您希望输出是单声道的,所以您可能希望使用Audio::<Mono16>::with_i16_buffer(),但是如果输入数据是立体声的,那么在将其传递给with_i16_buffer()之前,您需要从数组中删除每隔一项(或者每两个i16数字加在一起求平均,或者以任何您想要转换数据的方式)。
https://stackoverflow.com/questions/66586440
复制相似问题