HarmonyOS 鸿蒙Next中如何实现AVSession Kit(音视频播控服务)音乐后台任务效果?

HarmonyOS 鸿蒙Next中如何实现AVSession Kit(音视频播控服务)音乐后台任务效果? 如何实现AVSession Kit(音视频播控服务)音乐后台任务效果?

4 回复

效果

效果

实现思路

  1. 通过 avplayer 实现音乐播放 (缺点 1-没有后台任务、缺点 2-没有播控服务 也就是息屏后还可以控制)
  2. 通过 avSession 实现播控服务

完整代码

import {media} from '@kit.MediaKit'
import { avSession } from '@kit.AVSessionKit'

@Entry
@Component
struct Index {

  private player: media.AVPlayer = Object()


  async aboutToAppear() {


    // ✅ 1. 创建音乐播放器对象
    // const player:media.AVPlayer  = await media.createAVPlayer()  切记player放外面 后期要操作
    this.player = await media.createAVPlayer()

    // ✅ 2. 侦听播放状态
    this.player.on('stateChange', (state) => {
      switch(state) {
        // 初始化状态
        case 'initialized':
          console.log('11111 initialized')
          this.player.prepare() // 准备就绪态
          break;
        // 准备就绪态
        case 'prepared':
          console.log('2222 prepared')
          this.player.play() // 播放
          break;
      }
    })
    // ✅ 3. 设置播放地址
    this.player.url = 'http://tmp00002.zhaodashen.cn/mp3/chenyixun_003u2qmP0Mp2pW.m4a'


    // ===========================================================================
    // ===========================================================================
    // ===========================================================================
    // ===========================================================================


    // 💕 1. 创建【播放控制服务】示例
    const session = await avSession.createAVSession(getContext(), 'uuid', 'audio') as avSession.AVSession

    // 💕 2. 监控【播放控制服务】用户交互:2.1-改当前播放控制服务台信息、2.2-改AVPlayer控制音乐
    session.on('play', () => {
      session.setAVPlaybackState({ state: avSession.PlaybackState.PLAYBACK_STATE_PLAY })
      this.player.play()
    })
    session.on('pause', () => {
      session.setAVPlaybackState({ state: avSession.PlaybackState.PLAYBACK_STATE_PAUSE })
      this.player.pause()
    })
    session.on('seek', (time) => {
      // 1. 更改音视频播控服务状态(特殊不用激活)
      // 2. 更改AVPlay状态
      this.player.seek(time)
    })
    // session.on('playNext', () => { })       // 下一首
    // session.on('playPrevious', () => {})    // 上一首
    // session.on('toggleFavorite', (assetId) => { session.setAVPlaybackState({ isFavorite: 收藏状态布尔 })   });   // 监听收藏


    // 💕3. 配置【播放控制服务】默认信息
    session.setAVPlaybackState({     // 3.2 跟用户交互相关的
      state: true ? avSession.PlaybackState.PLAYBACK_STATE_PLAY : avSession.PlaybackState.PLAYBACK_STATE_PAUSE,
      // position: { elapsedTime: 178552, updateTime: (new Date()).getTime() },  // elapsedTime对应的是播放进度
    })
    session.setAVMetadata({  // 3.1 配置的默认信息
      assetId: "歌曲ID必须写",
      title: '世界上最牛逼之歌没有第二',
      artist: '世界上最牛逼的人',
      avQueueImage:'https://bkimg.cdn.bcebos.com/pic/8694a4c27d1ed21b0ef4d12e5d26cac451da80cb91ed',
      mediaImage:'https://bkimg.cdn.bcebos.com/pic/8694a4c27d1ed21b0ef4d12e5d26cac451da80cb91ed',
      duration:  1000*60*4,
      //lyric:song.lrc
    })

    // 💕4. 激活控制台,允许控制台有交互(激活会话,激活后可正常使用会话)
    session.activate()
  }

  build() {
    Column() {
      Button('音乐').onClick(() => {

      }).margin({bottom:20})
    }.padding(50)
  }
}

更多关于HarmonyOS 鸿蒙Next中如何实现AVSession Kit(音视频播控服务)音乐后台任务效果?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


效果

效果

实现思路

  1. 通过 avplayer 实现音乐播放 (缺点 1-没有后台任务、缺点 2-没有播控服务 也就是息屏后还可以控制)
  2. 通过 avSession 实现播控服务

完整代码

记得配置网络权限测试

import {media} from '@kit.MediaKit'
import { avSession } from '@kit.AVSessionKit'

@Entry
@Component
struct Index {

  private player: media.AVPlayer = Object()


