HarmonyOS SoundPool播放短音概率报错5400102?

顺序播放两个短音频:

let soundPool = new IMSoundPool()
soundPool.playRawFile("crystal_dialog_music1.mp3")
setTimeout(()=>{
  let soundPool2 = new IMSoundPool()
  soundPool2.playRawFile("crystal_dialog_music2.mp3")
},2000)
阅读 523
1 个回答

报错5400102当前操作不允许:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/errorcode-media-V5\#section5400102-当前状态机不支持此操作

参考一下这个demo:

import audio from '@ohos.multimedia.audio';
import media from '@ohos.multimedia.media';
import picker from '@ohos.file.picker';
import { BusinessError } from '@ohos.base';

let urii: string = '';
let soundPool: media.SoundPool;
let streamId: number = 0;
const audioSelectOptions = new picker.AudioSelectOptions();
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.9, // range = 0.0-1.0
  rightVolume: 0.9, // range = 0.0-1.0
  priority: 3, // 最低优先级
}
let uri: string = "";

@Entry
@Component
struct NormalCapturer {
  @State message: string = '播放音频';

  async aboutToDisappear() {
    release();
  }

  build() {
    Row() {
      Column() {
        Text('加载music1')
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick((event: ClickEvent) => {
            create('crystal_dialog_music1.mp3');
          })
        Text('加载music2')
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick((event: ClickEvent) => {
            create('crystal_dialog_music2.mp3');
          })
        Button('播放音频').onClick((event: ClickEvent) => {
          PlaySoundPool();
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}

async function create(path: string) {
  //创建soundPool实例
  soundPool = await media.createSoundPool(5, audioRendererInfo);
  //注册监听
  loadCallback();
  finishPlayCallback();
  setErrorCallback();
  // 加载音频资源
  let fd = getContext().resourceManager.getRawFdSync(path)
  soundPool.load(fd.fd, fd.offset, fd.length).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);
  })
}

async function loadCallback() {
  // 加载完成回调
  soundPool.on('loadComplete', (soundId_: number) => {
    console.info('loadComplete, soundId: ' + soundId_);
  })
}

//设置播放完成监听
async function finishPlayCallback() {
  // 播放完成回调
  soundPool.on('playFinished', () => {
    console.info("recive play finished message");
    // 可进行下次播放
  })
}

//设置错误类型监听
function setErrorCallback() {
  soundPool.on('error', (error) => {
    console.info('error happened,message is :' + error.message);
  })
}

async function PlaySoundPool() {
  console.log("开始播放");
  // 开始播放,这边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');
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进