参考demo:import audio from '@ohos.multimedia.audio'; import media from '@ohos.multimedia.media'; import fs from '@ohos.file.fs' import picker from '@ohos.file.picker'; import { BusinessError } from '@ohos.base'; import { common } from '@kit.AbilityKit'; let urii: string = ''; let soundPool: media.SoundPool; let streamId: number = 0; const audioSelectOptions = new picker.AudioSelectOptions(); let soundId: number = 0; let audioRendererInfo: audio.AudioRendererInfo = { usage: audio.StreamUsage.STREAM_USAGE_MUSIC, rendererFlags: 1 } let PlayParameters: media.PlayParameters = { loop: 3, // 循环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, // 最低优先级 } let uri: string = ""; @Entry @Component struct NormalCapturer { @State message: string = '播放音频'; async aboutToAppear(): Promise<void> { create(); } async aboutToDisappear() { release(); } build() { Row() { Column() { Text(this.message) .fontSize(50) .fontWeight(FontWeight.Bold) Button('播放音频').onClick((event: ClickEvent) => { PlaySoundPool(); }) } .width('100%') } .height('100%') } } 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.info('error happened,message is :' + error.message); }) } async function PlaySoundPool() { console.log("开始播放"); // 开始播放,这边play也可带播放播放的参数PlayParameters streamId = await soundPool.play(soundId,PlayParameters); } async function release() { // 终止指定流的播放 soundPool.stop(streamId); // 卸载音频资源 await soundPool.unload(soundId); //关闭监听 setOffCallback(); // 释放SoundPool await soundPool.release(); } //关闭监听 function setOffCallback() { soundPool.off('loadComplete'); soundPool.off('playFinished'); soundPool.off('error'); } async function create() { //创建soundPool实例 soundPool = await media.createSoundPool(5, audioRendererInfo); console.log("音频类型为:" + audioRendererInfo.usage.valueOf()) //注册监听 loadCallback(); finishPlayCallback(); setErrorCallback(); // 加载音频资源 let context: common.UIAbilityContext = getContext() as common.UIAbilityContext; let data = context.resourceManager.getRawFdSync('camera_shutter.mp3'); let sanboxPath = context.filesDir console.log("沙箱路径:" + sanboxPath) let filePath = context.tempDir + "/camera_shutter.mp3" console.log("压缩文件路径:" + filePath) let dest = fs.openSync(filePath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE) let bufsize = 4096 let buf = new ArrayBuffer(bufsize) let off = 0, len = 0, readedLen = 0 /** * 通过buffer将rawfile文件内容copy到沙箱路径 */ while (len = fs.readSync(data.fd, buf, { offset: data.offset + off, length: bufsize })) { readedLen += len fs.writeSync(dest.fd, buf, { offset: off, length: len }) off = off + len if ((data.length - readedLen) < bufsize) { bufsize = data.length - readedLen } } fs.close(dest.fd) context.resourceManager.closeRawFd("audio4Test.mp4", (err, data) => { console.log("closeRawFd start") if (err != null) { console.log(err.message) } else { console.log("close success") } }) await fs.open(filePath, fs.OpenMode.READ_ONLY).then((file_: fs.File) => { let file = file_; console.info("file fd: " + file.fd); uri = 'fd://' + (file.fd).toString() }); soundPool.load(uri).then((soundIdd: number) => { console.info('soundPool load uri success'); soundId = soundIdd; }).catch((err: BusinessError) => { console.error('soundPool load failed and catch error is ' + err.message); }) }
参考demo: