HarmonyOS 鸿蒙Next下使用AVRecorder录制并播放mp3格式文件

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

HarmonyOS 鸿蒙Next下使用AVRecorder录制并播放mp3格式文件

本人小白,在对照文档使用AVRecorder来录制音频的时候,一直没有尝试成功,我现在是希望能够录制mp3格式的音频文件,并且实现播放,大佬们有没有示例demo可以让我对照参考一下的。

7 回复
我也遇到这个问题,只能录制m4a格式,配置mp3会报5400103

更多关于HarmonyOS 鸿蒙Next下使用AVRecorder录制并播放mp3格式文件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


比特率与采样率需要对应

await this.avRecorder.prepare(this.getAVConfig());  这句堵塞了,不往下面执行,不知道什么原因
await this.avRecorder.start();

可能是比特率设置的问题,我用100000音频比特率是不行的,你可以试试我成功的方法:

this.file = fs.openSync(this.path, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); let avProfile: media.AVRecorderProfile = { audioBitrate: 48000, // 音频比特率 audioChannels: 2, // 音频声道数 audioCodec: media.CodecMimeType.AUDIO_MP3, // 音频编码格式,当前只支持aac audioSampleRate: 48000, // 音频采样率 fileFormat: media.ContainerFormatType.CFT_MP3, // 封装格式,当前只支持m4a } let avConfig: media.AVRecorderConfig = { audioSourceType: media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC, // 音频输入源,这里设置为麦克风 profile: avProfile, url: fd://${this.file?.fd}, // 参考应用文件访问与管理中的开发示例获取创建的音频文件fd填入此处 } if (this.avRecorder != undefined) { await this.avRecorder.release(); this.avRecorder = undefined; } // 1.创建录制实例 this.avRecorder = await media.createAVRecorder(); // 2.配置录制参数完成准备工作 this.avRecorder.prepare(avConfig)

import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
import { common } from '@kit.AbilityKit';
import fs from '@ohos.file.fs';
import { media } from '@kit.MediaKit';
import { BusinessError } from '@kit.BasicServicesKit';

class AudioRecorderDemo { private fd: number

constructor(fd: number) { this.fd = fd; }

private avRecorder: media.AVRecorder | undefined = undefined; private avProfile: media.AVRecorderProfile = { audioBitrate: 100000, // 音频比特率 audioChannels: 2, // 音频声道数 audioCodec: media.CodecMimeType.AUDIO_AAC, // 音频编码格式,当前只支持aac audioSampleRate: 48000, // 音频采样率 fileFormat: media.ContainerFormatType.CFT_MPEG_4A, // 封装格式,当前只支持m4a };

getAVConfig(): media.AVRecorderConfig { return { audioSourceType: media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC, // 音频输入源,这里设置为麦克风 profile: this.avProfile, url: fd:<span class="hljs-comment">//${this.fd}, // 参考应用文件访问与管理开发示例新建并读写一个文件 }; }

// 注册audioRecorder回调函数 setAudioRecorderCallback() { if (this.avRecorder != undefined) { // 状态机变化回调函数 this.avRecorder.on(‘stateChange’, (state: media.AVRecorderState, reason: media.StateChangeReason) => { console.log(AudioRecorder current state is ${state}); }) // 错误上报回调函数 this.avRecorder.on(‘error’, (err: BusinessError) => { console.error(AudioRecorder failed, code is ${err.code}, message is ${err.message}); }) } }

// 开始录制对应的流程 async startRecordingProcess() { try { if (this.avRecorder != undefined) { await this.avRecorder.release(); this.avRecorder = undefined; } // 1.创建录制实例 this.avRecorder = await media.createAVRecorder(); this.setAudioRecorderCallback(); // 2.获取录制文件fd赋予avConfig里的url;参考FilePicker文档

  <span class="hljs-comment">// 3.配置录制参数完成准备工作</span>
  await <span class="hljs-keyword">this</span>.avRecorder.prepare(<span class="hljs-keyword">this</span>.getAVConfig());
  <span class="hljs-comment">// 4.开始录制</span>
  await <span class="hljs-keyword">this</span>.avRecorder.start();
} <span class="hljs-keyword">catch</span> (e) {
  console.error(`yl test error e: ${<span class="hljs-built_in">JSON</span>.stringify(e)}`)
}

}

// 暂停录制对应的流程 async pauseRecordingProcess() { if (this.avRecorder != undefined && this.avRecorder.state === ‘started’) { // 仅在started状态下调用pause为合理状态切换 await this.avRecorder.pause(); } }

// 恢复录制对应的流程 async resumeRecordingProcess() { if (this.avRecorder != undefined && this.avRecorder.state === ‘paused’) { // 仅在paused状态下调用resume为合理状态切换 await this.avRecorder.resume(); } }

// 停止录制对应的流程 async stopRecordingProcess() { if (this.avRecorder != undefined) { // 1. 停止录制 if (this.avRecorder.state === ‘started’ || this.avRecorder.state === ‘paused’) { // 仅在started或者paused状态下调用stop为合理状态切换 await this.avRecorder.stop(); } // 2.重置 await this.avRecorder.reset(); // 3.释放录制实例 await this.avRecorder.release(); this.avRecorder = undefined; // 4.关闭录制文件fd fs.close(this.fd) } }

// 一个完整的【开始录制-暂停录制-恢复录制-停止录制】示例 async audioRecorderDemo() { await this.startRecordingProcess(); // 开始录制 // 用户此处可以自行设置录制时长,例如通过设置休眠阻止代码执行 await this.pauseRecordingProcess(); //暂停录制 await this.resumeRecordingProcess(); // 恢复录制 await this.stopRecordingProcess(); // 停止录制 } }

@Entry @Component struct AVRecorderPage { @State message: string = ‘Hello World’; av?: AudioRecorderDemo atManager = abilityAccessCtrl.createAtManager(); permissions: Array<Permissions> = [ ‘ohos.permission.MICROPHONE’, ‘ohos.permission.WRITE_MEDIA’, ‘ohos.permission.READ_MEDIA’, ‘ohos.permission.MEDIA_LOCATION’, ]; @State path: string = “”;

async start() { let result = await this.requestPermissions(); if (result) { let context = getContext() as common.UIAbilityContext; this.path = context.filesDir + “/” + “AV_” + Date.parse(new Date().toString()) + “.m4a”; let file = this.createOrOpen(this.path); this.av = new AudioRecorderDemo(file.fd) this.av.startRecordingProcess() } }

createOrOpen(path: string): fs.File { let isExist = fs.accessSync(path); let file: fs.File; if (isExist) { file = fs.openSync(path, fs.OpenMode.READ_WRITE); } else { file = fs.openSync(path, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE) } return file; }

//第1步:请求权限 async requestPermissions(): Promise<boolean> {

<span class="hljs-keyword">return</span> await <span class="hljs-keyword">new</span> Promise((resolve: <span class="hljs-built_in">Function</span>) =&gt; {
  <span class="hljs-keyword">try</span> {
    <span class="hljs-keyword">let</span> context = getContext() as common.UIAbilityContext;
    <span class="hljs-keyword">this</span>.atManager.requestPermissionsFromUser(context, <span class="hljs-keyword">this</span>.permissions)
      .then(async () =&gt; {
        console.log(`yl test info : ${<span class="hljs-built_in">JSON</span>.stringify(<span class="hljs-string">"权限请求成功"</span>)}`)
        resolve(<span class="hljs-literal">true</span>)
      }).catch(() =&gt; {
      console.error(`yl test info : ${<span class="hljs-built_in">JSON</span>.stringify(<span class="hljs-string">"权限请求异常"</span>)}`)
      resolve(<span class="hljs-literal">false</span>)
    });

  } <span class="hljs-keyword">catch</span> (err) {
    console.error(`yl test info : ${<span class="hljs-built_in">JSON</span>.stringify(<span class="hljs-string">"权限请求err"</span>)}` + err)
    resolve(<span class="hljs-literal">false</span>)
  }
});

}

build() { Column() { Button(‘start-开始’).onClick(() => { this.start() }) Button(‘pause-暂停’).onClick(() => { this.av?.pauseRecordingProcess() }) Button(‘resume-恢复’).onClick(() => { this.av?.resumeRecordingProcess() }) Button(‘stop-停止’).onClick(() => { this.av?.stopRecordingProcess() }) } .margin({top:80}) .height(‘100%’) .width(‘100%’) } }

不知道你这个代码录制音频后浏览器读取到的时长是不是实际时长

在HarmonyOS鸿蒙Next系统中使用AVRecorder录制并播放MP3格式文件,涉及音频录制与播放的API调用。以下是一个简要说明:

  1. 录制音频

    • 初始化AVRecorder对象,并配置音频源、编码格式(设置为MP3)、采样率、比特率等参数。
    • 使用startRecording方法开始录制音频,确保音频数据被正确编码并存储为MP3文件。
    • 录制完成后,调用stopRecording方法停止录制并释放资源。
  2. 播放音频

    • 初始化AVPlayer对象,并设置要播放的MP3文件路径。
    • 使用prepare方法进行音频文件预处理,确保音频数据可播放。
    • 调用start方法开始播放音频,pause方法暂停播放,stop方法停止播放。
    • 在播放过程中,可以监听播放状态变化,如播放完成、播放错误等。

请注意,实际开发中需要根据HarmonyOS的API文档和示例代码进行详细实现,确保所有步骤正确无误。由于API可能会随着系统版本更新而有所变化,建议查阅最新的HarmonyOS开发文档。鸿蒙Next高级实战已发布,可以先学学:https://www.itying.com/goods-1204.html

回到顶部