SoundPool实现音频播放功能

SoundPool实现音频播放功能

HarmonyOS
2024-05-20 21:14:20
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
LenZhong

使用SoundPool(音频池)提供的接口,可以实现低时延短音播放。

当应用开发时,经常需要使用一些急促简短的音效(如相机快门音效、系统通知音效等),此时建议调用SoundPool,实现一次加载,多次低时延播放。

SoundPool当前支持播放1MB以下的音频资源,大小超过1MB的长音频将截取1MB大小数据进行播放。

核心代码解释

调用createSoundPool方法创建SoundPool实例。

import media from '@ohos.multimedia.media'; 
import audio from '@ohos.multimedia.audio'; 
import { BusinessError } from '@ohos.base'; 
​ 
let soundPool: media.SoundPool; 
let audioRendererInfo: audio.AudioRendererInfo = { 
usage : audio.StreamUsage.STREAM_USAGE_MUSIC, 
rendererFlags : 0 
} 
​ 
media.createSoundPool(5, audioRendererInfo).then((soundpool_: media.SoundPool) => { 
if (soundpool_ != null) { 
  soundPool = soundpool_; 
  console.info('create SoundPool success'); 
} else { 
  console.error('create SoundPool fail'); 
} 
}).catch((error: BusinessError) => { 
console.error(`soundpool catchCallback, error message:${error.message}`); 
});

注册监听(资源加载完成,播放完成,错误类型监听)

soundPool.on('loadComplete', (soundId: number) => { 
console.info('loadComplete, soundId: ' + soundId); 
}); 
soundPool.on('playFinished', () => { 
console.info("receive play finished message"); 
}); 
soundPool.on('error', (error) => { 
console.info('error happened,message is :' + error.message); 
});

调用load方法进行音频资源加载。

可以传入uri或fd加载资源,此处使用传入uri的方式为例,更多方法请参考API文档。

const audioViewPicker = new picker.AudioViewPicker(); 
audioViewPicker.select(audioSelectOptions).then(async (audioSelectResult: Array<string>) => { 
  urii = audioSelectResult[0]; 
  console.info('audioViewPicker.select to file succeed and uri is:' + urii); 
  if(urii){ 
    await fs.open(urii, fs.OpenMode.READ_ONLY).then((file_: fs.File) => { 
      let file=file_; 
      console.info("file fd: " + file.fd); 
      uri = 'fd://' + (file.fd).toString() 
    }); // '/test_01.mp3' 作为样例,使用时需要传入文件对应路径。 
    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); 
    }) 
  } 
​ 
}).catch((err: BusinessError) => { 
  console.error(`Invoke audioViewPicker.select failed, code is ${err.code}, message is ${err.message}`); 
}) 

配置播放参数PlayParameters,并调用play方法播放音频。多次调用play播放同一个soundID,只会播放一次。

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, // 最低优先级 
} 
​ 
// 开始播放,这边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'); 
}

实现效果

使用SoundPool(音频池)提供的接口,可以实现低时延短音播放。

注明适配的版本信息

DevEco Studio Version: 4.1.1.400

SDK:HarmoneyOS 4.1.0.25

分享
微博
QQ
微信
回复
2024-05-21 17:07:55
相关问题
SoundPool播放音频是否支持WMV格式
663浏览 • 1回复 待解决
AVplayer开发音频播放功能
443浏览 • 1回复 待解决
使用AudioRenderer开发音频播放功能
424浏览 • 1回复 待解决
AVPlayer实现音频播放(c++侧)
344浏览 • 1回复 待解决
鸿蒙-如何实现播放一段音频
9619浏览 • 2回复 待解决
AudioCapturer录音+AudioRenderer播放音频
596浏览 • 1回复 待解决
鸿蒙 如何使用 player 播放网络音频
5869浏览 • 1回复 已解决
音频播放长时任务不生效
445浏览 • 1回复 待解决
OH _Audio播放音频问题
491浏览 • 1回复 待解决
怎么使用player播放网络音频呢?
2126浏览 • 1回复 待解决
使用AudioRenderer播放pcm音频流失败
496浏览 • 1回复 待解决
使用AudioCapturer开发音频录制功能
539浏览 • 1回复 待解决
鸿蒙Dev远程真机能否播放音频
3931浏览 • 1回复 待解决
AVPlayer实现视频播放
246浏览 • 1回复 待解决
如何实现RTSP视频流播放
204浏览 • 1回复 待解决