生成pcm文件并播放查看波形

音频流开始时要初始化PcmFile,我目前采用的是覆盖模式,只生成一个car_audio.pcm文件,新的音频会覆盖旧的。

java 复制代码
// ===================== 全局变量 =====================
private FileOutputStream mPcmFos = null;
private File mPcmFile;


private void initPcmFileToMusic() {
    try {
        // 车机可写路径
        File musicDir = new File("/data/tmp/local/Res");
        if (!musicDir.exists()) {
            musicDir.mkdirs();
         }

         mPcmFile = new File(musicDir, "car_audio.pcm");

         // =====================
         // 关键:第二个参数 false = 覆盖旧文件!
         // true = 追加
         // false = 覆盖
         // =====================
         mPcmFos = new FileOutputStream(mPcmFile, false);

         Log.d("PCM", "开始录制(覆盖模式):" + mPcmFile.getAbsolutePath());

     } catch (IOException e) {
         e.printStackTrace();
         mPcmFos = null;
     }
}

音频数据回调时写入文件 ByteBuffer byteBufferData

java 复制代码
// 1. 创建一个和缓冲区剩余数据长度一样的字节数组
byte[] audioData = new byte[byteBufferData.remaining()];
// 2. 标记当前 position 位置
byteBufferData.mark();
// 3. 把缓冲区数据读到数组里 → 会导致 position 移动
byteBufferData.get(audioData);
// 4. 恢复 position 到刚才标记的位置 → 还原现场
byteBufferData.reset();

//写入文件(真实音频数据)
if (mPcmFos != null) {
    try {
    mPcmFos.write(audioData);
        Log.d("PCM", "成功写入:" + audioData.length + " 字节");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

音频流结束时关闭文件

java 复制代码
// ===================== 关闭文件 =====================
private void closePcmFile() {
    try {
        if (mPcmFos != null) {
            mPcmFos.close();
            mPcmFos = null; // 置空,保证下次重新创建
            Log.d("PCM", "录制完成:" + mPcmFile.getAbsolutePath());
         }
     } catch (IOException e) {
         e.printStackTrace();
     }
}

可以用此程序播放并查看波形

文件->导入->原始数据

相关推荐
Devin~Y1 小时前
大厂Java面试实录:Spring Boot/JPA/Redis/Kafka/K8s 可观测性 + Spring AI RAG/Agent(小Y翻车现场)
java·spring boot·redis·mybatis·hibernate·spring mvc·jpa
likerhood1 小时前
认识 JVM:Java 程序背后的那台“隐形计算机”
java·开发语言·jvm
wangchunting1 小时前
Java9功能更新说明
java·开发语言
hikktn1 小时前
30万数据导出从2分钟到15秒:一场与内存溢出的生死较量【宗申集团】
java
武帝为此1 小时前
【软件开发日志介绍】
java·前端·数据库
likerhood1 小时前
Java 反射与注解的详细讲解
java·开发语言·数据库
asdfg12589631 小时前
从Java的设计模式看接口和实现---List与ArrayList
java·开发语言·设计模式·面向对象·面向接口
djk88881 小时前
.net swagger api 开启跨域 开启注释
java·前端·.net
秋91 小时前
java中对操作mysql8.0.46与MySQL9.7.0有什么区别,并举例说明
android·java·adb