ToB企服应用市场:ToB评测及商务社交产业平台

标题: 鸿蒙HarmonyOS实战开发:媒体开发>基于SoundPool播放短音频 [打印本页]

作者: 兜兜零元    时间: 2025-2-15 12:38
标题: 鸿蒙HarmonyOS实战开发:媒体开发>基于SoundPool播放短音频
  鸿蒙NEXT开发实战往期必看文章:
一分钟了解”纯血版!鸿蒙HarmonyOS Next应用开发!
“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到醒目)
HarmonyOS NEXT应用开发案例实践总结合(持续更新......)
HarmonyOS NEXT应用开发性能优化实践总结(持续更新......)

使用SoundPool(音频池)提供的接口,可以实现低时延短音播放。
当应用开发时,常常需要使用一些急促简短的音效(如相机快门音效、系统通知音效等),此时发起调用SoundPool,实现一次加载,多次低时延播放。
SoundPool当前支持播放1MB以下的音频资源,大小超过1MB的长音频将截取1MB大小数据举行播放。
本开发引导将以SoundPool举行一次低时延播放音频的过程为例,向开发者讲授如何使用SoundPool。详细的API声明请参考SoundPool API参考。
过程包括:创建SoundPool实例,加载音频资源(包括资源的解封装与解码:解码格式参考音频解码支持),设置播放参数(循环模式/播放优先级等),播放控制(播放/停止),释放资源。
在应用开发过程中,开发者应通过监听方法查抄当前播放状态并按照一定顺序调用接口,执行对应操作,否则系统大概会抛出非常或天生其他未定义的行为。详细顺序可参考下列开发步调及对应阐明。
阐明
使用SoundPool播放短音频时,涉及音频核心管控计谋的题目,请参考音频核心指南。
开发步调及注意事项

完整示例

下面展示了使用SoundPool举行低时延播放的完整示例代码。
  1. import { audio } from '@kit.AudioKit';
  2. import { media } from '@kit.MediaKit';
  3. import { fileIo as fs } from '@kit.CoreFileKit';
  4. import { BusinessError } from '@kit.BasicServicesKit';
  5. let soundPool: media.SoundPool;
  6. let streamId: number = 0;
  7. let soundId: number = 0;
  8. // audioRenderInfo中的参数usage取值为STREAM_USAGE_UNKNOWN,STREAM_USAGE_MUSIC,STREAM_USAGE_MOVIE,
  9. // STREAM_USAGE_AUDIOBOOK时,SoundPool播放短音时为混音模式,不会打断其他音频播放。
  10. let audioRendererInfo: audio.AudioRendererInfo = {
  11.   usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  12.   rendererFlags: 1
  13. }
  14. let playParameters: media.PlayParameters = {
  15.   loop: 3, // 循环4次
  16.   rate: audio.AudioRendererRate.RENDER_RATE_NORMAL, // 正常倍速
  17.   leftVolume: 0.5, // range = 0.0-1.0
  18.   rightVolume: 0.5, // range = 0.0-1.0
  19.   priority: 0, // 最低优先级
  20. }
  21. let uri: string = "";
  22. async function create() {
  23.   //创建soundPool实例
  24.   soundPool = await media.createSoundPool(5, audioRendererInfo);
  25.   //注册监听
  26.   loadCallback();
  27.   finishPlayCallback();
  28.   setErrorCallback();
  29.   // 加载音频资源
  30.   await fs.open('/test_01.mp3', fs.OpenMode.READ_ONLY).then((file: fs.File) => {
  31.     console.info("file fd: " + file.fd);
  32.     uri = 'fd://' + (file.fd).toString()
  33.   }); // '/test_01.mp3' 作为样例,使用时需要传入文件对应路径。
  34.   soundId = await soundPool.load(uri);
  35. }
  36. function loadCallback() {
  37.   // 加载完成回调
  38.   soundPool.on('loadComplete', (soundId_: number) => {
  39.     console.info('loadComplete, soundId: ' + soundId_);
  40.   })
  41. }
  42. //设置播放完成监听
  43. function finishPlayCallback() {
  44.   // 播放完成回调
  45.   soundPool.on('playFinished', () => {
  46.     console.info("receive play finished message");
  47.     // 可进行下次播放
  48.   })
  49. }
  50. //设置错误类型监听
  51. function setErrorCallback() {
  52.   soundPool.on('error', (error: BusinessError) => {
  53.     console.info('error happened,message is :' + error.message);
  54.   })
  55. }
  56. async function PlaySoundPool() {
  57.   // 开始播放,这边play也可带播放播放的参数PlayParameters,请在音频资源加载完毕,即收到loadComplete回调之后再执行play操作
  58.   soundPool.play(soundId, playParameters, (error, streamID: number) => {
  59.     if (error) {
  60.       console.info(`play sound Error: errCode is ${error.code}, errMessage is ${error.message}`)
  61.     } else {
  62.       streamId = streamID;
  63.       console.info('play success soundid:' + streamId);
  64.     }
  65.   });
  66.   // 设置循环播放次数
  67.   await soundPool.setLoop(streamId, 2); // 播放3次
  68.   // 设置对应流的优先级
  69.   await soundPool.setPriority(streamId, 1);
  70.   // 设置音量
  71.   await soundPool.setVolume(streamId, 0.5, 0.5);
  72. }
  73. async function release() {
  74.   // 终止指定流的播放
  75.   await soundPool.stop(streamId);
  76.   // 卸载音频资源
  77.   await soundPool.unload(soundId);
  78.   //关闭监听
  79.   setOffCallback();
  80.   // 释放SoundPool
  81.   await soundPool.release();
  82. }
  83. //关闭监听
  84. function setOffCallback() {
  85.   soundPool.off('loadComplete');
  86.   soundPool.off('playFinished');
  87.   soundPool.off('error');
  88. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4