#我的鸿蒙开发手记#自学 音频播放 (AVPlayer) 实现与封装 原创

灵芸小骏
发布于 2025-5-6 00:01
浏览
0收藏

前言

在移动应用开发中,音频播放功能是许多应用的核心需求之一。HarmonyOS Next 提供了多种音频播放解决方案,开发者可以根据不同场景选择最适合的API。本文将详细介绍HarmonyOS Next中的音频播放方案,并重点分析AVPlayer的实现方式。

背景

HarmonyOS Next为开发者提供了多层次的音频播放API:

Video组件:最简单的媒体播放方式,适合快速实现基础播放功能

AVPlayer:功能全面的媒体播放服务,支持音频和视频

AudioRenderer:低延迟音频播放接口,适合对延迟敏感的场景

OpenSL ES:标准化的高性能音频API

本文将重点介绍AVPlayer的实现方案,因为它提供了最全面的功能集,同时保持了良好的易用性。

AVPlayer实现完整音频播放器

下面我们通过一个完整的音乐播放器实现来展示AVPlayer的使用方法。这个播放器包含以下功能:

  • 播放/暂停控制
  • 进度条拖动
  • 上一曲/下一曲切换
  • 播放模式切换(顺序、随机、单曲循环)
  • 播放列表管理

播放器的封装

首先我们创建一个工具类AvPlayerUtils来封装AVPlayer的核心功能

关键功能实现解析

1. 播放器初始化

播放器初始化是音频播放的第一步,需要创建AVPlayer实例并设置必要的回调:

static async initPlayer() {
  if (!this.player) {
    this.player = await media.createAVPlayer();
    this.setPlayerCallbacks();
  }
}

private static setPlayerCallbacks() {
  if (!this.player) return;
  
  // 播放完成回调
  this.player.on('ended', () => {
    this.handlePlayEnd();
  });
  
  // 时间更新回调
  this.player.on('timeUpdate', (time: number) => {
    this.playState.time = time;
    this.updateState();
  });
  
  // 错误回调
  this.player.on('error', (err: BusinessError) => {
    console.error(`AVPlayer error: ${err.code}, ${err.message}`);
  });
}
2. 单曲播放实现

单曲播放需要重置播放器状态,设置新的音频URL,并开始播放:

static singlePlay(song: SongItemType) {
  if (!this.player) return;
  
  const index = songs.findIndex(item => item.id === song.id);
  this.playState = {
    ...this.playState,
    currentSong: song,
    playIndex: index,
    isPlay: true,
    name: song.name,
    author: song.author,
    img: song.img
  };
  
  this.player.reset();
  this.player.url = song.url;
  this.player.prepare();
  this.player.play();
  this.updateState();
}
3. 播放控制

播放控制包括暂停、恢复、上一曲和下一曲等功能:

// 暂停播放
static pause() {
  if (!this.player || !this.playState.isPlay) return;
  
  this.player.pause();
  this.playState.isPlay = false;
  this.updateState();
}

// 恢复播放
static resume() {
  if (!this.player || this.playState.isPlay) return;
  
  this.player.play();
  this.playState.isPlay = true;
  this.updateState();
}

// 上一曲
static pre() {
  let newIndex = this.playState.playIndex - 1;
  if (newIndex < 0) {
    newIndex = songs.length - 1;
  }
  this.singlePlay(songs[newIndex]);
}

// 下一曲
static next() {
  let newIndex = this.playState.playIndex + 1;
  if (newIndex >= songs.length) {
    newIndex = 0;
  }
  this.singlePlay(songs[newIndex]);
}
4. 播放模式切换

播放模式决定了歌曲播放完成后的行为:

static changeMode(mode: 'auto' | 'repeat' | 'random') {
  this.playState.playMode = mode;
  this.updateState();
}

private static handlePlayEnd() {
  switch (this.playState.playMode) {
    case 'auto':  // 顺序播放
      this.next();
      break;
    case 'repeat':  // 单曲循环
      this.singlePlay(this.playState.currentSong);
      break;
    case 'random':  // 随机播放
      const randomIndex = Math.floor(Math.random() * songs.length);
      this.singlePlay(songs[randomIndex]);
      break;
  }
}

播放器的使用

1、初始化调用

#我的鸿蒙开发手记#自学 音频播放 (AVPlayer) 实现与封装 -鸿蒙开发者社区

2、权限设置

#我的鸿蒙开发手记#自学 音频播放 (AVPlayer) 实现与封装 -鸿蒙开发者社区

3、播放显示

#我的鸿蒙开发手记#自学 音频播放 (AVPlayer) 实现与封装 -鸿蒙开发者社区

总结

本文详细介绍了HarmonyOS Next中基于AVPlayer的音频播放解决方案。通过封装AVPlayerUtils工具类,我们实现了完整的音乐播放功能,包括:
播放器初始化和状态管理
单曲播放和播放列表支持
播放控制(播放/暂停/上一曲/下一曲)
播放模式切换(顺序/随机/单曲循环)
进度条控制和状态更新
这种实现方式既保持了代码的模块化和可维护性,又充分利用了HarmonyOS Next提供的媒体能力。开发者可以根据实际需求,在此基础上进一步扩展功能,如歌词显示、音效设置等。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
收藏
回复
举报
回复
    相关推荐