gpt4 book ai didi

audio - Rust中的48Khz立体声大端PCM到16Khz单声道大端PCM音频

转载 作者:行者123 更新时间:2023-12-03 11:43:47 25 4
gpt4 key购买 nike

我已经为此工作了一段时间,但从未设法弄清楚如何使其工作。我有一个48Khz 16位立体声Big Endian签名PCM音频的Vec,我需要它是16Khz 16位Mono Little Endian签名PCM音频。
我曾尝试使用libsamplerate和fon装箱,但无法为它们两者都弄清楚。
目前,我能够将BE转换为LE,这是我首先要做的。然后,我想拿起Vec并将其放入包装箱的音频中:

    //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
非常感谢!

最佳答案

我认为这可能是由于输入切片的项目数量比with_i16_buffer()函数预期的要多。如果我将带有偶数个项目的向量传递给Audio::<Stereo16>::with_i16_buffer(),它可以工作,但是带有奇数个项目,则我会遇到与您相同的 panic 。如果我打印回溯,这是由with_i16_buffer:163 assert_eq!(0, bytes % size_of::<F>())中的一个断言引起的,其中F是帧大小(在本例中为Stereo16,每帧期望两个i16编号)。我猜这暗示着您拥有的数据已经是单声道吗?这里没有更多的上下文很难说。您能否提供有关输入数据的更多信息?
由于无论如何都希望输出为Mono,因此可能要使用Audio::<Mono16>::with_i16_buffer(),但是如果输入数据为立体声,则需要从数组中删除所有其他项目,然后再将其传递给with_i16_buffer()(或平均每两个i16数字在一起,或者您想转换数据)。

关于audio - Rust中的48Khz立体声大端PCM到16Khz单声道大端PCM音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66586440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com