gpt4 book ai didi

java - 如何合并输入和输出音频以发送给另一个 session 者

转载 作者:行者123 更新时间:2023-11-30 05:48:58 25 4
gpt4 key购买 nike

我已更改我的问题消息...

我有两个带有 Java 音频的流。我想要的是将这两个音频合并到一个 OutputStream 中。

我一直在搜索,似乎如果你有两个具有相同音频格式的流,并且使用PCM,你只需要对两个字节数组执行以下操作:

mixAudio[i] = (byte) ((audio1[i] + audio2[i]) >> 1);

但是,我将其写入文件中,但得到的文件没有任何音频。

当我有两个流(而不是两个音频文件)中的音频时,有人知道如何组合两个音频吗?

提前谢谢您。

最佳答案

高质量的音频每个 channel 每个样本消耗两个字节的数据,以使音频曲线具有 16 位的位深度,这在数字化模拟音频曲线时为您的音频曲线提供 2^16 个不同的值...知道这一点您无法做到您的添加而数据只是简单的字节...因此要将两个 channel 加在一起,您首先需要将音频从其字节中取出并转换为两字节整数...然后您需要分别从该两字节整数中取出这两个字节一个接一个地存储到输出数组中

用伪代码(这会将音频数组的两个连续字节放入一个整数中,代表音频曲线中的一个样本)

  • 分配最高有效字节的 16 位整数值

  • 将此整数左移 8 位,例如 ( myint = myint << 8 )

  • 位级别将您的第二个字节(即最低有效字节)添加到该整数

重要提示:在编写代码以从两个字节填充一个整数后,然后执行相反的操作,即将多字节整数转换为某个数组中的两个字节...如果您绘制这些整数,以便可以可视化原始数据,则会获得加分音频曲线

要执行上述操作,您必须知道您的字节序(您执行的是小字节序还是大字节序),这将决定您的字节顺序...特别是因为我们现在知道每个音频样本消耗两个字节(或者对于 24 位来说更多)音频 )字节 myarray[i] 和 myarray[i + 1] 是一个音频样本,但是只有在知道您的字节顺序之后,您才会意识到在填充上述 myint 时首先使用哪个数组元素...如果这些都没有意义,请投资时间和精力研究 PCM 格式的原始音频概念

我强烈建议您在代码中至少执行一次上述所有操作,以了解某些音频库中发生的情况,这些库可能会为您执行此操作

回到你的问题而不是简单地做

mixAudio[i] = (byte) ((audio1[i] + audio2[i]) >> 1);

你应该做这样的事情(未经测试,特别是关于字节序)

twoByteAnswer = (byte) ((audio1[i] << 8) + audio1[i + 1]) + (audio2[i] << 8 + audio2[i + 1])) >> 1);

现在您需要将twoByteAnswer展开到数组mixAudio的两个字节中......类似这样的东西(也未经测试)

mixAudio[i] =   twoByteAnswer >> 8  // throw away its least sig byte only using its most sig byte

mixAudio[i + 1] = twoByteAnswer && 0x0000FFFF // do a bit AND operator mask

关于java - 如何合并输入和输出音频以发送给另一个 session 者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54305337/

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