HarmonyOS soundpool和AVPlayer都无法快速播放多个短促音频?

soundpool和AVplayer加载音频都有延迟,快速播放多个短促音频不能及时播放出来,导致听起来断断续续,这边看看有没有什么办法解决。

参考demo:

import { audio } from '@kit.AudioKit';
import { media } from '@kit.MediaKit';
import { fileIo } from '@kit.CoreFileKit';
import { BusinessError } from '@kit.BasicServicesKit';

let soundPool: media.SoundPool;
let streamId: number = 0;
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.5, // range = 0.0-1.0
  rightVolume: 0.5, // range = 0.0-1.0
  priority: 0, // 最低优先级
}
let uri: string = "";
async function create() {
  //创建soundPool实例
  soundPool = await media.createSoundPool(5, audioRendererInfo);
  //注册监听
  loadCallback();
  finishPlayCallback();
  setErrorCallback();
  // 加载音频资源
  await fileIo.open('/test_01.mp3', fileIo.OpenMode.READ_ONLY).then((file: fileIo.File) => {
    console.info("file fd: " + file.fd);
    uri = 'fd://' + (file.fd).toString()
  }); // '/test_01.mp3' 作为样例,使用时需要传入文件对应路径。
  soundId = await soundPool.load(uri);
}
function loadCallback() {
  // 加载完成回调
  soundPool.on('loadComplete', (soundId_: number) => {
    console.info('loadComplete, soundId: ' + soundId_);
  })
}
//设置播放完成监听
function finishPlayCallback() {
  // 播放完成回调
  soundPool.on('playFinished', () => {
    console.info("recive play finished message");
    // 可进行下次播放
  })
}
//设置错误类型监听
function setErrorCallback() {
  soundPool.on('error', (error: BusinessError) => {
    console.info('error happened,message is :' + error.message);
  })
}
async function PlaySoundPool() {
  // 开始播放,这边play也可带播放播放的参数PlayParameters
  soundPool.play(soundId, playParameters, (error, streamID: number) => {
    if (error) {
      console.info(`play sound Error: errCode is ${error.code}, errMessage is ${error.message}`)
    } else {
      streamId = streamID;
      console.info('play success soundid:' + streamId);
    }
  });
  // 设置循环播放次数
  await soundPool.setLoop(streamId, 2); // 播放3次
  // 设置对应流的优先级
  await soundPool.setPriority(streamId, 1);
  // 设置音量
  await soundPool.setVolume(streamId, 0.5, 0.5);
}
async function release() {
  // 终止指定流的播放
  await soundPool.stop(streamId);
  // 卸载音频资源
  await soundPool.unload(soundId);
  //关闭监听
  setOffCallback();
  // 释放SoundPool
  await soundPool.release();
}
//关闭监听
function setOffCallback() {
  soundPool.off('loadComplete');
  soundPool.off('playFinished');
  soundPool.off('error');
}
阅读 474
1 个回答

soundpool当前最多支持32个并行流,可以在需要加载第33个音频时,将之前加载的音频通过unload卸载掉。

注意:soundpool不支持多实例,多次创建对应的是同个实例,根据上面的soundpool示例可以参考一下如下改动:

//先加载资源目多个录音频文件
let file = context.resourceManager.getRawFdSync('liveness_shakehead.m4a');
soundId = await soundPool.load(file.fd, file.offset, file.length)
let file1 = context.resourceManager.getRawFdSync('liveness_well_done.m4a');
soundId1 = await soundPool.load(file1.fd, file1.offset, file1.length)
Button('播放音频').onClick((event: ClickEvent) => {
  PlaySoundPool(soundId);
})
Button('暂停音频').onClick((event: ClickEvent) => {
  soundPool.stop(streamId);
  // release()
})
Button('播放下一个音频').onClick(async (event: ClickEvent) => {
  PlaySoundPool(soundId1);
})
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
HarmonyOS
子站问答
访问
宣传栏