使用AVRecorder開發(fā)音頻錄制功能

2024-02-16 13:55 更新

使用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()接口。

圖1 錄制狀態(tài)變化示意圖

狀態(tài)的詳細(xì)說明請(qǐng)參考AVRecorderState

開發(fā)步驟及注意事項(xiàng)

詳細(xì)的API說明請(qǐng)參考AVRecorder API參考。

  1. 創(chuàng)建AVRecorder實(shí)例,實(shí)例創(chuàng)建完成進(jìn)入idle狀態(tài)。
    1. import media from '@ohos.multimedia.media';
    2. let avRecorder = undefined;
    3. media.createAVRecorder().then((recorder) => {
    4. avRecorder = recorder;
    5. }, (err) => {
    6. console.error(`Invoke createAVRecorder failed, code is ${err.code}, message is ${err.message}`);
    7. })
  2. 設(shè)置業(yè)務(wù)需要的監(jiān)聽事件,監(jiān)聽狀態(tài)變化及錯(cuò)誤上報(bào)。

    事件類型

    說明

    stateChange

    必要事件,監(jiān)聽AVRecorder的state屬性改變

    error

    必要事件,監(jiān)聽AVRecorder的錯(cuò)誤信息

    1. // 狀態(tài)上報(bào)回調(diào)函數(shù)
    2. avRecorder.on('stateChange', (state, reason) => {
    3. console.log(`current state is ${state}`);
    4. // 用戶可以在此補(bǔ)充狀態(tài)發(fā)生切換后想要進(jìn)行的動(dòng)作
    5. })
    6. // 錯(cuò)誤上報(bào)回調(diào)函數(shù)
    7. avRecorder.on('error', (err) => {
    8. console.error(`avRecorder failed, code is ${err.code}, message is ${err.message}`);
    9. })
  3. 配置音頻錄制參數(shù),調(diào)用prepare()接口,此時(shí)進(jìn)入prepared狀態(tài)。
    說明

    配置參數(shù)需要注意:

    • prepare接口的入?yún)vConfig中僅設(shè)置音頻相關(guān)的配置參數(shù),如示例代碼所示。
    • 需要使用支持的錄制規(guī)格。
    • 錄制輸出的url地址(即示例里avConfig中的url),形式為fd://xx (fd number)。需要調(diào)用基礎(chǔ)文件操作接口(@ohos.file.fs)實(shí)現(xiàn)應(yīng)用文件訪問能力,獲取方式參考應(yīng)用文件訪問與管理。
    1. let avProfile = {
    2. audioBitrate: 100000, // 音頻比特率
    3. audioChannels: 2, // 音頻聲道數(shù)
    4. audioCodec: media.CodecMimeType.AUDIO_AAC, // 音頻編碼格式,當(dāng)前只支持aac
    5. audioSampleRate: 48000, // 音頻采樣率
    6. fileFormat: media.ContainerFormatType.CFT_MPEG_4A, // 封裝格式,當(dāng)前只支持m4a
    7. }
    8. let avConfig = {
    9. audioSourceType: media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC, // 音頻輸入源,這里設(shè)置為麥克風(fēng)
    10. profile: avProfile,
    11. url: 'fd://35', // 參考應(yīng)用文件訪問與管理中的開發(fā)示例獲取創(chuàng)建的音頻文件fd填入此處
    12. }
    13. avRecorder.prepare(avConfig).then(() => {
    14. console.log('Invoke prepare succeeded.');
    15. }, (err) => {
    16. console.error(`Invoke prepare failed, code is ${err.code}, message is ${err.message}`);
    17. })
  4. 開始錄制,調(diào)用start()接口,此時(shí)進(jìn)入started狀態(tài)。
  5. 暫停錄制,調(diào)用pause()接口,此時(shí)進(jìn)入paused狀態(tài)。
  6. 恢復(fù)錄制,調(diào)用resume()接口,此時(shí)再次進(jìn)入started狀態(tài)。
  7. 停止錄制,調(diào)用stop()接口,此時(shí)進(jìn)入stopped狀態(tài)。
  8. 重置資源,調(diào)用reset()重新進(jìn)入idle狀態(tài),允許重新配置錄制參數(shù)。
  9. 銷毀實(shí)例,調(diào)用release()進(jìn)入released狀態(tài),退出錄制。

