换WAV格式

原文是:http://blog.youkuaiyun.com/xiunai78/article/details/6867331

这里将记录一下,以便日后查用:

public class WavWriter {
	
	
	public void convertAudioFiles(String src, String target) throws Exception {
		   FileInputStream fis = new FileInputStream(src);
		   FileOutputStream fos = new FileOutputStream(target);

		   //计算长度
		   byte[] buf = new byte[1024 * 4];
		   int size = fis.read(buf);
		   int PCMSize = 0;
		   while (size != -1) {
		      PCMSize += size;
		      size = fis.read(buf);
		   }
		   fis.close();

		   //填入参数,比特率等等。这里用的是16位单声道 8000 hz
		   WaveHeader header = new WaveHeader();
		   //长度字段 = 内容的大小(PCMSize) + 头部字段的大小(不包括前面4字节的标识符RIFF以及fileLength本身的4字节)
		   header.fileLength = PCMSize + (44 - 8);
		   header.FmtHdrLeth = 16;
		   header.BitsPerSample = 16;
		   header.Channels = 1;
		   header.FormatTag = 0x0001;
		   header.SamplesPerSec = 16000;
		   header.BlockAlign = (short)(header.Channels * header.BitsPerSample / 8);
		   header.AvgBytesPerSec = header.BlockAlign * header.SamplesPerSec;
		   header.DataHdrLeth = PCMSize;

		   byte[] h = header.getHeader();

		   assert h.length == 44; //WAV标准,头部应该是44字节
		   //write header
		   fos.write(h, 0, h.length);
		   //write data stream
		   fis = new FileInputStream(src);
		   size = fis.read(buf);
		   while (size != -1) {
		      fos.write(buf, 0, size);
		      size = fis.read(buf);
		   }
		   fis.close();
		   fos.close();
		   System.out.println("Convert OK!");
		}


	public class WaveHeader {
		   public final char fileID[] = {'R', 'I', 'F', 'F'};
		   public int fileLength;
		   public char wavTag[] = {'W', 'A', 'V', 'E'};;
		   public char FmtHdrID[] = {'f', 'm', 't', ' '};
		   public int FmtHdrLeth;
		   public short FormatTag;
		   public short Channels;
		   public int SamplesPerSec;
		   public int AvgBytesPerSec;
		   public short BlockAlign;
		   public short BitsPerSample;
		   public char DataHdrID[] = {'d','a','t','a'};
		   public int DataHdrLeth;

		public byte[] getHeader() throws IOException {
		   ByteArrayOutputStream bos = new ByteArrayOutputStream();
		   WriteChar(bos, fileID);
		   WriteInt(bos, fileLength);
		   WriteChar(bos, wavTag);
		   WriteChar(bos, FmtHdrID);
		   WriteInt(bos,FmtHdrLeth);
		   WriteShort(bos,FormatTag);
		   WriteShort(bos,Channels);
		   WriteInt(bos,SamplesPerSec);
		   WriteInt(bos,AvgBytesPerSec);
		   WriteShort(bos,BlockAlign);
		   WriteShort(bos,BitsPerSample);
		   WriteChar(bos,DataHdrID);
		   WriteInt(bos,DataHdrLeth);
		   bos.flush();
		   byte[] r = bos.toByteArray();
		   bos.close();
		   return r;
		}
	
		private void WriteShort(ByteArrayOutputStream bos, int s) throws IOException {
			   byte[] mybyte = new byte[2];
			   mybyte[1] =(byte)( (s << 16) >> 24 );
			   mybyte[0] =(byte)( (s << 24) >> 24 );
			   bos.write(mybyte);
		}


		private void WriteInt(ByteArrayOutputStream bos, int n) throws IOException {
			   byte[] buf = new byte[4];
			   buf[3] =(byte)( n >> 24 );
			   buf[2] =(byte)( (n << 8) >> 24 );
			   buf[1] =(byte)( (n << 16) >> 24 );
			   buf[0] =(byte)( (n << 24) >> 24 );
			   bos.write(buf);
		}

		private void WriteChar(ByteArrayOutputStream bos, char[] id) {
			   for (int i=0; i<id.length; i++) {
			      char c = id[i];
			      bos.write(c);
			   }
		}
	}
		
}


在 JavaScript 中,将数组转WAV 格式文件或数据流,一般需要按照 WAV 文件的格式规范来构造二进制数据。以下是一个基本的实现思路和示例代码: WAV 文件格式主要包含一个文件头和音频数据,文件头包含了音频的相关信息,如采样率、声道数、位深度等。 示例代码如下: ```javascript function createWavFile(dataArray, sampleRate = 44100, numChannels = 1, bitDepth = 16) { const BYTES_PER_SAMPLE = bitDepth / 8; const BLOCK_ALIGN = numChannels * BYTES_PER_SAMPLE; const DATA_SIZE = dataArray.length * BYTES_PER_SAMPLE; // 创建一个新的 DataView 来存储数据 const buffer = new ArrayBuffer(44 + DATA_SIZE); const view = new DataView(buffer); // 写入文件头 writeString(view, 0, 'RIFF'); view.setUint32(4, 36 + DATA_SIZE, true); writeString(view, 8, 'WAVE'); writeString(view, 12, 'fmt '); view.setUint32(16, 16, true); view.setUint16(20, 1, true); view.setUint16(22, numChannels, true); view.setUint32(24, sampleRate, true); view.setUint32(28, sampleRate * BLOCK_ALIGN, true); view.setUint16(32, BLOCK_ALIGN, true); view.setUint16(34, bitDepth, true); writeString(view, 36, 'data'); view.setUint32(40, DATA_SIZE, true); // 写入音频数据 let offset = 44; for (let i = 0; i < dataArray.length; i++) { const sample = dataArray[i]; if (bitDepth === 16) { view.setInt16(offset, sample * 0x7FFF, true); } else if (bitDepth === 8) { view.setUint8(offset, (sample + 1) * 128); } offset += BYTES_PER_SAMPLE; } return buffer; } function writeString(view, offset, string) { for (let i = 0; i < string.length; i++) { view.setUint8(offset + i, string.charCodeAt(i)); } } // 示例使用 const audioData = [0.1, 0.2, 0.3, 0.4]; const wavBuffer = createWavFile(audioData); const blob = new Blob([wavBuffer], { type: 'audio/wav' }); // 创建下载链接 const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'audio.wav'; a.click(); URL.revokeObjectURL(url); ``` 该代码实现了将 JavaScript 数组转WAV 格式文件的功能,主要步骤如下: 1. 计算 WAV 文件头所需的数据,包括字节数、采样率、声道数、位深度等。 2. 创建一个 `ArrayBuffer` 来存储整个 WAV 文件的数据,大小为文件头和音频数据的总和。 3. 使用 `DataView` 写入 WAV 文件头,包含了文件格式、音频参数等信息。 4. 将数组中的音频数据写入到 `DataView` 中,根据位深度进行适当的编码。 5. 将 `ArrayBuffer` 转为 `Blob` 对象,并创建下载链接供用户下载。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值