如何将pcm数据流封装为wav格式
时间: 2024-02-15 18:02:41 浏览: 145
要将PCM数据流封装为WAV文件格式,需要将PCM数据流保存到WAV文件中,并为WAV文件添加相应的文件头和元数据。WAV文件格式是一种常见的音频文件格式,通常用于存储未经压缩的音频数据。
下面是一个简单的示例代码,演示了如何将PCM数据流封装为WAV文件格式:
```java
public static void pcmToWav(String pcmPath, String wavPath, int sampleRate, int channels, int bitPerSample) {
FileInputStream pcmInputStream = null;
FileOutputStream wavOutputStream = null;
long totalAudioLen, totalDataLen;
long longSampleRate = sampleRate;
int byteRate = bitPerSample * channels * (int) (longSampleRate / 8);
try {
pcmInputStream = new FileInputStream(new File(pcmPath));
wavOutputStream = new FileOutputStream(new File(wavPath));
totalAudioLen = pcmInputStream.getChannel().size();
totalDataLen = totalAudioLen + 36;
byte[] data = new byte[1024];
writeWaveFileHeader(wavOutputStream, totalAudioLen, totalDataLen, longSampleRate, channels, byteRate);
while (pcmInputStream.read(data) != -1) {
wavOutputStream.write(data);
}
pcmInputStream.close();
wavOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void writeWaveFileHeader(
FileOutputStream outputStream, long totalAudioLen,
long totalDataLen, long longSampleRate, int channels,
int byteRate) throws IOException {
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) (2 * 16 / 8); // block align
header[33] = 0;
header[34] = (byte) bitPerSample;
header[35] = 0;
header[36] = 'd'; // data chunk
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);
outputStream.write(header, 0, 44);
}
```
在这个示例代码中,我们定义了一个`pcmToWav()`方法,用于将PCM数据流保存为WAV文件。该方法接收三个参数:PCM文件路径、WAV文件路径、采样率、声道数和位宽。在方法中,我们使用FileInputStream读取PCM文件中的数据,并使用FileOutputStream将WAV文件写入磁盘。同时,我们调用了`writeWaveFileHeader()`方法,向WAV文件中添加WAV文件头和元数据。在添加WAV文件头和元数据时,我们需要根据采样率、声道数和位宽计算出相应的文件头和元数据,并将其写入WAV文件中。
通过调用`pcmToWav()`方法,我们可以将PCM数据流保存为WAV文件,并在保存的过程中添加相应的文件头和元数据。
阅读全文