完整示例

參考以下示例,完成“開始錄制-暫停錄制-恢復(fù)錄制-停止錄制”的完整流程。
  1. import media from '@ohos.multimedia.media';
  2. export class AudioRecorderDemo {
  3. private avRecorder;
  4. private avProfile = {
  5. audioBitrate: 100000, // 音頻比特率
  6. audioChannels: 2, // 音頻聲道數(shù)
  7. audioCodec: media.CodecMimeType.AUDIO_AAC, // 音頻編碼格式,當(dāng)前只支持aac
  8. audioSampleRate: 48000, // 音頻采樣率
  9. fileFormat: media.ContainerFormatType.CFT_MPEG_4A, // 封裝格式,當(dāng)前只支持m4a
  10. };
  11. private avConfig = {
  12. audioSourceType: media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC, // 音頻輸入源,這里設(shè)置為麥克風(fēng)
  13. profile: this.avProfile,
  14. url: 'fd://35', // 參考應(yīng)用文件訪問與管理開發(fā)示例新建并讀寫一個(gè)文件
  15. };
  16. // 注冊(cè)audioRecorder回調(diào)函數(shù)
  17. setAudioRecorderCallback() {
  18. // 狀態(tài)機(jī)變化回調(diào)函數(shù)
  19. this.avRecorder.on('stateChange', (state, reason) => {
  20. console.log(`AudioRecorder current state is ${state}`);
  21. })
  22. // 錯(cuò)誤上報(bào)回調(diào)函數(shù)
  23. this.avRecorder.on('error', (err) => {
  24. console.error(`AudioRecorder failed, code is ${err.code}, message is ${err.message}`);
  25. })
  26. }
  27. // 開始錄制對(duì)應(yīng)的流程
  28. async startRecordingProcess() {
  29. // 1.創(chuàng)建錄制實(shí)例
  30. this.avRecorder = await media.createAVRecorder();
  31. this.setAudioRecorderCallback();
  32. // 2.獲取錄制文件fd賦予avConfig里的url;參考FilePicker文檔
  33. // 3.配置錄制參數(shù)完成準(zhǔn)備工作
  34. await this.avRecorder.prepare(this.avConfig);
  35. // 4.開始錄制
  36. await this.avRecorder.start();
  37. }
  38. // 暫停錄制對(duì)應(yīng)的流程
  39. async pauseRecordingProcess() {
  40. if (this.avRecorder.state === 'started') { // 僅在started狀態(tài)下調(diào)用pause為合理狀態(tài)切換
  41. await this.avRecorder.pause();
  42. }
  43. }
  44. // 恢復(fù)錄制對(duì)應(yīng)的流程
  45. async resumeRecordingProcess() {
  46. if (this.avRecorder.state === 'paused') { // 僅在paused狀態(tài)下調(diào)用resume為合理狀態(tài)切換
  47. await this.avRecorder.resume();
  48. }
  49. }
  50. // 停止錄制對(duì)應(yīng)的流程
  51. async stopRecordingProcess() {
  52. // 1. 停止錄制
  53. if (this.avRecorder.state === 'started'
  54. || this.avRecorder.state === 'paused') { // 僅在started或者paused狀態(tài)下調(diào)用stop為合理狀態(tài)切換
  55. await this.avRecorder.stop();
  56. }
  57. // 2.重置
  58. await this.avRecorder.reset();
  59. // 3.釋放錄制實(shí)例
  60. await this.avRecorder.release();
  61. // 4.關(guān)閉錄制文件fd
  62. }
  63. // 一個(gè)完整的【開始錄制-暫停錄制-恢復(fù)錄制-停止錄制】示例
  64. async audioRecorderDemo() {
  65. await this.startRecordingProcess(); // 開始錄制
  66. // 用戶此處可以自行設(shè)置錄制時(shí)長,例如通過設(shè)置休眠阻止代碼執(zhí)行
  67. await this.pauseRecordingProcess(); //暫停錄制
  68. await this.resumeRecordingProcess(); // 恢復(fù)錄制
  69. await this.stopRecordingProcess(); // 停止錄制
  70. }
  71. }
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)