关于HarmonyOS 鸿蒙Next SoundPool播放音频的问题

发布于 1周前 作者 zlyuanteng 来自 鸿蒙OS

关于HarmonyOS 鸿蒙Next SoundPool播放音频的问题

项目需要使用SoundPool播放音频。音频文件放在工程下的rawFile下,请问如何转化为参数uri

3 回复

以下是SoundPool实现音频播放功能的参考demo,看能否解决你的问题:
调用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}`);
})<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

配置播放参数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');
} 
可以使用这个方法加载音频资源:
load(fd: number, offset: number, length: number): Promise<number>;

代码如下:

try {
let file = getContext().resourceManager.getRawFdSync("rawFile下文件的名字")
await this.soundPool.load(file.fd, file.offset, file.length)

} catch (e) {
debugger
}

关于HarmonyOS 鸿蒙Next SoundPool播放音频的问题,以下是一些可能的解决方案:

  1. 资源加载:确保音频资源已正确加载到SoundPool中。如果资源加载失败或路径错误,可能导致播放时出错。请检查音频文件路径和格式是否正确。
  2. 并发流限制:SoundPool有并发流数量的限制。如果尝试播放的音频流数量超过了SoundPool的最大支持数(如某些设备可能支持32个并行流),则需要先卸载不再需要的音频资源。
  3. 音频格式支持:HarmonyOS鸿蒙Next系统支持的音频格式包括AAC、MPEG(MP3)、Flac、Vorbis等,但不支持WMV格式。请确保所使用的音频文件格式被系统支持。
  4. 播放参数设置:检查播放参数(如循环次数、播放速率、音量等)是否设置正确。错误的参数设置可能导致播放失败。

如果以上步骤均无法解决问题,请尝试重启设备或检查HarmonyOS鸿蒙Next系统的更新情况。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部