使用SoundPool开发音频播放功能可参考如下文档的demo:
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/using-soundpool-for-playback-0000001774120626
加载rawfile目录资源,需要通过
load(fd: number, offset: number, length: number, callback: AsyncCallback): void 或者
load(fd: number, offset: number, length: number): Promise实现:
可参考Api文档进行上述方法搜索查看demo:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-inner-multimedia-soundpool-0000001774281610
看一下上面文档里面的demo,load(uri: string, callback: AsyncCallback): void,加载音频资源。使用callback方式异步获取资源ID,入参uri通过获取文件fd生成以"fd://"开头的文件描述字符串。
该方法不支持加载rawfile目录资源,需要通过load(fd: number, offset: number, length: number, callback: AsyncCallback): void或者load(fd: number, offset: number, length: number): Promise实现。
也可参考以下demo:
import audio from '@ohos.multimedia.audio';
import media from '@ohos.multimedia.media';
import { BusinessError } from '@ohos.base';
import common from '@ohos.app.ability.common';
let soundPool: media.SoundPool;
let streamIda: number = 0;
let soundIda: number = 0;
let audioRendererInfo: audio.AudioRendererInfo = {
usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
rendererFlags: 1
}
let PlayParameters: media.PlayParameters = {
loop: 0, // 循环4次
rate: audio.AudioRendererRate.RENDER_RATE_NORMAL, // 正常倍速
leftVolume: 0.9, // range = 0.0-1.0
rightVolume: 0.9, // range = 0.0-1.0
priority: 3, // 最低优先级
}
@Entry
@Component
struct SoundPoolDemo {
@State message: string = '播放音频';
async aboutToAppear(): Promise<void> {
create();
}
async aboutToDisappear() {
release();
}
build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
Button('play').onClick((event: ClickEvent) => {
PlaySoundPool1();
})
}
.width('100%')
}
.height('100%')
}
}
async function create() {
//创建soundPool实例
soundPool = await media.createSoundPool(10, audioRendererInfo);
//注册监听
loadCallback();
finishPlayCallback();
setErrorCallback();
CreatAudio('audio1.mp3')
}
async function CreatAudio(path:string) {
// 加载音频资源
let context = getContext(SoundPoolDemo) as common.UIAbilityContext;
let fileDescriptor = await context.resourceManager.getRawFd(path);
soundPool.load(fileDescriptor.fd,fileDescriptor.offset,fileDescriptor.length).then((soundId1: number) => {
console.info('soundPool load uri success 1');
soundIda=soundId1;
console.log(`${soundId1}`)
}).catch((err: BusinessError) => {
console.error('soundPool load failed and catch error is ' + err.message);
})
}
async function loadCallback() {
// 加载完成回调
soundPool.on('loadComplete', (soundId_: number) => {
console.info('loadComplete, soundId: ' + soundId_);
})
}
//设置播放完成监听
async function finishPlayCallback() {
// 播放完成回调
soundPool.on('playFinished', () => {
console.info("recive play finished message");
// 可进行下次播放
})
}
//设置错误类型监听
function setErrorCallback() {
soundPool.on('error', (error) => {
console.error('error happened,message is :' + error.code);
console.error('error happened,message is :' + error.message);
})
}
async function PlaySoundPool1() {
console.log("play");
// 开始播放,这边play也可带播放播放的参数PlayParameters
streamIda = await soundPool.play(soundIda,PlayParameters);
}
async function unload(){
//终止指定流的播放
soundPool.stop(streamIda);
// 卸载音频资源
await soundPool.unload(soundIda);
}
async function release() {
if (streamIda!=0) {
//终止指定流的播放
soundPool.stop(streamIda);
// 卸载音频资源
await soundPool.unload(soundIda);
}
//关闭监听
setOffCallback();
// 释放SoundPool
await soundPool.release();
}
//关闭监听
function setOffCallback() {
soundPool.off('loadComplete');
soundPool.off('playFinished');
soundPool.off('error');
}