用java对wav音频进行拼接
wav音频简介
一段wav音频由两部分组成,分别为wav头文件
和pcm数据
wav头文件
wav头文件其实不止一种格式,本文主要针对44字节
的头文件,其格式如图1(图源)所示:
![](/assets/blank.gif)
pcm数据
pcm数据就是图一里的data
块,其结构如图2(图源)所示:
![](/assets/blank.gif)
拼接思路
要进行拼接的多段音频文件必须格式一致,即
声道(channels)
、采样频率(sampleRate)
、量化位数(sampleFormat)
需一致对每一段wav音频,不要前面44字节的头文件数据,直接取后面的数据并将之存于byte数组中
将所有wav音频对应的byte数组合在一起,得到总的byte数组
在总的byte数组前加上wav头文件即可
补充
常见格式:
- 声道:
1
、2
- 采样频率:
8000Hz
、16000Hz
、44100Hz
等 - 量化位数:
8位
、16位
java代码
拼接音频
/*** @params wavFile:要拼接的wav音频片段对应的File* @params catFilePath:目的拼接音频地址(不含.wav后缀)*/
public static void catWav(File[] wavFile,String catFilePath){File destFile = new File(catFilePath+".txt");//存储pcm数据File destFileW = new File(catFilePath+".wav");//目的wav音频文件InputStream fin;OutputStream fout=null;try {fout = new FileOutputStream(destFile);//此段是将所有wav音频的pcm数据依次写入destFile文件中for (int i = 0; i < wavFile.length; i++) {fin=new FileInputStream(wavFile[i]);byte head[] = new byte[44];fin.read(head);byte buff[] = new byte[1000];int end=0;int Dsum=0;while(true) {end=fin.read(buff);if(end==-1)break;Dsum+=end;fout.write(buff,0,end);} fin.close();}fout.close();} catch (IOException e) {e.printStackTrace();}//对destFileW写入wav头文件,并再写入destFile里的pcm数据WavWiter.pcmToWav(destFile, destFileW);//删除pcm文件destFiledestFile.delete();
}
wav头文件
public class WavWiter {/*** @params pcamFile:已拼接好的pcm数据文件* @params wavFile:目的拼接wav文件*/public static void pcmToWav(File pcmFile, File wavFile) {FileInputStream fis = null;FileOutputStream fos = null;try {fis = new FileInputStream(pcmFile);fos = new FileOutputStream(wavFile);//示例 假设音频格式为:16位、44100Hz、1声道writeWavHeader(fos, fis.getChannel().size(), 16, 44100,1);byte []buff=new byte[1000];int end=0;while(true) {end=fis.read(buff);if(end==-1)break;fos.write(buff,0,end);}} catch (IOException e) {e.printStackTrace();} finally {try {if (fis != null) {fis.close();}if (fos != null) {fos.flush();fos.close();}} catch (IOException e) {e.printStackTrace();}}}private static void writeWavHeader(FileOutputStream fos, long pcmDataLength, int sampleFormat,int sampleRate, int channels) throws IOException {long audioDataLength = pcmDataLength + 36;long bitRate = sampleRate * channels * sampleFormat / 8;byte[] header = new byte[44];// RIFFheader[0] = 'R';header[1] = 'I';header[2] = 'F';header[3] = 'F';// pcm data lengthheader[4] = (byte) (pcmDataLength & 0xff);header[5] = (byte) ((pcmDataLength >> 8) & 0xff);header[6] = (byte) ((pcmDataLength >> 16) & 0xff);header[7] = (byte) ((pcmDataLength >> 24) & 0xff);// WAVEheader[8] = 'W';header[9] = 'A';header[10] = 'V';header[11] = 'E';// 'fmt 'header[12] = 'f';header[13] = 'm';header[14] = 't';header[15] = ' ';header[16] = 16;header[17] = 0;header[18] = 0;header[19] = 0;// 1(PCM)header[20] = 1;header[21] = 0;// channelsheader[22] = (byte) channels;header[23] = 0;// sample rateheader[24] = (byte) (sampleRate & 0xff);header[25] = (byte) ((sampleRate >> 8) & 0xff);header[26] = (byte) ((sampleRate >> 16) & 0xff);header[27] = (byte) ((sampleRate >> 24) & 0xff);// bit rateheader[28] = (byte) (bitRate & 0xff);header[29] = (byte) ((bitRate >> 8) & 0xff);header[30] = (byte) ((bitRate >> 16) & 0xff);header[31] = (byte) ((bitRate >> 24) & 0xff);header[32] = 4;header[33] = 0;// 閲囨牱绮惧害header[34] = (byte) sampleFormat;header[35] = 0;// dataheader[36] = 'd';header[37] = 'a';header[38] = 't';header[39] = 'a';// data lengthheader[40] = (byte) (audioDataLength & 0xff);header[41] = (byte) ((audioDataLength >> 8) & 0xff);header[42] = (byte) ((audioDataLength >> 16) & 0xff);header[43] = (byte) ((audioDataLength >> 24) & 0xff);fos.write(header);}
}
调用
File []wavFile=new File[2];
wavFile[0]=new File("D:/llsf/catWav1.wav");
wavFile[1]=new File("D:/llsf/catWav2.wav");
String destPath="D:/llsf/destWav";
catWav(wavFile,destPath);
结果
没了,成功,嘻嘻嘻嘻
用java对wav音频进行拼接相关推荐
- java切割wav音频文件
import it.sauronsoftware.jave.Encoder; import it.sauronsoftware.jave.MultimediaInfo; import java.io. ...
- Java合并wav音频
前言 最近在做聊天语音开发功能,转语音接口只能固定长度个字符,所以长文本内容需要做语音合并处理. 思路 获取音频文件 将音频文件转成音频输入流 获取音频格式并汇总所有音频长度 利用LinkedList ...
- java wav音频文件播放器demo
java 简易wav音频文件播放器 测试文件 源码 相关资料 测试文件 csdn下载 : https://download.csdn.net/download/qq_41054313/18704149 ...
- java 双声道音频_java实现切割wav音频文件的方法详解【附外部jar包下载】
本文实例讲述了java实现切割wav音频文件的方法.分享给大家供大家参考,具体如下: import it.sauronsoftware.jave.Encoder; import it.sauronso ...
- Java程序获取和修改.wav音频文件的内部结构
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/79498075冷血之心的博客) wav音频文件是一种无损的音频文件, ...
- Python 拼接wav音频
需求:有一批零散的音频需要拼接成1小时的音频输出. 前置要求:本地安装 python3,ffmpeg. pip3 install pydub #!/usr/bin/env python # -*- c ...
- 使用Java播放MP3或Wav音频
JavaSound是一个小巧的低层应用程序接口(API),它支持数字音频和乐器数字接口(MIDI)数据的记录和回放.在JDK 1.3.0之前,JavaSound是一个标准的Java扩展API,但从Ja ...
- Java 采集声音_通过java采集PC麦克风音频及播放wav音频文件
AudioFormat对象 sampleRate 采样率 每秒音频采样数量 sampleSizeInBits 采样位数 每个采样的位数 channels 声道 1: Mono 单声道,2:Stereo ...
- 【音频处理】python将两个单声道wav音频合成一个双声道wav音频_立体声感
python将两个单声道wav音频合成一个双声道wav音频_立体声感 环境相关 编写目的 录音代码 单通道音合成双通道音频代码 在以下内容中,若有任何错误和不足,欢迎读者进行指正,不尽感激! 环境相关 ...
最新文章
- tf.nn.l2_loss() 与 权重衰减(weight decay)
- Dragonboard 410c fastboot刷入android
- 【线段树】开关(luogu 3870)
- 监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
- LeetCode 554. 砖墙(map计数)
- 用MobaXterm远程连接Centos系统_使用技巧---Linux工作笔记047
- 冷启动阶段的多规则策略如何筛选?
- c语言程序设计 甘勇,C语言程序设计
- 如何在 win 10 上安装 IIS
- 香农编码的gui编码_1、香农编码方法
- 【暑期每日一题】洛谷 P6437 [COCI2011-2012#6] JACK
- 88年的世界杯历史,用Python带你回顾!
- win10删除右键菜单的办法
- 黑马程序员学习笔记-------c++提高编程
- 在ArcGIS Online中创建三维图层和网络场景(2017.9)
- 一种相对高效的按键消抖方法
- Xcode 用Ad_Hoc方式打包
- 秘密潜入1-普通枪械射速修改-Python源码
- 2021-01-07关于Linux段错误的原因和解决办法(初学者)
- 规划 程序员的35岁危机
热门文章
- win11找不到本地组策略编辑器的解决方法
- 三节锂电池充电管理芯片,IC电路图,BOM物料表
- 几种常见的字符串倒序的方法。
- djvu批量转换为pdf的工具和djvu阅读器(附下载链接)
- 最优化在供应链网络设计中的应用:基于Python
- 彻底凉了!腾讯知名软件全线下架,网友一片唏嘘。。。
- jdk安装jre报错
- tms320f2812中断系统分析及其c语言编程,TMS320F2812中断系统分析及其C语言编程
- 【论文笔记】Exploring Temporal Coherence for More General Video Face Forgery Detection
- 04 Softmax分类器