HarmonyOS鸿蒙Next中求使用avPlayer播放音频的功能比较完备的完整示例代码仓库

HarmonyOS鸿蒙Next中求使用avPlayer播放音频的功能比较完备的完整示例代码仓库 如题,最近想使用avPlayer开发音频播放器,目前能找到的示例代码都是功能比较简陋的,只有播放、暂停功能。希望能找个能控制音频速度、音频滑动控制、音频切换播放等等这种功能比较齐全的示例。

7 回复

有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

看下这个帖子:https://developer.huawei.com/consumer/cn/blog/topic/03188919387316015

完整代码:

import { media } from '@kit.MediaKit';
import { BusinessError, emitter } from '@kit.BasicServicesKit';
import { Logger } from '@k12unipus/xbase';

const TAG = '[AvPlayer]  '

@ObservedV2
export class AudioPlayManager {
  private count: number = 0;
  private isSeek: boolean = true; // 用于区分模式是否支持seek操作。
  private fileSize: number = -1;
  private fd: number = 0;
  private avPlayer: media.AVPlayer | null = null
  @Trace audioDuration: number = 0
  @Trace currAudioTime: number = 0
  @Trace isPlaying: boolean = false
  @Trace audioPlayState: media.AVPlayerState = 'idle';

  // 注册avplayer回调函数。
  setAVPlayerCallback(avPlayer: media.AVPlayer) {
    // seek操作结果回调函数。
    avPlayer.on('seekDone', (seekDoneTime: number) => {
      Logger.info(`${TAG} on seekDone, seek time is ${seekDoneTime}`);
    });
    // error回调监听函数,当avPlayer在操作过程中出现错误时调用 reset接口触发重置流程。
    avPlayer.on('error', (err: BusinessError) => {
      Logger.error(`${TAG} on error, code is ${err.code}, message is ${err.message}`);
      avPlayer.reset(); // 调用reset重置资源,触发idle状态。
    });
    avPlayer.on('timeUpdate', (time: number) => {
      Logger.info(`${TAG} on timeUpdate :  ${time}`);
      this.currAudioTime = time
    });
    avPlayer.on('durationUpdate', (time: number) => {
      Logger.info(TAG + `on durationUpdate: ${time}`)
      this.audioDuration = time;
    })
    // 状态机变化回调函数。
    avPlayer.on('stateChange', async (state: string, reason: media.StateChangeReason) => {
      switch (state) {
        case 'idle': // 成功调用reset接口后触发该状态机上报。
          Logger.info(`${TAG} 状态机 audioPlayState: ${avPlayer.state}`);
          this.setAudioPlayState(avPlayer.state)
          // avPlayer.release(); // 调用release接口销毁实例对象。
          break;
        case 'initialized': // avplayer 设置播放源后触发该状态上报。
          Logger.info(`${TAG} 状态机 audioPlayState: ${avPlayer.state}`);
          this.setAudioPlayState(avPlayer.state)
          // avPlayer.audioRendererInfo = {
          //   usage: audio.StreamUsage.STREAM_USAGE_MUSIC, // 音频流使用类型:音乐。根据业务场景配置,参考StreamUsage。
          //   rendererFlags: 0 // 音频渲染器标志。
          // };
          avPlayer.prepare();
          break;
        case 'prepared': // prepare调用成功后上报该状态机。
          Logger.info(`${TAG} 状态机 audioPlayState: ${avPlayer.state}`);
          this.setAudioPlayState(avPlayer.state)
          // this.audioDuration = avPlayer.duration
          break;
        case 'playing': // play成功调用后触发该状态机上报。
          Logger.info(`${TAG} 状态机 audioPlayState: ${avPlayer.state}`);
          this.setAudioPlayState(avPlayer.state)
          break;
        case 'paused': // pause成功调用后触发该状态机上报。
          Logger.info(`${TAG} 状态机 audioPlayState: ${avPlayer.state}`);
          this.setAudioPlayState(avPlayer.state)
          avPlayer.pause()
          break;
        case 'completed': // 播放结束后触发该状态机上报。
          Logger.info(`${TAG} 状态机 audioPlayState: ${avPlayer.state}`);
          this.setAudioPlayState(avPlayer.state)
          this.resetCurrAudioPlayStatusInfo();
          break;
        case 'stopped': // stop接口成功调用后触发该状态机上报。
          Logger.info(`${TAG} 状态机 audioPlayState: ${avPlayer.state}`);
          this.setAudioPlayState(avPlayer.state)
          break;
        case 'released':
          Logger.info(`${TAG} 状态机 audioPlayState: ${avPlayer.state}`);
          this.setAudioPlayState(avPlayer.state)
          break;
        default:
          Logger.info(`${TAG} 状态机 audioPlayState: ${avPlayer.state}`);
          break;
      }
    });
  }

