HarmonyOS 鸿蒙Next AudioCapturer录制的音频使用AVPlayer播放报类型不支持错误怎么解决

发布于 1周前 作者 sinazl 来自 鸿蒙OS

HarmonyOS 鸿蒙Next AudioCapturer录制的音频使用AVPlayer播放报类型不支持错误怎么解决

通过AudioCapturer录制音频,并将音频存储在wav格式的文件中。将wav格式文件通过base64编码后发送给服务端,服务端拿到base64编码后的文件作语音识别并播放。服务端使用AVPlayer播放时,发生报错,错误信息为"BusinessError: Unsupport Format: unsupport interface@5056652b"。 

2 回复

 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播放时报类型不支持错误的问题,以下是一些可能的解决方案:

  1. 确认文件格式

    • 检查AudioCapturer录制的音频文件格式是否为PCM。PCM数据无法直接用AVPlayer播放,需要进行转码,如转换为WAV或MP3格式。
  2. 检查文件编码

    • 确保文件后缀与实际编码格式一致。例如,若保存的文件后缀为MP3,但实际编码非MP3,也会导致无法播放。
  3. 确保权限正确

    • 确保应用已正确申请并获取麦克风权限,以及录音和播放音频所需的其他权限。
  4. 使用适当的播放接口

    • 对于PCM等原始音频数据,考虑使用更适合的播放接口,如OpenSL ES或其他支持原始音频数据播放的接口。
  5. 检查文件路径和损坏情况

    • 确保文件路径正确无误,且文件未损坏。

如果以上方法均无法解决问题,可能是系统或应用存在其他故障。此时,建议联系官网客服以获取更专业的帮助。官网地址是:https://www.itying.com/category-93-b0.html

回到顶部