W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
使用AVRecorder可以實(shí)現(xiàn)音頻錄制功能,本開發(fā)指導(dǎo)將以“開始錄制-暫停錄制-恢復(fù)錄制-停止錄制”的一次流程為示例,向開發(fā)者講解AVRecorder音頻錄制相關(guān)功能。
在進(jìn)行應(yīng)用開發(fā)的過程中,開發(fā)者可以通過AVRecorder的state屬性,主動(dòng)獲取當(dāng)前狀態(tài)或使用on('stateChange')方法監(jiān)聽狀態(tài)變化。開發(fā)過程中應(yīng)該嚴(yán)格遵循狀態(tài)機(jī)要求,例如只能在started狀態(tài)下調(diào)用pause()接口,只能在paused狀態(tài)下調(diào)用resume()接口。
狀態(tài)的詳細(xì)說明請(qǐng)參考AVRecorderState。
詳細(xì)的API說明請(qǐng)參考AVRecorder API參考。
- import media from '@ohos.multimedia.media';
- let avRecorder = undefined;
- media.createAVRecorder().then((recorder) => {
- avRecorder = recorder;
- }, (err) => {
- console.error(`Invoke createAVRecorder failed, code is ${err.code}, message is ${err.message}`);
- })
事件類型 | 說明 |
---|---|
stateChange | 必要事件,監(jiān)聽AVRecorder的state屬性改變 |
error | 必要事件,監(jiān)聽AVRecorder的錯(cuò)誤信息 |
- // 狀態(tài)上報(bào)回調(diào)函數(shù)
- avRecorder.on('stateChange', (state, reason) => {
- console.log(`current state is ${state}`);
- // 用戶可以在此補(bǔ)充狀態(tài)發(fā)生切換后想要進(jìn)行的動(dòng)作
- })
- // 錯(cuò)誤上報(bào)回調(diào)函數(shù)
- avRecorder.on('error', (err) => {
- console.error(`avRecorder failed, code is ${err.code}, message is ${err.message}`);
- })
配置參數(shù)需要注意:
- let avProfile = {
- audioBitrate: 100000, // 音頻比特率
- audioChannels: 2, // 音頻聲道數(shù)
- audioCodec: media.CodecMimeType.AUDIO_AAC, // 音頻編碼格式,當(dāng)前只支持aac
- audioSampleRate: 48000, // 音頻采樣率
- fileFormat: media.ContainerFormatType.CFT_MPEG_4A, // 封裝格式,當(dāng)前只支持m4a
- }
- let avConfig = {
- audioSourceType: media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC, // 音頻輸入源,這里設(shè)置為麥克風(fēng)
- profile: avProfile,
- url: 'fd://35', // 參考應(yīng)用文件訪問與管理中的開發(fā)示例獲取創(chuàng)建的音頻文件fd填入此處
- }
- avRecorder.prepare(avConfig).then(() => {
- console.log('Invoke prepare succeeded.');
- }, (err) => {
- console.error(`Invoke prepare failed, code is ${err.code}, message is ${err.message}`);
- })
- import media from '@ohos.multimedia.media';
- export class AudioRecorderDemo {
- private avRecorder;
- private avProfile = {
- audioBitrate: 100000, // 音頻比特率
- audioChannels: 2, // 音頻聲道數(shù)
- audioCodec: media.CodecMimeType.AUDIO_AAC, // 音頻編碼格式,當(dāng)前只支持aac
- audioSampleRate: 48000, // 音頻采樣率
- fileFormat: media.ContainerFormatType.CFT_MPEG_4A, // 封裝格式,當(dāng)前只支持m4a
- };
- private avConfig = {
- audioSourceType: media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC, // 音頻輸入源,這里設(shè)置為麥克風(fēng)
- profile: this.avProfile,
- url: 'fd://35', // 參考應(yīng)用文件訪問與管理開發(fā)示例新建并讀寫一個(gè)文件
- };
- // 注冊(cè)audioRecorder回調(diào)函數(shù)
- setAudioRecorderCallback() {
- // 狀態(tài)機(jī)變化回調(diào)函數(shù)
- this.avRecorder.on('stateChange', (state, reason) => {
- console.log(`AudioRecorder current state is ${state}`);
- })
- // 錯(cuò)誤上報(bào)回調(diào)函數(shù)
- this.avRecorder.on('error', (err) => {
- console.error(`AudioRecorder failed, code is ${err.code}, message is ${err.message}`);
- })
- }
- // 開始錄制對(duì)應(yīng)的流程
- async startRecordingProcess() {
- // 1.創(chuàng)建錄制實(shí)例
- this.avRecorder = await media.createAVRecorder();
- this.setAudioRecorderCallback();
- // 2.獲取錄制文件fd賦予avConfig里的url;參考FilePicker文檔
- // 3.配置錄制參數(shù)完成準(zhǔn)備工作
- await this.avRecorder.prepare(this.avConfig);
- // 4.開始錄制
- await this.avRecorder.start();
- }
- // 暫停錄制對(duì)應(yīng)的流程
- async pauseRecordingProcess() {
- if (this.avRecorder.state === 'started') { // 僅在started狀態(tài)下調(diào)用pause為合理狀態(tài)切換
- await this.avRecorder.pause();
- }
- }
- // 恢復(fù)錄制對(duì)應(yīng)的流程
- async resumeRecordingProcess() {
- if (this.avRecorder.state === 'paused') { // 僅在paused狀態(tài)下調(diào)用resume為合理狀態(tài)切換
- await this.avRecorder.resume();
- }
- }
- // 停止錄制對(duì)應(yīng)的流程
- async stopRecordingProcess() {
- // 1. 停止錄制
- if (this.avRecorder.state === 'started'
- || this.avRecorder.state === 'paused') { // 僅在started或者paused狀態(tài)下調(diào)用stop為合理狀態(tài)切換
- await this.avRecorder.stop();
- }
- // 2.重置
- await this.avRecorder.reset();
- // 3.釋放錄制實(shí)例
- await this.avRecorder.release();
- // 4.關(guān)閉錄制文件fd
- }
- // 一個(gè)完整的【開始錄制-暫停錄制-恢復(fù)錄制-停止錄制】示例
- async audioRecorderDemo() {
- await this.startRecordingProcess(); // 開始錄制
- // 用戶此處可以自行設(shè)置錄制時(shí)長,例如通過設(shè)置休眠阻止代碼執(zhí)行
- await this.pauseRecordingProcess(); //暫停錄制
- await this.resumeRecordingProcess(); // 恢復(fù)錄制
- await this.stopRecordingProcess(); // 停止錄制
- }
- }
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: