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. tf.nn.l2_loss() 与 权重衰减(weight decay)
  2. Dragonboard 410c fastboot刷入android
  3. 【线段树】开关(luogu 3870)
  4. 监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
  5. LeetCode 554. 砖墙(map计数)
  6. 用MobaXterm远程连接Centos系统_使用技巧---Linux工作笔记047
  7. 冷启动阶段的多规则策略如何筛选?
  8. c语言程序设计 甘勇,C语言程序设计
  9. 如何在 win 10 上安装 IIS
  10. 香农编码的gui编码_1、香农编码方法
  11. 【暑期每日一题】洛谷 P6437 [COCI2011-2012#6] JACK
  12. 88年的世界杯历史,用Python带你回顾!
  13. win10删除右键菜单的办法
  14. 黑马程序员学习笔记-------c++提高编程
  15. 在ArcGIS Online中创建三维图层和网络场景(2017.9)
  16. 一种相对高效的按键消抖方法
  17. Xcode 用Ad_Hoc方式打包
  18. 秘密潜入1-普通枪械射速修改-Python源码
  19. 2021-01-07关于Linux段错误的原因和解决办法(初学者)
  20. 规划 程序员的35岁危机

热门文章

  1. win11找不到本地组策略编辑器的解决方法
  2. 三节锂电池充电管理芯片,IC电路图,BOM物料表
  3. 几种常见的字符串倒序的方法。
  4. djvu批量转换为pdf的工具和djvu阅读器(附下载链接)
  5. 最优化在供应链网络设计中的应用:基于Python
  6. 彻底凉了!腾讯知名软件全线下架,网友一片唏嘘。。。
  7. jdk安装jre报错
  8. tms320f2812中断系统分析及其c语言编程,TMS320F2812中断系统分析及其C语言编程
  9. 【论文笔记】Exploring Temporal Coherence for More General Video Face Forgery Detection
  10. 04 Softmax分类器