鸿蒙开发5.0【AVPlayer音频后台播放】

场景描述

音乐播放是媒体最重要的组成之一,以下是AVPlayer将Audio媒体资源(比如mp3等)转码为可听见的音频模拟信号,并通过输出设备进行播放。

场景一:使用avPlayer进行后台播放音乐

想要实现应用后台播放,那么接入AVSession是必须的,否则业务的正常功能会同时受到限制,也必须有[BackgroundTasks Kit](后台任务管理)的能力,申请对应的长时任务,避免进入挂起(Suspend)状态。

应用不申请后台任务会被冻结,不注册AVSession会被暂停。

步骤一:创建avPlayer实现音频播放

创建avPlayer并加载音频资源

async avPlayerFdSrcDemo() {
  // 创建avPlayer实例对象
  avPlayer = await media.createAVPlayer();
  // 创建状态机变化回调函数
  this.setAVPlayerCallback(avPlayer);
  // 通过UIAbilityContext的resourceManager成员的getRawFd接口获取媒体资源播放地址
  let context = getContext(this) as common.UIAbilityContext;
  let fileDescriptor = await context.resourceManager.getRawFd('123.mp3');
  // 返回类型为{fd,offset,length},fd为HAP包fd地址,offset为媒体资源偏移量,length为播放长度
  let avFileDescriptor: media.AVFileDescriptor =
    { fd: fileDescriptor.fd, offset: fileDescriptor.offset, length: fileDescriptor.length };
  this.isSeek = true; // 支持seek操作
  // 为fdSrc赋值触发initialized状态机上报
  avPlayer.fdSrc = avFileDescriptor;
}

注册avPlayer回调函数

// 注册avplayer回调函数
setAVPlayerCallback(avPlayer: media.AVPlayer) {
  // 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, reason: 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.audioInterruptMode=audio.InterruptMode.SHARE_MODE;
        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;
      case 'stopped': // stop接口成功调用后触发该状态机上报
        console.info('AVPlayer stat
### 鸿蒙 OS AVPlayer 视频播放开发教程 在鸿蒙操作系统中实现视频播放功能主要依赖于`media.AVPlayer`类。通过初始化该对象可以完成基本的媒体文件加载与回放操作[^1]。 对于更复杂的场景,比如需要监听播放状态变化以便及时更新界面信息,则可以通过定义带有`@State`修饰符的状态变量来绑定视图层的数据源,并利用装饰器机制监控特定属性的变化从而触发相应的业务逻辑处理流程。 下面给出一段基于上述原理构建简易视频播放组件的例子: ```typescript import media from '@ohos.multimedia.media'; @Component export default class SimpleVideoPlayer { @State playerInstance: media.AVPlayer; constructor(){ this.playerInstance = new media.AVPlayer(); } async setupPlayback(url:string){ try{ await this.playerInstance.setSource({uri:url}); console.log("Set source successfully."); // Prepare the player to start playback. await this.playerInstance.prepare(); console.log("Prepare completed."); // Start playing after preparation is done. this.playerInstance.play(); console.log("Playing..."); } catch(error){ console.error(`Error occurred during setting up playback:${error.message}`); } } stopPlayback(){ if(this.playerInstance.isPlaying()){ this.playerInstance.stop(); console.log("Stopped."); } } releaseResources(){ this.playerInstance.release(); console.log("Released all resources."); } } ``` 此段代码展示了如何创建一个简单的视频播放控制器,在其中包含了设置音视频资源路径、准备播放环境以及实际执行播放命令的方法;同时也提供了停止当前正在运行的内容及释放占用资源的功能接口。 另外值得注意的是,在某些情况下可能还需要自定义控件样式或者调整默认行为(如自动播放与否),这时就可以参照其他框架下的做法来进行相应修改[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值