  async aboutToAppear() {


    // ✅ 1. 创建音乐播放器对象
    // const player:media.AVPlayer  = await media.createAVPlayer()  切记player放外面 后期要操作
    this.player = await media.createAVPlayer()

    // ✅ 2. 侦听播放状态
    this.player.on('stateChange', (state) => {
      switch(state) {
        // 初始化状态
        case 'initialized':
          console.log('11111 initialized')
          this.player.prepare() // 准备就绪态
          break;
        // 准备就绪态
        case 'prepared':
          console.log('2222 prepared')
          this.player.play() // 播放
          break;
      }
    })
    // ✅ 3. 设置播放地址
    this.player.url = 'http://tmp00002.zhaodashen.cn/mp3/chenyixun_003u2qmP0Mp2pW.m4a'


    // ===========================================================================
    // ===========================================================================
    // ===========================================================================
    // ===========================================================================


    // 💕 1. 创建【播放控制服务】示例
    const session = await avSession.createAVSession(getContext(), 'uuid', 'audio') as avSession.AVSession

    // 💕 2. 监控【播放控制服务】用户交互:2.1-改当前播放控制服务台信息、2.2-改AVPlayer控制音乐
    session.on('play', () => {
      session.setAVPlaybackState({ state: avSession.PlaybackState.PLAYBACK_STATE_PLAY })
      this.player.play()
    })
    session.on('pause', () => {
      session.setAVPlaybackState({ state: avSession.PlaybackState.PLAYBACK_STATE_PAUSE })
      this.player.pause()
    })
    session.on('seek', (time) => {
      // 1. 更改音视频播控服务状态(特殊不用激活)
      // 2. 更改AVPlay状态
      this.player.seek(time)
    })
    // session.on('playNext', () => { })       // 下一首
    // session.on('playPrevious', () => {})    // 上一首
    // session.on('toggleFavorite', (assetId) => { session.setAVPlaybackState({ isFavorite: 收藏状态布尔 })   });   // 监听收藏


    // 💕3. 配置【播放控制服务】默认信息
    session.setAVPlaybackState({     // 3.2 跟用户交互相关的
      state: true ? avSession.PlaybackState.PLAYBACK_STATE_PLAY : avSession.PlaybackState.PLAYBACK_STATE_PAUSE,
      // position: { elapsedTime: 178552, updateTime: (new Date()).getTime() },  // elapsedTime对应的是播放进度
    })
    session.setAVMetadata({  // 3.1 配置的默认信息
      assetId: "歌曲ID必须写",
      title: '世界上最牛逼之歌没有第二',
      artist: '世界上最牛逼的人',
      avQueueImage:'https://bkimg.cdn.bcebos.com/pic/8694a4c27d1ed21b0ef4d12e5d26cac451da80cb91ed',
      mediaImage:'https://bkimg.cdn.bcebos.com/pic/8694a4c27d1ed21b0ef4d12e5d26cac451da80cb91ed',
      duration:  1000*60*4,
      //lyric:song.lrc
    })

    // 💕4. 激活控制台,允许控制台有交互(激活会话,激活后可正常使用会话)
    session.activate()
  }

  build() {
    Column() {
      Button('音乐').onClick(() => {

      }).margin({bottom:20})
    }.padding(50)
  }
}

在鸿蒙Next中实现AVSession Kit音乐后台任务效果,需使用AVSession框架。首先创建AVSession实例并设置媒体信息。通过AVSessionController控制播放状态。在ServiceAbility中实现后台播放逻辑,使用AVPlayer进行音频解码与渲染。配置后台任务权限,确保应用在后台可继续运行。AVSession会与系统播控中心同步状态,实现跨应用控制。

在HarmonyOS Next中,使用AVSession Kit实现音乐后台播放效果,核心是创建并管理一个AVSession会话,使其在应用退到后台后仍能保持活动状态,并与系统播控中心交互。以下是关键实现步骤:

  1. 创建AVSession:在Ability或Service中,使用avSession.createAVSession()创建会话,指定类型为media,并设置播控能力(如播放、暂停、切歌等)。
  2. 发布会话:通过session.activate()激活并发布会话,系统播控中心将自动识别并显示控件。
  3. 后台保活:在应用退到后台前,确保持有后台任务权限(需在配置文件中声明ohos.permission.KEEP_BACKGROUND_RUNNING),并通过avSession持续更新播放状态(如播放进度、元数据),会话将保持活跃。
  4. 响应控制命令:监听AVSession的'controlCommand'事件,处理来自系统控件或硬件的播放、暂停等指令,并同步更新应用内状态。
  5. 释放资源:在播放结束或应用退出时,调用session.deactivate()session.destroy()释放会话。

注意事项:

  • 后台播放需在module.json5中配置backgroundModesaudioPlayback
  • 使用AVSession的setAVMetadata()setAVPlaybackState()同步播放信息,确保系统控件显示正确。
  • 避免后台长时间占用资源,需遵循系统后台任务管理策略。

通过以上步骤,即可实现音乐在后台持续播放,并与系统播控无缝协作。

回到顶部