HarmonyOS 鸿蒙Next使用AudioCapturer录制的音频无法在PC、安卓端、web端播放

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

HarmonyOS 鸿蒙Next使用AudioCapturer录制的音频无法在PC、安卓端、web端播放 使用系统的AudioCapturer录制音频并保存文件后,文件无法在浏览器或其他平台播放,以下是使用鸿蒙录制的音频文件:

https://wf.namibox.com/chat/2024/10/11477/1728720168799.wav

录制参数如下:

this.audioCapturer = await audio.createAudioCapturer({
  streamInfo: {
    samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_16000,
    channels: audio.AudioChannel.CHANNEL_1,
    sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
    encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW,
    channelLayout: audio.AudioChannelLayout.CH_LAYOUT_MONO
  },
  capturerInfo: { source: audio.SourceType.SOURCE_TYPE_MIC, capturerFlags: 0 } 
})

写入代码如下:

private readDataCallback = (buffer: ArrayBuffer) => {
  if (this.file) {
    let options: WriteOptions = { offset: this.bufferSize, length: buffer.byteLength, }
    fs.writeSync(this.file.fd, buffer, options)
    this.bufferSize += buffer.byteLength
  }
}

更多关于HarmonyOS 鸿蒙Next使用AudioCapturer录制的音频无法在PC、安卓端、web端播放的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

AudioCapturer录制的音频是PCM流,WAV文件包含文件头,如果应用需要将录制出来的pcm码流保存成.wav格式的可以自己在前面添加需要的文件头,文件头是44字节。

参考demo

import fs, { ReadOptions } from '@ohos.file.fs';

export class PcmToWavUtil {

  //采样率
  private mSampleRate: number = 0

  // 声道数
  private mChannel: number = 0;

  /**
   * @param sampleRate sample rate、采样率
   * @param channel channel、声道
   */
  constructor(sampleRate:number, channel: number) {
    this.mSampleRate = sampleRate;
    this.mChannel = channel;
  }

  /**
   * pcm文件转wav文件函数
   * @param src 源文件
   * @param dest 目标文件
   */
  public pcmToWav(src: string, dest: string) {
    const inFile: fs.File = fs.openSync(src, fs.OpenMode.READ_ONLY);
    const outFile: fs.File = fs.openSync(dest, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);

    let byteRate = 16 * this.mSampleRate * this.mChannel / 8;

    let inFileStat = fs.statSync(inFile.fd)
    // 音频文件
    let audioDataSize = inFileStat.size;

    let totalDataLen = audioDataSize + 36;

    // 1. wav 文件头编写
    this.writeWaveFileHeader(outFile, audioDataSize, totalDataLen, byteRate);

    // 2. 写入 pcm 数据
    this.writePcmData(inFile, outFile, audioDataSize)
  }

  // pcm 数据写入到 pcm 文件函数
  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)
  }

  //写入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
    })
  }

  private writeString(dv: DataView, offset: number, str: string) {
    for (let i = 0; i < str.length; i++) {
      dv.setUint8(offset + i, str.charCodeAt(i));
    }
  }
}

更多关于HarmonyOS 鸿蒙Next使用AudioCapturer录制的音频无法在PC、安卓端、web端播放的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HarmonyOS 鸿蒙Next使用AudioCapturer录制的音频无法在PC、安卓端、Web端播放的问题,可能涉及音频格式兼容性、编码设置或文件损坏等因素。

  1. 音频格式兼容性:确保录制的音频格式(如AAC、MP3、WAV等)是这些平台所支持的。不同平台对音频格式的兼容性有所不同,某些格式可能在特定平台上不被直接支持。

  2. 编码设置:检查AudioCapturer的编码设置,确保使用的编码方式(如比特率、采样率、声道数等)符合通用标准,避免使用过于特殊或非主流的编码参数。

  3. 文件完整性:验证录制的音频文件是否完整且未损坏。文件损坏可能导致无法正常播放。

  4. 平台软件支持:确认PC、安卓端和Web端的音频播放软件或浏览器是否支持所录制的音频格式。必要时,尝试更新这些软件或浏览器至最新版本。

  5. 转码尝试:如果问题依旧存在,可以尝试使用第三方音频转码工具将录制的音频转换为更通用的格式,如MP3,再尝试在不同平台上播放。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部