以下示例为标准wav格式音频,其他格式的思路一样
1、思路
- 了解wav音频的数据格式
- 将多个wav数据组合成一段数据
- 直接播报合成后的数据,或者生成临时文件后播报
2、实现
2.1 wav解析
这篇文章讲的十分详细,以下摘录几个重点片段还有原文章中一个错误点
2.2 开始拼接
无论拼接什么格式的文件都需要把文件内容和文件头先分开,最后再拼接好的内容里面加上修改后的文件头
2.2.1 将wav的头和体分开
标准wav的文件头为44字节,但是需要修改的位置如下表格,[图片上传失败...(image-d07298-1553822383425)]
我们只需要随便提取一个wav文件的前44字节作为初始头,然后修改描述长度的部分即可。
偏移地址 | 大小 | 数据块类型 | 内容 | 称作 |
---|---|---|---|---|
00H~03H | 4 | 长整数 | 从下个地址开始到文件尾的总字节数 | body_length |
28H~2BH | 4 | 长整数 | size,数值为4(总字节数) | data_length |
2.2.2修改头信息
- 举例计算长度
链接:https://pan.baidu.com/s/1RXRjqck_qH1945dQDyTk1w
提取码:fs2q
使用该文件测试
//需要完整代码的私信吧
byte[] buffer = ByteUtil.InputStream2ByteArray("E:/voice/请出示付款码.wav");
for (int i = 0; i < buffer.length;; i++) {
System.out.println(i + "=====\t:" + (char) buffer[i] + "\t" + buffer[i]);
}
//查看 body_length
//body_length部分的数据为[26,58,0,0],此为小端序
//转换过程[0,0,58,26]==>[0x00 0x00 0x3A 0x1A]=>14874
//文件总长度buffer.length=14881=body_length+8
2.3.3 组合文件
- 截取文件体
- 拼接文件体
- 加入文件头
- 修改文件头中的长度数据
3、播报
这里就不详细说明了,百度播报的方式有很多
网友评论