HarmonyOS 鸿蒙Next AudioCapturer录制的音频使用AVPlayer播放报类型不支持错误怎么解决
HarmonyOS 鸿蒙Next AudioCapturer录制的音频使用AVPlayer播放报类型不支持错误怎么解决
A: pcm格式转wav格式分两个步骤:先构造wav格式的文件头,再将pcm数据写入到wav文件中。
wav格式的文件头构造
//写入wav文件头函数
private writeWaveFileHeader(
out: fs.File,
audioDataSize: number,
totalDataLen: number,
byteRate: number
) {
const header = new ArrayBuffer(44);
const dv = new DataView(header);
const bitsPerSample = 16; // 当前位深是16
// 写入RIFF块
this.writeString(dv, 0, 'RIFF');
dv.setUint32(4, totalDataLen, true);
this.writeString(dv, 8, 'WAVE');
// 写入fmt块
this.writeString(dv, 12, 'fmt ');
dv.setUint32(16, 16, true); // fmt块大小
dv.setUint16(20, 1, true); // 格式类别 (PCM)
dv.setUint16(22, this.mChannel, true); // 通道数
dv.setUint32(24, this.mSampleRate, true); // 采样率
dv.setUint32(28, byteRate, true); // ByteRate 码率
dv.setUint16(32, this.mChannel * bitsPerSample / 8, true); // BlockAlign
dv.setUint16(34, bitsPerSample, true); // 位深
// 写入data块
this.writeString(dv, 36, 'data');
dv.setUint32(40, audioDataSize, true); // 数据块大小
fs.writeSync(out.fd, new Uint8Array(header).buffer, {
length: 44
})
}
pcm数据写入到wav文件中
private writePcmData(inFile: fs.File, outFile: fs.File, audioDataSize: number) {
// 写入 pcm 数据
let readSize = 0
let data = new ArrayBuffer(audioDataSize);
let readOptions: ReadOptions = {
offset: readSize,
length: audioDataSize
};
let readLen = fs.readSync(inFile.fd, data, readOptions);
while (readLen > 0) {
readSize += readLen;
fs.writeSync(outFile.fd, data, { length: readLen});
readOptions.offset = readSize;
readLen = fs.readSync(inFile.fd, data, readOptions);
}
fs.closeSync(inFile.fd)
fs.closeSync(outFile.fd)
}
音频文件使用base64编码参考
let file = await fileIo.open(this.selectedUri, fileIo.OpenMode.READ_ONLY);
let fileSize = fileIo.statSync(f.fd).size;
console.info('file Size: ' + fileSize);
let buffer = new ArrayBuffer(fileSize);
fileIo.readSync(f.fd, buffer);
fileIo.closeSync(f);
//Base64Helper的构造函数
let base64 = new util.Base64Helper();
//通过输入参数编码后输出Uint8Array对象
let unit8data = base64.encodeSync(new Uint8Array(buffer.slice(0, buffer.byteLength)))
//将字节数组解码为字符串,格式为utf-8
let textDecoder = util.TextDecoder.create('utf-8', { ignoreBOM : true })
let retStr = textDecoder.decodeWithStream( unit8data , {stream: false});
针对HarmonyOS 鸿蒙Next中AudioCapturer录制的音频使用AVPlayer播放时报类型不支持错误的问题,以下是一些可能的解决方案:
-
确认文件格式:
- 检查AudioCapturer录制的音频文件格式是否为PCM。PCM数据无法直接用AVPlayer播放,需要进行转码,如转换为WAV或MP3格式。
-
检查文件编码:
- 确保文件后缀与实际编码格式一致。例如,若保存的文件后缀为MP3,但实际编码非MP3,也会导致无法播放。
-
确保权限正确:
- 确保应用已正确申请并获取麦克风权限,以及录音和播放音频所需的其他权限。
-
使用适当的播放接口:
- 对于PCM等原始音频数据,考虑使用更适合的播放接口,如OpenSL ES或其他支持原始音频数据播放的接口。
-
检查文件路径和损坏情况:
- 确保文件路径正确无误,且文件未损坏。
如果以上方法均无法解决问题,可能是系统或应用存在其他故障。此时,建议联系官网客服以获取更专业的帮助。官网地址是:https://www.itying.com/category-93-b0.html