HarmonyOS鸿蒙Next中求使用avPlayer播放音频的功能比较完备的完整示例代码仓库
HarmonyOS鸿蒙Next中求使用avPlayer播放音频的功能比较完备的完整示例代码仓库 如题,最近想使用avPlayer开发音频播放器,目前能找到的示例代码都是功能比较简陋的,只有播放、暂停功能。希望能找个能控制音频速度、音频滑动控制、音频切换播放等等这种功能比较齐全的示例。
楼主可以参考一下这个代码仓库:
AudioInteraction: 本场景解决方案主要面向前台音频开发人员。指导开发者基于AudioRenderer开发音频播控功能。功能包括后台播放、和播控中心的交互、适配不同类型的焦点打断策略、切换路由发声设备、切换输出设备等基础音频常见功能。
更多关于HarmonyOS鸿蒙Next中求使用avPlayer播放音频的功能比较完备的完整示例代码仓库的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
官方有一个影音娱乐类HarmonyOS应用的架构设计实践,
有要学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组件实现进度条拖动、速度选择等功能,并处理播放器生命周期和异常情况。完整项目建议参考官方媒体开发指南。