HarmonyOS 使用AVPlayer播放在线mp3时怎么设置资源

在使用AVplayer播放在线MP3音频时需要设置dataSrc属性,这边只有一个mp3的播放地址,请问如何生成AVDataSrcDescriptor并设置到dataSrc上进行播放。

HarmonyOS
2025-01-10 08:55:15
433浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
superinsect

参考以下demo实现,mp3文件放在rawfile目录:

import media from '@ohos.multimedia.media';
import { BusinessError } from '@ohos.base';
import common from '@ohos.app.ability.common';
// 音频播放
export class AVPlayerDemo {
  public curAudioPath: string = '';
  public avFileDescriptor4: media.AVFileDescriptor| undefined = undefined ;
  // 注册avplayer回调函数
  setAVPlayerCallback(avPlayer: media.AVPlayer): void {
    // seek操作结果回调函数
    avPlayer.on('seekDone', (seekDoneTime: number) => {
      console.info(`AVPlayer seek succeeded, seek time is ${seekDoneTime}`);
    })
    // error回调监听函数,当avPlayer在操作过程中出现错误时调用 reset接口触发重置流程
    avPlayer.on('error', (err: BusinessError) => {
      console.error(`Invoke avPlayer failed, code is ${err.code}, message is ${err.message}`);
      avPlayer.reset(); // 调用reset重置资源,触发idle状态
    })
    // 状态机变化回调函数
    avPlayer.on('stateChange', async (state: string, _: media.StateChangeReason) => {
      switch (state) {
        case 'idle': // 成功调用reset接口后触发该状态机上报
          console.info('AVPlayer state idle called.');
          avPlayer.release(); // 调用release接口销毁实例对象
          break;
        case 'initialized': // avplayer 设置播放源后触发该状态上报
          console.info('AVPlayer state initialized called.');
          avPlayer.prepare();
          break;
        case 'prepared': // prepare调用成功后上报该状态机
          console.info('AVPlayer state prepared called.');
          avPlayer.play(); // 调用播放接口开始播放
          break;
        case 'playing': // play成功调用后触发该状态机上报
          console.info('AVPlayer state playing called.');
          break;
        case 'paused': // pause成功调用后触发该状态机上报
          console.info('AVPlayer state paused called.');
          avPlayer.play(); // 再次播放接口开始播放
          break;
        case 'completed': // 播放结束后触发该状态机上报
          console.info('AVPlayer state completed called.');
          avPlayer.stop(); //调用播放结束接口
          break;
      // audio3.ets 第二部分
        case 'stopped': // stop接口成功调用后触发该状态机上报
          console.info('AVPlayer state stopped called.');
          avPlayer.reset(); // 调用reset接口初始化avplayer状态
          break;
        case 'released':
          console.info('AVPlayer state released called.');
          break;
        default:
          console.info('AVPlayer state unknown called.');
          break;
      }
    })
  }
  async play(audioPath:string): Promise<void> {
    // 创建avPlayer实例对象
    try {
      const avPlayer: media.AVPlayer = await media.createAVPlayer();
      avPlayer.audioRendererInfo
      // 创建状态机变化回调函数
      await this.setAVPlayerCallback(avPlayer);
      // 通过UIAbilityContext获取沙箱地址filesDir,以Stage模型为例
      const context = getContext(this) as common.UIAbilityContext;
      if(this.curAudioPath != audioPath) {
        let fileDescriptor = await context.resourceManager.getRawFd(audioPath);
        this.avFileDescriptor4 =
          { fd: fileDescriptor.fd, offset: fileDescriptor.offset, length: fileDescriptor.length };
        this.curAudioPath = audioPath;

      }
      // 为fdSrc赋值触发initialized状态机上报
      avPlayer.fdSrc = this.avFileDescriptor4;
    } catch (e) {
      console.error(e)
    }
  }
}

@Entry
@Component
export struct Audio3 {
  AVplaer = new AVPlayerDemo();
  build() {
    Column() {
      Button('播放音频-多个avPlayer')
        .onClick(() => {
          this.AVplaer.play('muyu0.mp3');
        }).width(200)
    }
    .width('100%')
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
分享
微博
QQ
微信
回复
2025-01-10 10:12:17


相关问题
HarmonyOS mp3播放与暂停
511浏览 • 1回复 待解决
HarmonyOS 是否支持MP3音频录制?
746浏览 • 1回复 待解决
HarmonyOS web播放在线音频demo
531浏览 • 1回复 待解决
audioPlayer.src怎设置media里面的mp3文件
2996浏览 • 1回复 待解决
HarmonyOS如何从麦克风录制mp3文件
1559浏览 • 1回复 待解决
video player播放在线视频失败
10762浏览 • 1回复 待解决
HarmonyOS AVPlayer播放器UI设置
605浏览 • 1回复 待解决