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); 
    }); 
 
  } 
})
  • 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.
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’)
  • 1.

获取RawFileDescriptor,通过

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

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

3、resfile目录下文件可通过

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

方式获取到文件,通过

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

加载;

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)}`); 
    }); 
  } 
}
  • 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.
分享
微博
QQ
微信
回复
2024-08-14 21:17:18
相关问题
HarmonyOS soundPool问题
809浏览 • 1回复 待解决
HarmonyOS soundPool使用的疑问
775浏览 • 1回复 待解决
HarmonyOS soundpool播放声音的问题
1156浏览 • 1回复 待解决
HarmonyOS SoundPool播放rawfile音频失败
732浏览 • 1回复 待解决
SoundPool实现音频播放功能
2176浏览 • 1回复 待解决
SoundPool播放的音频是否支持WMV格式
2566浏览 • 1回复 待解决
HarmonyOS SideBarContainer使用问题
655浏览 • 1回复 待解决
HarmonyOS RichEditor 使用问题
1190浏览 • 1回复 待解决
HarmonyOS地图使用问题
975浏览 • 1回复 待解决
HarmonyOS Navigation使用问题
1257浏览 • 1回复 待解决
HarmonyOS eventHub使用问题
905浏览 • 1回复 待解决
HarmonyOS AudioCapturer使用问题
609浏览 • 1回复 待解决
HarmonyOS websocket使用问题
1033浏览 • 1回复 待解决
HarmonyOS @Link使用问题
664浏览 • 1回复 待解决
HarmonyOS lottie使用问题
1024浏览 • 1回复 待解决
HarmonyOS TurboModules使用问题
1135浏览 • 1回复 待解决
HarmonyOS Worker使用问题
657浏览 • 1回复 待解决
HarmonyOS RSA使用问题
474浏览 • 1回复 待解决