wav音频简介

一段wav音频由两部分组成,分别为wav头文件pcm数据

wav头文件

wav头文件其实不止一种格式,本文主要针对44字节的头文件,其格式如图1(图源)所示:


图1 wav头文件格式

pcm数据

pcm数据就是图一里的data块,其结构如图2(图源)所示:


图2 pcm数据结构

拼接思路

  1. 要进行拼接的多段音频文件必须格式一致,即声道(channels)采样频率(sampleRate)量化位数(sampleFormat)需一致

  2. 对每一段wav音频,不要前面44字节的头文件数据,直接取后面的数据并将之存于byte数组

  3. 将所有wav音频对应的byte数组合在一起,得到总的byte数组

  4. 在总的byte数组前加上wav头文件即可

补充

常见格式:

  • 声道:12
  • 采样频率:8000Hz16000Hz44100Hz
  • 量化位数: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音频进行拼接相关推荐

  1. java切割wav音频文件

    import it.sauronsoftware.jave.Encoder; import it.sauronsoftware.jave.MultimediaInfo; import java.io. ...

  2. Java合并wav音频

    前言 最近在做聊天语音开发功能,转语音接口只能固定长度个字符,所以长文本内容需要做语音合并处理. 思路 获取音频文件 将音频文件转成音频输入流 获取音频格式并汇总所有音频长度 利用LinkedList ...

  3. java wav音频文件播放器demo

    java 简易wav音频文件播放器 测试文件 源码 相关资料 测试文件 csdn下载 : https://download.csdn.net/download/qq_41054313/18704149 ...

  4. java 双声道音频_java实现切割wav音频文件的方法详解【附外部jar包下载】

    本文实例讲述了java实现切割wav音频文件的方法.分享给大家供大家参考,具体如下: import it.sauronsoftware.jave.Encoder; import it.sauronso ...

  5. Java程序获取和修改.wav音频文件的内部结构

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/79498075冷血之心的博客) wav音频文件是一种无损的音频文件, ...

  6. Python 拼接wav音频

    需求:有一批零散的音频需要拼接成1小时的音频输出. 前置要求:本地安装 python3,ffmpeg. pip3 install pydub #!/usr/bin/env python # -*- c ...

  7. 使用Java播放MP3或Wav音频

    JavaSound是一个小巧的低层应用程序接口(API),它支持数字音频和乐器数字接口(MIDI)数据的记录和回放.在JDK 1.3.0之前,JavaSound是一个标准的Java扩展API,但从Ja ...

  8. Java 采集声音_通过java采集PC麦克风音频及播放wav音频文件

    AudioFormat对象 sampleRate 采样率 每秒音频采样数量 sampleSizeInBits 采样位数 每个采样的位数 channels 声道 1: Mono 单声道,2:Stereo ...

  9. 【音频处理】python将两个单声道wav音频合成一个双声道wav音频_立体声感

    python将两个单声道wav音频合成一个双声道wav音频_立体声感 环境相关 编写目的 录音代码 单通道音合成双通道音频代码 在以下内容中,若有任何错误和不足,欢迎读者进行指正,不尽感激! 环境相关 ...

最新文章

  1. ssh(Struts+spring+Hibernate)三大框架整合-简述
  2. UFS和eMMC闪存差异在哪?
  3. php动态加载js,动态加载script文件的两种方法_javascript技巧
  4. URL的getFile()和getPath()方法的区别
  5. BugkuCTF-Reverse题Easy_Re多方法解决
  6. linux下获取主机信息
  7. springboot集成log4j
  8. 饥荒联机版服务器启动慢_饥荒联机版大型攻略——简介与目录
  9. 河南省公安机关户政服务管理工作规范(试行)
  10. 计算机论文中期报告进展情况,毕业论文中期进度报告 毕业论文中期报告
  11. 决策树算法(ID3算法详解)
  12. 求边长为一的正方体中,面对角线组成的正四面体体积.
  13. pandas数据分析之分组聚合
  14. Rme Babyface Pro FS娃娃脸声卡安装调试教程
  15. # responses[name] = response
  16. 有孚网络与中国科学院虚拟经济与数据科学研究中心签署战略合作协议,推动行业智能化转型加速发展
  17. 微信抢红包神器自动抢软件
  18. 武汉java软谋教育坑吗_软谋在线教育诚招php,java,.net,设计师讲师(可兼职)...
  19. 第三章 决策树-隐形眼镜
  20. 微信小程序生成paySign

热门文章

  1. 使用RFID定位技术的AGV巡检机器人如何工作?
  2. ASP.NET商品进销存管理系统【附项目下载地址】
  3. 【网络】HTTP协议详解
  4. 电话格式 php,php中ip地址 email格式 电话号码正则验证
  5. UBTC主网上线智能合约以及实现混合共识机制
  6. JavaScript - Ajax
  7. c语言--n的k次方
  8. confluence 制作流程图_软件需求分析流程图绘制方法
  9. 软件工程详细知识点(上)
  10. 如何解锁华为手机PIN/图案/指纹/人脸锁?