以下示例為標準wav格式音頻,其他格式的思路一樣
1、思路
- 了解wav音頻的數(shù)據(jù)格式
- 將多個wav數(shù)據(jù)組合成一段數(shù)據(jù)
- 直接播報合成后的數(shù)據(jù),或者生成臨時文件后播報
2、實現(xiàn)
2.1 wav解析
這篇文章講的十分詳細,以下摘錄幾個重點片段還有原文章中一個錯誤點
2.2 開始拼接
無論拼接什么格式的文件都需要把文件內(nèi)容和文件頭先分開,最后再拼接好的內(nèi)容里面加上修改后的文件頭
2.2.1 將wav的頭和體分開
標準wav的文件頭為44字節(jié),但是需要修改的位置如下表格,[圖片上傳失敗...(image-d07298-1553822383425)]
我們只需要隨便提取一個wav文件的前44字節(jié)作為初始頭,然后修改描述長度的部分即可。
| 偏移地址 | 大小 | 數(shù)據(jù)塊類型 | 內(nèi)容 | 稱作 |
|---|---|---|---|---|
| 00H~03H | 4 | 長整數(shù) | 從下個地址開始到文件尾的總字節(jié)數(shù) | body_length |
| 28H~2BH | 4 | 長整數(shù) | size,數(shù)值為4(總字節(jié)數(shù)) | 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部分的數(shù)據(jù)為[26,58,0,0],此為小端序
//轉(zhuǎn)換過程[0,0,58,26]==>[0x00 0x00 0x3A 0x1A]=>14874
//文件總長度buffer.length=14881=body_length+8
2.3.3 組合文件
- 截取文件體
- 拼接文件體
- 加入文件頭
- 修改文件頭中的長度數(shù)據(jù)
3、播報
這里就不詳細說明了,百度播報的方式有很多