HarmonyOS soundpool使用问题

现在需要实现点击按钮发出声音,当按钮点击很快的时候声音可以重叠于是用了soundpool但是出现错误”soundPool load failed and catch error is No such file or directory“。参考代码:

let soundPool: media.SoundPool; 
let audioRendererInfo: audio.AudioRendererInfo = { 
  usage: audio.StreamUsage.STREAM_USAGE_MUSIC, 
  rendererFlags: 1 
} 
media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => { 
  if (error) { 
    return; 
  } else { 
    let file: fs.File; 
    let soundID: number = 0; 
    let fileSize: number = 1; //通过fs.stat()获取size值 
    let uri: string = ""; 
    //获取fd的描述信息 
    fs.open('/assets/addsub.mp3', fs.OpenMode.READ_ONLY).then((file_: fs.File) => { 
      file = file_; 
      console.info("file fd: " + file.fd); 
      uri = 'fd://' + (file.fd).toString() 
      soundPool = soundPool_; 
      soundPool.load(uri).then((soundId: number) => { 
        console.info('soundPool load uri success'); 
        soundID = soundId; 
        console.info(`createSoundPool success`) 
        let playParameters: media.PlayParameters = { 
          loop: 1, // 循环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, // 最低优先级 
        } 
        soundPool.play(soundId, playParameters).then((streamId: number) => { 
          console.info('play success'); 
        }, (err: BusinessError) => { 
          console.error('soundpool play failed and catch error is ' + err.message); 
        }); 
      }) 
    }, (err: BusinessError) => { 
      console.error('soundPool load failed and catch error is ' + err.message); 
    }); 
 
  } 
})
HarmonyOS
2024-08-14 16:23:31
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
put_get

看报错内容,初步判断是soundPool的文件路径没有找到,请检查一下soundPool文件的路径是否正确。

1、entry/src/main/ets/assets下的文件不能通过fs.open(’/assets/addsub.mp3’)获取到,可将需要的音频文件放到resources/rawfile目录或resources/resfile目录下,参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/resource-categories-and-access-V5

2、rawfile目录下文件可通过

getContext(this).resourceManager.getRawFdSync(‘assets/addsub.mp3’)

获取RawFileDescriptor,通过

soundPool.load(fileDesc.fd,fileDesc.offset,fileDesc.length)

加载,且只能通过这种方式加载,不能通过uri的形式加载;

3、resfile目录下文件可通过

fs.open(getContext(this).resourceDir + ‘/assets/addsub.mp3’, fs.OpenMode.READ_ONLY)

方式获取到文件,通过

soundPool.load(‘fd://’ + (file.fd))

加载;

4、soundPool.load()的回调中并未真正加载成功,不能在load的回调中直接play,可以在media.createSoundPool()创建soundPool实例后,在soundPool实例的回调监听soundPool.on(‘loadComplete’)中调用play方法。参考demo如下:

import { media } from '@kit.MediaKit'; 
import { audio } from '@kit.AudioKit'; 
import { BusinessError } from '@kit.BasicServicesKit'; 
import { common } from '@kit.AbilityKit'; 
@Entry 
@Component 
struct BorderExample3 { 
  private context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; 
  build() { 
    Button("测试").onClick(() => { 
      let soundPool: media.SoundPool; 
      let audioRendererInfo: audio.AudioRendererInfo = { usage: audio.StreamUsage.STREAM_USAGE_MUSIC, rendererFlags: 1 } 
      media.createSoundPool(5, audioRendererInfo, (error: BusinessError, soundPool_: media.SoundPool) => { 
        if (error) { 
          return; 
        } else { 
          console.info(`createSoundPool success`) 
          this.setCallBack(soundPool_); 
          let file = this.context.resourceManager.getRawFdSync('assets/addsub.mp3'); 
          soundPool = soundPool_; 
          soundPool.load(file.fd, file.offset, file.length).then((soundId: number) => { 
            console.info('soundPool load uri success'); 
          }) 
        } 
      }) 
    }) 
  } 
  setCallBack(soundPool: media.SoundPool) { 
    soundPool.on('loadComplete', (soundId: number) => { 
      console.info('[SoundPoolDemo] loadComplete success,soundId:' + soundId); 
      let playParameters: media.PlayParameters = { 
        loop: 1, // 循环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, // 最低优先级 
      } 
      soundPool.play(soundId, playParameters).then((streamId: number) => { 
        console.info('play success'); 
      }, (err: BusinessError) => { 
        console.error('soundpool play failed and catch error is ' + err.message); 
      }); 
    }); 
    soundPool.on('playFinished', () => { 
      console.info('[SoundPoolDemo] playFinished success'); 
    }); 
    soundPool.on('error', (error: BusinessError) => { 
      console.error(`error happened,and error is ${JSON.stringify(error)}`); 
    }); 
  } 
}
分享
微博
QQ
微信
回复
2024-08-14 21:17:18
相关问题
HarmonyOS soundPool问题
261浏览 • 1回复 待解决
HarmonyOS soundpool播放声音的问题
558浏览 • 1回复 待解决
SoundPool实现音频播放功能
1378浏览 • 1回复 待解决
SoundPool播放的音频是否支持WMV格式
1936浏览 • 1回复 待解决
HarmonyOS Navigation 使用问题
432浏览 • 1回复 待解决
HarmonyOS地图使用问题
362浏览 • 1回复 待解决
HarmonyOS websocket使用问题
276浏览 • 1回复 待解决
HarmonyOS resourceManager使用问题
490浏览 • 1回复 待解决
HarmonyOS lottie使用问题
386浏览 • 1回复 待解决
HarmonyOS RichEditor 使用问题
520浏览 • 1回复 待解决
HarmonyOS Navigation使用问题
460浏览 • 1回复 待解决
HarmonyOS eventHub使用问题
32浏览 • 1回复 待解决
HarmonyOS onAreaChange使用问题
802浏览 • 1回复 待解决
HarmonyOS textpicker使用问题
287浏览 • 1回复 待解决
HarmonyOS customdialog使用问题
645浏览 • 1回复 待解决
HarmonyOS ProtoBuffer使用问题
496浏览 • 1回复 待解决
HarmonyOS Slide使用问题
296浏览 • 1回复 待解决
HarmonyOS filePreview使用问题
348浏览 • 1回复 待解决
HarmonyOS @Extend 的使用问题
508浏览 • 1回复 待解决
HarmonyOS taskpool使用问题咨询
192浏览 • 1回复 待解决
HarmonyOS Refresh组件使用问题
34浏览 • 1回复 待解决
HarmonyOS swiper + LazyForEach使用问题
315浏览 • 1回复 待解决
HarmonyOS Promise & taskpool使用问题
299浏览 • 1回复 待解决
HarmonyOS Text/Span使用问题
442浏览 • 1回复 待解决