java wav合并_java – 如何将两个wav文件合并/合并到一个wav文件中?

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 17:50   1727   0

如果直接使用wav文件的字节,则可以在任何编程语言中使用相同的策略.对于这个例子,我假设两个源文件具有相同的比特率/ numchannels并且长度/大小相同.

(如果没有,你可以在开始合并之前编辑它们).

首先看一下wav规范,我在stanford课程网站上找到了一个好的:

通用标头长度为44或46个字节.

如果你想连接两个文件(即在一个文件中播放一个wav,然后播放另一个文件):

>找出你的wav文件的格式

>砍掉作为标题的前44/46字节,文件的其余部分是数据

>创建一个新文件并在其中粘贴其中一个标题.

新的wav文件= {header} = {44/46}个字节长

>从原始文件中添加两个数据部分

new wav file = {header data1 data2} = {44/46 size(data1)size(data2)} bytes long

>在两个地方修改标题以反映新文件的长度.

一个.修改字节4 4(即从偏移4开始的4个字节).

新值应该是十六进制数,表示新的wav文件的大小,以字节{44/46 size(data1)size(data2)} – 8字节为单位.

湾修改字节40 4或42 4(从偏移40或42开始的4个字节,具体取决于您是否具有44字节标头或46字节标头).

新值应为十六进制数,表示新wav文件的总大小.即{44/46尺寸(数据1)尺寸(数据2)}

如果你想要合并或混合这两个文件(这样它们两者同时播放):

>如果两个文件的长度相同,则无需编辑标题.

>从字节44/46开始,您必须将每个样本编辑为data1中data2中值的值.

因此,例如,如果您的SampleRate是8位,您将修改1个字节,如果您的采样率是16位,您将修改2个字节.

文件的其余部分只是1/2个样本的样本,存储一个int值,表示当时声音的波形.

一个.对于文件中的每个剩余样本,抓取1/2字节十六进制字符串,并从文件data1和data2获取int值.

湾将1/2字节整数加在一起

将结果转换回十六进制,并在输出文件中使用该值.

C.您通常必须将该数字除以2才能获得适合原始1/2字节样本块的平均值.当我在objc中尝试它时可能会失真(可能与有符号或无符号的整数相关)并且只是跳过了除法部分,因为如果你将非常大的声音合并在一起它只会是一个问题.

即当data1 data2大于1/2字节时,声音将被剪辑.有关剪辑问题here的讨论,你可能想尝试其中一种裁剪技术.

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP