java如何处理wave格式文件?

该代码是对wave头文件的解析
package com.zhukovasky.audio;

public class WaveHeader {
	private byte[] ChunkID; //4
	private byte[] ChunkSize; //4
	private byte[] Format;	//4
	private byte[] SubChunk1ID;//格式说明块,本字段一般就是"fmt 
	private byte[] subChunk1Size;//本数据块的大小,不包括ID和Size字段本身
	private byte[] AudioFormat;//音频的格式说明
	private byte[] NumChannels;//声道数
	private byte[] SampleRate;
	private byte[] ByteRate;
	private byte[] BlockAlign;
	private byte[] BistPerSample;
	private byte[] SubChunk2ID;
	private byte[] SubChunk2Size;
	public byte[] getChunkID() {
		return ChunkID;
	}
	public void setChunkID(byte[] chunkID) {
		ChunkID = chunkID;
	}
	public byte[] getChunkSize() {
		return ChunkSize;
	}
	public void setChunkSize(byte[] chunkSize) {
		ChunkSize = chunkSize;
	}
	public byte[] getFormat() {
		return Format;
	}
	public void setFormat(byte[] format) {
		Format = format;
	}
	public byte[] getSubChunk1ID() {
		return SubChunk1ID;
	}
	public void setSubChunk1ID(byte[] subChunk1ID) {
		SubChunk1ID = subChunk1ID;
	}
	public byte[] getSubChunk1Size() {
		return subChunk1Size;
	}
	public void setSubChunk1Size(byte[] subChunk1Size) {
		this.subChunk1Size = subChunk1Size;
	}
	public byte[] getAudioFormat() {
		return AudioFormat;
	}
	public void setAudioFormat(byte[] audioFormat) {
		AudioFormat = audioFormat;
	}
	public byte[] getNumChannels() {
		return NumChannels;
	}
	public void setNumChannels(byte[] numChannels) {
		NumChannels = numChannels;
	}
	public byte[] getSampleRate() {
		return SampleRate;
	}
	public void setSampleRate(byte[] sampleRate) {
		SampleRate = sampleRate;
	}
	public byte[] getByteRate() {
		return ByteRate;
	}
	public void setByteRate(byte[] byteRate) {
		ByteRate = byteRate;
	}
	public byte[] getBlockAlign() {
		return BlockAlign;
	}
	public void setBlockAlign(byte[] blockAlign) {
		BlockAlign = blockAlign;
	}
	public byte[] getBistPerSample() {
		return BistPerSample;
	}
	public void setBistPerSample(byte[] bistPerSample) {
		BistPerSample = bistPerSample;
	}
	public byte[] getSubChunk2ID() {
		return SubChunk2ID;
	}
	public void setSubChunk2ID(byte[] subChunk2ID) {
		SubChunk2ID = subChunk2ID;
	}
	public byte[] getSubChunk2Size() {
		return SubChunk2Size;
	}
	public void setSubChunk2Size(byte[] subChunk2Size) {
		SubChunk2Size = subChunk2Size;
	}
	public int Size(){
		return 43;
	}
}

废话不多说,贴上部分源代码。


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;

import com.zhukovasky.tools.ArraysUtils;

public class Audio {
	private String filePath;
	private byte[] toBt;
	private byte[] HeadBt;
	private WaveHeader Head;
	private byte[] Context;
	private int Length;
	public Audio(String filePath){
		this.filePath=filePath;
		init();
		getHead();
		getHeader();
	}
	private void getHeader(){
		Head=new WaveHeader();
		Head.setChunkID(ArraysUtils.getPartsOfArrays(toBt, 0, 4));
		Head.setChunkSize(ArraysUtils.getPartsOfArrays(HeadBt, 4, 8));
		Head.setFormat(ArraysUtils.getPartsOfArrays(HeadBt, 8, 12));
		Head.setSubChunk1ID(ArraysUtils.getPartsOfArrays(HeadBt, 12, 16));
		Head.setSubChunk1Size(ArraysUtils.getPartsOfArrays(HeadBt, 16, 20));
		Head.setAudioFormat(ArraysUtils.getPartsOfArrays(HeadBt, 20, 21));
		Head.setNumChannels(ArraysUtils.getPartsOfArrays(HeadBt, 22, 24));
		Head.setSampleRate(ArraysUtils.getPartsOfArrays(HeadBt, 24, 28));
		Head.setByteRate(ArraysUtils.getPartsOfArrays(HeadBt, 28, 32));
		Head.setBlockAlign(ArraysUtils.getPartsOfArrays(HeadBt, 32, 34));
		Head.setBistPerSample(ArraysUtils.getPartsOfArrays(HeadBt, 34, 36));
		Head.setSubChunk2ID(ArraysUtils.getPartsOfArrays(HeadBt, 36, 40));
		Head.setSubChunk2Size(ArraysUtils.getPartsOfArrays(HeadBt, 40, 44));
	}
	public String getChunkID(){
		byte[] bt=Head.getChunkID();
		return ArraysUtils.ByteToString(bt, "gbk");
	}
	public int getChunkSize(){
		byte[] bt=Head.getChunkSize();
		return ArraysUtils.ByteToInt(bt);
	}
	public String getFormat(){
		return ArraysUtils.ByteToString(Head.getFormat(), "gbk");
	}
	public String getSubChunk1ID(){
		return ArraysUtils.ByteToString(Head.getSubChunk1ID(), "gbk");
	}
	public int getSubChunk1Size(){
		return ArraysUtils.ByteToInt(Head.getSubChunk1Size());
	}
	public int getAudioFormat(){
		return HeadBt[20];
	}
	public int getNumChannels(){
		return HeadBt[22];
	}
	public int getSampleRate(){
		return ArraysUtils.ByteToInt(Head.getSampleRate());
	}
	public int getByteRate(){
		return ArraysUtils.ByteToInt(Head.getByteRate());
	}
	public int getBlockAlign(){
		return HeadBt[32];
	}
	public int getBistPerSample(){
		return HeadBt[34];
	}
	public String getSubChunk2ID(){
		return ArraysUtils.ByteToString(Head.getSubChunk2ID(), "gbk");
	}
	public int getSubChunk2Size(){
		return ArraysUtils.ByteToInt(Head.getSubChunk2Size());
	}
	public byte[] getHead(){
		this.HeadBt= ArraysUtils.getPartsOfArrays(toBt, 0, 44);
		return this.HeadBt;
	}
	public byte[] getContext(int Begins,int Ends){
		this.Context=ArraysUtils.getPartsOfArrays(toBt, Begins, Ends);
		return this.Context;
	}
	private byte[] getPart(int Begins,int Ends){
		return ArraysUtils.getPartsOfArrays(toBt, Begins, Ends);
	}
	public void CreateNewWave(String filepath,int Begins,int Ends){
		File o=new File(filepath);
		OutputStream os=null;
		try {
			os=new FileOutputStream(o);
			byte[] parts=getPart(Begins,Ends);
			System.out.println(Ends-Begins);
			int length=Ends-Begins;
			int newChunkSize=length+36;
			byte[] newChunkSizeArrays=ArraysUtils.intToByteArray(newChunkSize);
			byte[] newChunkByteArray=ArraysUtils.modifyByteArrays(HeadBt, 4, 8,newChunkSizeArrays);
			byte[] newLast=ArraysUtils.intToByteArray(length);
			byte[] newHead=ArraysUtils.modifyByteArrays(newChunkByteArray, 40, 44, newLast);
			byte[] merges=ArraysUtils.MergeWave(newHead, parts);
			os.write(merges);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				os.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	private void init(){
		File f=new File(filePath);
		InputStream is=null;
		this.toBt=new byte[(int)f.length()];
		this.Length=(int) f.length();
		try {
			is=new FileInputStream(f);
			is.read(this.toBt);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	public int getSize(){
		return this.Length;
	}
	public String toString(){
		return Arrays.toString(this.toBt);
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值