PCM 转 WAV 的 Java 实现
PCM (Pulse Code Modulation) 它将模拟音频信号转换为数字信号,是一种用于数字音频的编码格式。而 WAV (Waveform Audio File Format) 一种常见的音频文件格式,通常用于存储无损音频数据。本文将介绍如何使用 Java 实现 PCM 转 WAV 并提供相应的代码示例。
PCM 数据格式PCM 数据由一系列采样点组成,每个采样点在某一时刻表示音频的振幅值。通常,PCM 数据是以 16 以符号整数的形式存储的位置,范围为 -32768 到 32767.我们可以用二维数组来表示 PCM 数据,每个元素代表一个采样点的振幅值。
WAV 文件格式WAV 文件由文件头和音频数据组成。文件头包含音频元数据,如采样率、声道数等信息。音频数据是基于 PCM 以数据的形式存储。
标准的 WAV 文件头由 44 可以使用以下字节组成 Java 代码创建一个标准 WAV 文件头:
byte[] createWavHeader(int sampleRate, int channels, int bitsPerSample, int dataSize) { byte[] header = new byte[44]; // Chunk ID header[0] = 'R'; header[1] = 'I'; header[2] = 'F'; header[3] = 'F'; // Chunk Size int chunkSize = dataSize + 36; header[4] = (byte) (chunkSize & 0xFF); header[5] = (byte) ((chunkSize >> 8) & 0xFF); header[6] = (byte) ((chunkSize >> 16) & 0xFF); header[7] = (byte) ((chunkSize >> 24) & 0xFF); // Format header[8] = 'W'; header[9] = 'A'; header[10] = 'V'; header[11] = 'E'; // Subchunk 1 ID header[12] = 'f'; header[13] = 'm'; header[14] = 't'; header[15] = ' '; // Subchunk 1 Size int subchunk1Size = 16; header[16] = (byte) (subchunk1Size & 0xFF); header[17] = (byte) ((subchunk1)))Size >> 8) & 0xFF); header[18] = (byte) ((subchunk1)))Size >> 16) & 0xFF); header[19] = (byte) ((subchunk1)))Size >> 24) & 0xFF); // Audio Format header[20] = 1; // PCM // Num Channels header[22] = (byte) channels; // Sample Rate header[24] = (byte) (sampleRate & 0xFF); header[25] = (byte) ((sampleRate >> 8) & 0xFF); header[26] = (byte) ((sampleRate >> 16) & 0xFF); header[27] = (byte) ((sampleRate >> 24) & 0xFF); // Byte Rate int byteRate = sampleRate * channels * bitsPerSample / 8; header[28] = (byte) (byteRate & 0xFF); header[29] = (byte) ((byteRate >> 8) & 0xFF); header[30] = (byte) ((byteRate >> 16) & 0xFF); header[31] = (byte) ((byteRate >> 24) & 0xFF); // Block Align int blockAlign = channels * bitsPerSample / 8; header[32] = (byte) blockAlign; // Bits Per Sample header[34] = (byte) bitsPerSample; // Subchunk 2 ID header[36] = 'd'; header[37] = 'a'; header[38] = 't'; header[39] = 'a'; // Subchunk 2 Size header[40] = (byte) (dataSize & 0xFF); header[41] = (byte) ((dataSize >> 8) & 0xFF); header[42] = (byte) ((dataSize >> 16) & 0xFF); header[43] = (byte) ((dataSize >> 24) & 0xFF); return header;}
生成的 WAV 文件