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');
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
HarmonyOS
2024-12-23 16:19:47
1285浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
aquaa

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);
})
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
分享
微博
QQ
微信
回复
2024-12-23 19:32:34


相关问题
SoundPool实现音频播放功能
2208浏览 • 1回复 待解决
HarmonyOS SoundPool播放rawfile音频失败
744浏览 • 1回复 待解决
基于AVPlayer音频后台播放
1429浏览 • 1回复 待解决
SoundPool播放音频是否支持WMV格式
2586浏览 • 1回复 待解决
AVplayer开发音频播放功能
1803浏览 • 1回复 待解决
AVPlayer实现音频播放(c++侧)
2221浏览 • 1回复 待解决
HarmonyOS avplayer播放amr音频的码率问题
616浏览 • 1回复 待解决
创建多个视频组件无法播放
3060浏览 • 1回复 待解决
HarmonyOS soundpool播放声音的问题
1173浏览 • 1回复 待解决
HarmonyOS AVPlayer 播放问题
1802浏览 • 1回复 待解决