<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【Harmony Next】使用 AVPlayer 播放音頻

      在鴻蒙Next系統中,AVPlayer為開發者提供了強大的音頻播放功能。以下將詳細介紹如何使用AVPlayer來實現音頻播放。

      官方文檔:使用AVPlayer播放音頻(ArkTS)

      播放狀態變化示意圖

      file

      基本使用步驟

      1. 創建AVPlayer實例:通過media.createAVPlayer()方法創建AVPlayer實例,用于控制音頻的播放。示例代碼如下:
      async createAVPlayerInstance() {
          const avPlayer = await media.createAVPlayer(); // 異步
          return avPlayer;
      }
      
      1. 設置播放源:指定本地 rawFile 路徑,如 test.mp3
        async setSourcePath(path: string) {
        setTimeout(async () => {
          if (!this.checkNull()) {
            try {
              let context = getContext(this) as common.UIAbilityContext;
              let fileDescriptor = await context.resourceManager.getRawFd(path);
              let fileFd: number = JSON.parse(JSON.stringify(fileDescriptor))['fd']
              let fileOffset: number = JSON.parse(JSON.stringify(fileDescriptor))['offset']
              this.avFileDescriptor = { fd: fileFd, offset: fileOffset, length: -1 };
              this.avPlayer!.fdSrc = this.avFileDescriptor;
            } catch (err) {
              console.info('Set Url failed : ' + JSON.stringify(err))
            }
          }
        }, 500)
      }
      
      1. 監聽狀態變化:監聽stateChange事件來了解播放器的狀態,從而做出相應操作。示例代碼如下:
      
      /**
       * avplayer回調
       */
      private setAVPlayerCallback() {
        if (this.checkNull()) {
          return
        }
        // seek操作結果回調
        this.avPlayer!.on('seekDone', (seekDoneTime) => {
          console.info(`AVPlayer seek succeeded, seek time is ${seekDoneTime}`);
        })
      
        // 音量變化回調
        this.avPlayer!.on('volumeChange', (volume) => {
          console.info(`volumeChange called, and new volume is :${volume}`);
        })
      
        // 音頻總時長
        this.avPlayer!.on('durationUpdate', (duration) => {
          console.info(`durationUpdate :${duration}`);
        })
      
        // 當前播放進度
        this.avPlayer!.on('timeUpdate', (time) => {
          let now = Math.floor(time/1000)
          if (this.process != now) {
            console.info(`timeUpdate :${now}`);
          }
          this.process = now
        })
      
        // error回調監聽函數,當avPlayer在操作過程中出現錯誤時調用reset接口觸發重置流程
        this.avPlayer!.on('error', (err) => {
          console.error(`Invoke avPlayer failed, code is ${err.code}, message is ${err.message}`);
          this.avPlayer!.reset(); // 調用reset重置資源,觸發idle狀態
        })
      
        // 狀態機變化回調函數
        this.avPlayer!.on('stateChange', async (state, reason) => {
          switch (state) {
            case 'idle': // 成功調用reset接口后觸發該狀態機上報
              console.info('AVPlayer state idle called.');
              this.avPlayer!.release(); // 調用release接口銷毀實例對象
              break;
            case 'initialized': // avplayer 設置播放源后觸發該狀態上報
              console.info('AVPlayer state initialized called.');
              this.avPlayer!.prepare().then(() => {
                console.info('AVPlayer prepare succeeded.');
              }, () => {
                console.error(`Invoke prepare failed, code is`);
              });
              break;
            case 'prepared': // prepare調用成功后上報該狀態機
              console.info('AVPlayer state prepared called.');
              this.avPlayer!.loop = this.loop
              this.avPlayer!.setVolume(this.volume)
              if (this.autoPlay) {
                this.avPlayer!.play(); // 調用播放接口開始播放
              }
              break;
            case 'playing': // play成功調用后觸發該狀態機上報
              console.info('AVPlayer state playing called.');
              break;
            case 'paused': // pause成功調用后觸發該狀態機上報
              console.info('AVPlayer state paused called.');
              break;
            case 'completed': // 播放結束后觸發該狀態機上報
              console.info('AVPlayer state completed called.');
              if (this.loop == true) {
                this.avPlayer!.seek(0)
                this.avPlayer!.play()
              }
              break;
            case 'stopped': // stop接口成功調用后觸發該狀態機上報
              console.info('AVPlayer state stopped called.');
              break;
            case 'released':
              console.info('AVPlayer state released called.');
              break;
            default:
              console.info('AVPlayer state unknown called.');
              break;
          }
        })
      }
      
      1. 控制音頻播放:可以調用play()pause()stop()seek()等方法對音頻進行播放、暫停、停止、跳轉等操作。示例代碼如下:
      
      play() {
        if (this.checkNull()) {
          this.autoPlay = true
          return
        }
      
        this.avPlayer!.play().then(() => {
          console.info('Play success')
        }).catch((err: BusinessError) => {
          console.info('Play failed : ' + JSON.stringify(err))
        })
      }
      
      pause() {
        if (this.checkNull()) {
          this.autoPlay = false
          return
        }
        this.avPlayer!.pause().then(() => {
          console.info('Pause success')
        }).catch((err: BusinessError) => {
          console.info('Pause failed : ' + JSON.stringify(err))
        })
      }
      
      release() {
        if (this.checkNull()) {
          this.autoPlay = false
          return
        }
        this.avPlayer!.release().then(() => {
          console.info('Release success')
          setTimeout(() => {
          }, 500)
        }).catch((err: BusinessError) => {
          console.info('Release failed : ' + JSON.stringify(err))
        })
      }
      
      setVolume(volume: number) {
        console.info(`setVolume ${volume}`)
        this.volume = volume
        if (this.checkNull()) {
          return
        }
        this.avPlayer!.setVolume(volume)
      }
      
      setLoop() {
        console.info('setLoop')
        this.loop = true
        if (this.checkNull()) {
          return
        }
        this.avPlayer!.loop = true
      }
      

      設置音量和循環播放時需要在狀態 prepared 后調用,否則會報錯

      Invoke avPlayer failed, code is 5400102, message is Operate Not Permit: current state is not prepared/playing/paused/completed, unsupport loop operation
      
      1. 釋放資源:當音頻播放完成或者不再需要播放時,調用release()方法釋放資源,避免內存泄漏。示例代碼如下:
      async function releasePlayer(avPlayer) {
          await avPlayer.release();
      }
      

      注意事項

      • 權限申請:如果要訪問在線媒體資源,需要在配置文件中申請ohos.permission.INTERNET權限。
      • 資源格式:確保音頻文件格式與鴻蒙系統支持的格式兼容,以避免無法播放的情況。
      • 異常處理:在播放過程中可能會遇到網絡中斷、文件損壞等異常情況,需要添加異常處理邏輯,如監聽error事件來進行相應處理。

      希望通過以上介紹,能幫助開發者在鴻蒙Next應用開發中熟練使用AVPlayer實現音頻播放功能,為用戶帶來更好的音頻體驗。

      本文由博客一文多發平臺 OpenWrite 發布!

      posted @ 2025-03-07 14:19  Brian512  閱讀(229)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲区一区二区三区精品| 欧美亚洲另类自拍偷在线拍| 久久99精品国产99久久6尤物| 国产精品一码二码三码| 中文字幕av无码一区二区三区| 日韩欧激情一区二区三区 | 亚洲精品人成网线在线| 日韩丝袜欧美人妻制服| 91亚洲国产成人久久蜜臀| 亚洲国产欧美在线人成| 国产精品爱久久久久久久电影| 国产无套护士在线观看| 国产久免费热视频在线观看| 女同性恋一区二区三区视频| 国产偷倩视频| 国产日韩入口一区二区| 国产一级毛片高清完整视频版| 亚洲www永久成人网站| 国产成人黄色自拍小视频| 亚洲欧美一区二区成人片| 亚洲乱妇老熟女爽到高潮的片| 国产一区二区三区av在线无码观看| 黑人大战欲求不满人妻| 成人无码午夜在线观看| 50岁熟妇的呻吟声对白| 一区二区三区国产亚洲自拍| 亚洲高清aⅴ日本欧美视频| 国产福利精品一区二区| 岛国中文字幕一区二区| 亚洲国产长腿丝袜av天堂| 国产av综合色高清自拍| 四虎影视国产精品永久在线| 少妇高潮喷水正在播放| 亚洲岛国成人免费av| 大伊香蕉精品一区二区| 国产精品欧美福利久久| 在线aⅴ亚洲中文字幕| 国产成人精品亚洲午夜麻豆| 国产成人啪精品视频免费APP| 广德县| 无码国内精品人妻少妇|