生成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();
     }
}

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

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

相关推荐
学编程就要猛2 小时前
流式编程及Spring中SSE实现
java·后端·spring·流式编程
随遇而安zx2 小时前
【多线程】---ConcurrentHashMap 源码解析
java·多线程·并发
不才不才不不才2 小时前
Spring 源码系列(27): @Transactional 七大失效场景与源码归因
java·后端·spring
随遇而安zx2 小时前
【多线程】---线程池 ThreadPoolExecutor 原理与调优
java·线程池·多线程
抠脚小弟2 小时前
WebSocketServer 使用详解:从入门到实战
java·spring·websocketserver
随便做点啥2 小时前
32卡64G-910B4-16后端集群部署报告
java·大数据·运维
Wang's Blog2 小时前
Java框架快速入门: Spring Security+OAuth2之字段验证与自定义验证注解实战
java·算法·spring
CodeStats2 小时前
【Java 类加载器】Java 类加载器完整体系深度拆解(上):从 JVM 启动到双亲委派模型
java·开发语言·jvm·classloader·双亲委派
带多刺的玫瑰2 小时前
Leecode#29刷题之两数相除
java·python·算法
LuTshoes3 小时前
spring ai 实战-MCP
java·人工智能·spring