音频流开始时要初始化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();
}
}
可以用此程序播放并查看波形
文件->导入->原始数据
