首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >48 PCM立体声大端PCM到16 PCM单声道大端PCM音频

48 PCM立体声大端PCM到16 PCM单声道大端PCM音频
EN

Stack Overflow用户
提问于 2021-03-12 00:21:39
回答 1查看 87关注 0票数 0

我已经在这方面工作了一段时间,但一直没有想出如何让它工作。我有一个48 this的Vec 16位立体声大端签名PCM音频,我需要这是16千赫16位单声道小端签名PCM音频。

我尝试过使用libsamplerate和fon板条箱,但我无法同时使用这两种工具。

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

代码语言:javascript
复制
    //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

非常感谢!

EN

回答 1

Stack Overflow用户

发布于 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数字加在一起求平均,或者以任何您想要转换数据的方式)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66586440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档