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

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

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

相关推荐
唐青枫21 小时前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马1 天前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
用户3721574261351 天前
Java 处理 PDF 图片:提取 PDF 中的图片,并压缩 PDF 图片体积
java
用户3721574261351 天前
Java 打印 Word 文档:从基础打印到高级设置
java
用户3521802454752 天前
当 Prompt 学会"热更新":Spring Boot × Nacos3 AI 实战
java·spring boot·ai编程
东坡白菜2 天前
破局全栈:一个前端开发的Java入门实战记录(1)
java·全栈
唐青枫2 天前
Java Tomcat 实战指南:从 Servlet 容器到 Spring Boot 部署
java
wsaaaqqq2 天前
roudan:自由选择实体、灵活操作数据、快速写入数据库的 Java 框架
java
plainGeekDev2 天前
null 判断 → Kotlin 可空类型
android·java·kotlin
糖拌西瓜皮2 天前
Java开发者视角:深入理解Node.js异步编程模型
java·后端·node.js