HarmonyOS 音频资源?

SoundPool怎样如何播放rawfile中的音频资源?

阅读 459
1 个回答

可以使用getRawFdSync方法读取rawfile下的文件:

import audio from '@ohos.multimedia.audio';
import media from '@ohos.multimedia.media';
import { BusinessError } from '@ohos.base';
import common from '@ohos.app.ability.common';
import { emitter } from '@kit.BasicServicesKit';

let soundPool: media.SoundPool;
let streamIda: number = 0;
let soundIda: number = 0;
let audioRendererInfo: audio.AudioRendererInfo = {
  usage: audio.StreamUsage.STREAM_USAGE_MUSIC,
  rendererFlags: 1
}
let PlayParameters: media.PlayParameters = {
  loop: 0, // 循环4次
  rate: audio.AudioRendererRate.RENDER_RATE_NORMAL, // 正常倍速
  leftVolume: 1, // range = 0.0-1.0
  rightVolume: 1, // range = 0.0-1.0
  priority: 3, // 最低优先级
}
@Entry
@Component
struct IR240823214914038 {
  @State message: string = '播放音频';

  async aboutToAppear(): Promise<void> {
    create();
  }
  async aboutToDisappear() {
    release();
  }
  onPageShow(): void {
    emitter.on('eventId', () => {
      console.info('callback');
    });
  }
  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
        Button('play').onClick((event: ClickEvent) => {
          PlaySoundPool1();
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}
async function create() {
  //创建soundPool实例
  soundPool = await media.createSoundPool(10, audioRendererInfo);
  //注册监听
  loadCallback();
  finishPlayCallback();
  setErrorCallback();
  CreatAudio('01.mp3')
}

async function CreatAudio(path:string) {
  // 加载音频资源
  let context = getContext() as common.UIAbilityContext;
  let fileDescriptor = context.resourceManager.getRawFdSync(path);
  if (canIUse('SystemCapability.Multimedia.Media.SoundPool')){
    soundPool.load(fileDescriptor.fd,fileDescriptor.offset,fileDescriptor.length).then((soundId1: number) => {
      console.info('soundPool load uri success 1');
      soundIda=soundId1;
      console.log(`${soundId1}`)
    }).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.error('error happened,message is :' + error.code);
    console.error('error happened,message is :' + error.message);
  })
}
async function PlaySoundPool1() {
  console.log("play");
  // 开始播放,这边play也可带播放播放的参数PlayParameters
  streamIda = await soundPool.play(soundIda,PlayParameters);
}
async function unload(){
  //终止指定流的播放
  soundPool.stop(streamIda);
  // 卸载音频资源
  await soundPool.unload(soundIda);
}
async function release() {
  if (streamIda!=0) {
    //终止指定流的播放
    soundPool.stop(streamIda);
    // 卸载音频资源
    await soundPool.unload(soundIda);
  }
  //关闭监听
  setOffCallback();
  // 释放SoundPool
  await soundPool.release();
}
//关闭监听
function setOffCallback() {
  soundPool.off('loadComplete');
  soundPool.off('playFinished');
  soundPool.off('error');
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进