Java实现多个wav文件合成一个的方法示例

这篇文章主要介绍了Java实现多个wav文件合成一个方法,涉及java文件流读写、编码转换、解析等相关操作技巧,需要的朋友可以参考下

本文实例讲述了Java实现多个wav文件合成一个方法分享给大家供大家参考,具体如下:

前面一篇介绍了java切割wav音频文件方法,这里再给出合并多个wav音频文件方法

package com.cmos.nomsapp.utils.wavmeger; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.List; /** * 获取wav头文件然后合并成单个wav * @author zcf * @date 2017-10-17 */ public class WavMergeUtil { /** * meger多个wav * @param inputs 多个wav * @param output 要生成的wav * @throws IOException */ public static void mergeWav(File[] inputs, String output) throws IOException { if (inputs.length -1) { fos.write(buffer, 0, count); total += count; } fis.close(); for (int i = 1; i -1) { fos.write(buffer, 0, count); total += count; } } } fos.flush(); fos.close(); FileInputStream fisHo = new FileInputStream(new File(output)); Header outputHeader = resolveHeader(fisHo); outputHeader.dataInputStream.close(); try(RandomAccessFile res = new RandomAccessFile(output, "rw")){ res.seek(4); byte[] fileLen = intToByteArray(total + outputHeader.dataOffset - 8); res.write(fileLen, 0, 4); res.seek(outputHeader.dataSizeOffset); byte[] dataLen = intToByteArray(total); res.write(dataLen, 0, 4); } } } /** * 解析头部,并获得文件指针指向数据开始位置的InputStreram,记得使用后需要关闭 */ private static Header resolveHeader(FileInputStream fis) throws IOException { byte[] byte4 = new byte[4]; byte[] buffer = new byte[2048]; int readCount = 0; Header header = new Header(); fis.read(byte4);// RIFF fis.read(byte4); readCount += 8; header.fileSizeOffset = 4; header.fileSize = byteArrayToInt(byte4); fis.read(byte4);// WAVE fis.read(byte4);// fmt fis.read(byte4); readCount += 12; int fmtLen = byteArrayToInt(byte4); fis.read(buffer, 0, fmtLen); readCount += fmtLen; fis.read(byte4);// data or fact readCount += 4; if (isFmt(byte4, 0)) {// 包含fmt段 fis.read(byte4); int factLen = byteArrayToInt(byte4); fis.read(buffer, 0, factLen); fis.read(byte4);// data readCount += 8 + factLen; } fis.read(byte4);// data size int dataLen = byteArrayToInt(byte4); header.dataSize = dataLen; header.dataSizeOffset = readCount; readCount += 4; header.dataOffset = readCount; header.dataInputStream = fis; return header; } private static boolean isRiff(byte[] bytes, int start) { if (bytes[start + 0] == 'R' && bytes[start + 1] == 'I' && bytes[start + 2] == 'F' && bytes[start + 3] == 'F') { return true; } else { return false; } } private static boolean isFmt(byte[] bytes, int start) { if (bytes[start + 0] == 'f' && bytes[start + 1] == 'm' && bytes[start + 2] == 't' && bytes[start + 3] == ' ') { return true; } else { return false; } } private static boolean isData(byte[] bytes, int start) { if (bytes[start + 0] == 'd' && bytes[start + 1] == 'a' && bytes[start + 2] == 't' && bytes[start + 3] == 'a') { return true; } else { return false; } } /** * 将int转化为byte[] */ private static byte[] intToByteArray(int data) { return ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(data).array(); } /** * 将short转化为byte[] */ private static byte[] shortToByteArray(short data) { return ByteBuffer.allocate(2).order(ByteOrder.LITTLE_ENDIAN).putShort(data).array(); } /** * 将byte[]转化为short */ private static short byteArrayToShort(byte[] b) { return ByteBuffer.wrap(b).order(ByteOrder.LITTLE_ENDIAN).getShort(); } /** * 将byte[]转化为int */ private static int byteArrayToInt(byte[] b) { return ByteBuffer.wrap(b).order(ByteOrder.LITTLE_ENDIAN).getInt(); } /** * 头部部分信息 */ static class Header { public int fileSize; public int fileSizeOffset; public int dataSize; public int dataSizeOffset; public int dataOffset; public FileInputStream dataInputStream; } }

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...