关于PCM数据的混音计算

发布于 2022-09-01 17:23:52 字数 1086 浏览 22 评论 0

每个样本16bit
该怎么对两路语音进行混音呢?
我的算法很简单,就是让两路先分别除以二,再相加
比如,设两路数据存在ByteBuffer对象byteBuffer1、byteBuffer2里(capacity都为960),则

byteBuffer1.flip();
byteBuffer2.flip();
                
short[] sArray1 = new short[480];
short[] sArray2 = new short[480];
byte[] bArray = new byte[960];
byteBuffer1.asShortBuffer().get(sArray1);
byteBuffer2.asShortBuffer().get(sArray2);
for(int i = 0;i < 480; i++){
    int sumi = sArray1[i]/2 + sArray2[i]/2;
    short num = (short)sumi;
    bArray[i * 2] = (byte) (num >>> 8);
    bArray[i * 2 + 1] = (byte)num;
}

但是这样得到的混音后音频完全是噪音,使用Audition打开发现振幅都很大,推测为产生了溢出
第一路音频波形:
图片描述
第二路音频波形:
图片描述
混音后的音频波形:
图片描述
以上音频文件全部以little-edian方式打开,第一、二路音频播放没有问题
请问问题出在哪?该怎么修改呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

月野兔 2022-09-08 17:23:52

short型数据直接相加,再判断是否溢出,就是>32767 就等于32767 或 <-32768就等于-32768

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文