  //设置当前音频播放状态
  setAudioPlayState(state: media.AVPlayerState) {
    this.audioPlayState = state;
    Logger.info(TAG + `setAudioPlayState audioPlayState: ${this.audioPlayState}`)
  }


  //音频播放
  async setAudioSrcToPrepared(audioSrc: string) {
    // 创建avPlayer实例对象。
    this.avPlayer = await media.createAVPlayer();
    //设置状态机
    this.setAVPlayerCallback(this.avPlayer!);
    //设置 音频url,状态自动跳至 initialized
    this.avPlayer!.url = audioSrc;
  }


  async startPlay() {
    this.isPlaying = true
    this.avPlayer?.play()
  }

  async stopPlay() {
    this.avPlayer?.prepare()
    this.isPlaying = false
  }

  async release() {
    this.avPlayer?.release()
    this.isPlaying = false
  }

  async reset() {
    this.isPlaying = false
    this.currAudioTime = 0
    this.avPlayer?.prepare();
    // this.avPlayer?.release()
    this.avPlayer = null;
  }

  //重置当前音频播放状态信息
  resetCurrAudioPlayStatusInfo() {
    this.isPlaying = false
    this.currAudioTime = 0
    this.setAudioPlayState('stopped');
  }


  async seek(value: number) {
    this.avPlayer?.seek(value)
  }
}

获取音视频总时长
//可以在状态机中监听 durationUpdate
avPlayer.on('durationUpdate', (time: number) => {
  Logger.info(TAG + `on durationUpdate: ${time}`)
  this.audioDuration = time;
})
获取当前音视频播放时长
//状态机中监听timeUpdate属性
avPlayer.on('timeUpdate', (time: number) => {
  Logger.info(`${TAG} on timeUpdate :  ${time}`);
  this.currAudioTime = time
});

这个只是列举了调用方法,

目前华为官方提供的HarmonyOS Next音频播放示例代码仓库如下:

GitHub地址:https://github.com/applibgroup/AvPlayer

该仓库包含完整的avPlayer音频播放功能实现,涵盖音频加载、播放控制、状态监听等核心功能。代码采用ArkTS语言编写,符合HarmonyOS Next开发规范,可直接参考使用。

在HarmonyOS Next中,avPlayer提供了丰富的音频控制能力。以下是一个功能较完备的音频播放器示例代码的核心实现,支持播放、暂停、速度调节、进度控制和音频切换功能:

import media from '@ohos.multimedia.media';
import common from '@ohos.app.ability.common';

// 初始化avPlayer
let avPlayer: media.AVPlayer | null = null;

// 初始化播放器实例
async function initAvPlayer(context: common.Context) {
  avPlayer = await media.createAVPlayer(context);
  
  // 监听播放状态和进度
  avPlayer.on('stateChange', (state: string) => {
    console.log(`Current state: ${state}`);
  });
  
  avPlayer.on('timeUpdate', (currentTime: number) => {
    // 更新UI进度条
    updateProgressBar(currentTime);
  });
}

// 设置播放资源
async function setSource(url: string) {
  if (!avPlayer) return;
  
  await avPlayer.reset();
  avPlayer.url = url;
  await avPlayer.prepare();
}

// 播放控制
function play() {
  avPlayer?.play();
}

function pause() {
  avPlayer?.pause();
}

function stop() {
  avPlayer?.stop();
}

// 速度调节 (0.5-2.0)
function setSpeed(speed: number) {
  avPlayer?.setSpeed(speed);
}

// 跳转到指定位置
function seekTo(position: number) {
  avPlayer?.seek(position, media.SeekMode.SEEK_NEXT_SYNC);
}

// 切换音频资源
function switchAudio(newUrl: string) {
  setSource(newUrl).then(() => {
    play();
  });
}

// 获取当前播放状态
function getCurrentState(): string {
  return avPlayer?.state || 'idle';
}

// 示例使用
// initAvPlayer(getContext(this));
// setSource('https://example.com/audio.mp3');

注意:实际使用时需要配合UI组件实现进度条拖动、速度选择等功能,并处理播放器生命周期和异常情况。完整项目建议参考官方媒体开发指南。

回到顶部