Android将PCM字节数组写入wav文件。
创始人
2024-10-08 12:31:12
0

以下是一个示例代码,演示如何将PCM字节数组写入WAV文件:

import java.io.FileOutputStream;
import java.io.IOException;

public class PCMToWavConverter {

    private static final int RECORDER_BPP = 16;
    private static final int RECORDER_SAMPLERATE = 44100;
    private static final int RECORDER_CHANNELS = 1;

    public static void convertPCMToWAV(byte[] pcmData, String filePath) throws IOException {
        long totalAudioLen = pcmData.length;
        long totalDataLen = totalAudioLen + 36;
        long longSampleRate = RECORDER_SAMPLERATE;
        int channels = RECORDER_CHANNELS;
        long byteRate = RECORDER_BPP * RECORDER_SAMPLERATE * channels / 8;

        FileOutputStream wavFile = new FileOutputStream(filePath);
        writeWaveFileHeader(wavFile, totalAudioLen, totalDataLen, longSampleRate, channels, byteRate);
        wavFile.write(pcmData);
        wavFile.close();
    }

    private static void writeWaveFileHeader(FileOutputStream wavFile, long totalAudioLen, long totalDataLen,
            long longSampleRate, int channels, long 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] = RECORDER_BPP; // 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);

        wavFile.write(header, 0, 44);
    }
}

使用方法:

byte[] pcmData = // your PCM byte array
String filePath = // your output WAV file path

try {
    PCMToWavConverter.convertPCMToWAV(pcmData, filePath);
    System.out.println("PCM to WAV conversion completed.");
} catch (IOException e) {
    e.printStackTrace();
}

以上代码将接收一个PCM字

相关内容

热门资讯

透视好牌!hhpoker可以开... 透视好牌!hhpoker可以开挂吗(透视)好像真的是有挂(详细辅助力荐教程);1、ai辅助优化,发牌...
带你了解!hhpoker到底可... 带你了解!hhpoker到底可以作弊码,pokemmo脚本手机版,大神讲解(有挂攻略)1、点击下载安...
透视真的!德扑圈透视(透视)原... 透视真的!德扑圈透视(透视)原来存在有挂(详细辅助可靠技巧)1、让任何用户在无需AI插件第三方神器的...
推荐一款!aapoker透视插... 推荐一款!aapoker透视插件,wepoker怎么破解游戏,wpk教程(有挂技巧)是一款可以让一直...
透视软件!德州透视脚本(透视)... 透视软件!德州透视脚本(透视)都是存在有挂(详细辅助专业教程)1、系统规律教程、辅助透视等服务,为用...
玩家必看科普!wepoker手... 玩家必看科普!wepoker手机插件,红龙poker辅助平台,AA德州教程(有挂辅助)1、玩家可以在...
透视代打!大菠萝免费辅助器(透... 透视代打!大菠萝免费辅助器(透视)都是存在有挂(详细辅助玩家教你);运辅助工具,进入游戏界面。进入辅...
揭秘关于!德普辅助器辅助器怎么... 揭秘关于!德普辅助器辅助器怎么用,pokemomo辅助软件,微扑克教程(有挂技巧)关于德普辅助器辅助...
技术分享!impoker辅助,... 《技术分享!impoker辅助,wepoker能不能透视,透明挂教程(有挂方法)》 wepoker能...
透视免费!wepoker有辅助... 透视免费!wepoker有辅助器吗(透视)果然存在有挂(详细辅助解密教程);1、ai辅助优化,发牌逻...