|
@@ -0,0 +1,96 @@
|
|
|
+package com.ym.mec.biz.dal.dto;
|
|
|
+
|
|
|
+/**
|
|
|
+ * WAV文件头工具类
|
|
|
+ *
|
|
|
+ * @author maple
|
|
|
+ * @time 2018/4/10.
|
|
|
+ */
|
|
|
+public class WavHeader {
|
|
|
+ private AudioRecordConfig config;// wav录音配置参数
|
|
|
+ private long totalAudioLength;// 音频数据总长度
|
|
|
+
|
|
|
+ public WavHeader(AudioRecordConfig config, long totalAudioLength) {
|
|
|
+ this.config = config;
|
|
|
+ this.totalAudioLength = totalAudioLength;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 返回WAV文件头的byte数组
|
|
|
+ */
|
|
|
+ public byte[] toBytes() {
|
|
|
+ long sampleRateInHz = config.getSampleRateInHz();
|
|
|
+ int channels = 1;
|
|
|
+ byte bitsPerSample = config.bitsPerSample();
|
|
|
+ return wavFileHeader(
|
|
|
+ totalAudioLength - 44,
|
|
|
+ totalAudioLength - 44 + 36,
|
|
|
+ sampleRateInHz,
|
|
|
+ channels,
|
|
|
+ bitsPerSample * sampleRateInHz * channels / 8,
|
|
|
+ bitsPerSample
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取wav文件头
|
|
|
+ *
|
|
|
+ * @param totalAudioLen -
|
|
|
+ * @param totalDataLen -
|
|
|
+ * @param longSampleRate - 采样率
|
|
|
+ * @param channels - 通道数
|
|
|
+ * @param byteRate -
|
|
|
+ * @param bitsPerSample - 16/8 bit
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private byte[] wavFileHeader(long totalAudioLen, long totalDataLen, long longSampleRate,
|
|
|
+ int channels, long byteRate, byte bitsPerSample) {
|
|
|
+ byte[] header = new byte[44];
|
|
|
+ header[0] = 'R'; // RIFF/WAVE header
|
|
|
+ header[1] = 'I';
|
|
|
+ header[2] = 'F';
|
|
|
+ header[3] = 'F';
|
|
|
+ header[4] = (byte) (totalDataLen & 0xff);
|
|
|
+ header[5] = (byte) ((totalDataLen >> 8) & 0xff);
|
|
|
+ header[6] = (byte) ((totalDataLen >> 16) & 0xff);
|
|
|
+ header[7] = (byte) ((totalDataLen >> 24) & 0xff);
|
|
|
+ header[8] = 'W';
|
|
|
+ header[9] = 'A';
|
|
|
+ header[10] = 'V';
|
|
|
+ header[11] = 'E';
|
|
|
+ header[12] = 'f'; // 'fmt ' chunk
|
|
|
+ header[13] = 'm';
|
|
|
+ header[14] = 't';
|
|
|
+ header[15] = ' ';
|
|
|
+ header[16] = 16; // 4 bytes: size of 'fmt ' chunk
|
|
|
+ header[17] = 0;
|
|
|
+ header[18] = 0;
|
|
|
+ header[19] = 0;
|
|
|
+ header[20] = 1; // format = 1
|
|
|
+ header[21] = 0;
|
|
|
+ header[22] = (byte) channels;
|
|
|
+ header[23] = 0;
|
|
|
+ header[24] = (byte) (longSampleRate & 0xff);
|
|
|
+ header[25] = (byte) ((longSampleRate >> 8) & 0xff);
|
|
|
+ header[26] = (byte) ((longSampleRate >> 16) & 0xff);
|
|
|
+ header[27] = (byte) ((longSampleRate >> 24) & 0xff);
|
|
|
+ header[28] = (byte) (byteRate & 0xff);
|
|
|
+ header[29] = (byte) ((byteRate >> 8) & 0xff);
|
|
|
+ header[30] = (byte) ((byteRate >> 16) & 0xff);
|
|
|
+ header[31] = (byte) ((byteRate >> 24) & 0xff);
|
|
|
+ header[32] = (byte) (channels * (bitsPerSample / 8)); //
|
|
|
+ // block align
|
|
|
+ header[33] = 0;
|
|
|
+ header[34] = bitsPerSample; // bits per sample
|
|
|
+ header[35] = 0;
|
|
|
+ header[36] = 'd';
|
|
|
+ header[37] = 'a';
|
|
|
+ header[38] = 't';
|
|
|
+ header[39] = 'a';
|
|
|
+ header[40] = (byte) (totalAudioLen & 0xff);
|
|
|
+ header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
|
|
|
+ header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
|
|
|
+ header[43] = (byte) ((totalAudioLen >> 24) & 0xff);
|
|
|
+ return header;
|
|
|
+ }
|
|
|
+}
|