HarmonyOS SoundPool播放音频无声音?

如题:HarmonyOS SoundPool播放音频无声音?

阅读 544
1 个回答

参考demo:

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

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 aboutToAppear(): Promise<void> {
    create();
  }

  async aboutToDisappear() {
    release();
  }

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)

        Button('播放音频').onClick((event: ClickEvent) => {
          PlaySoundPool();
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}

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');
}

async function create() {
  //创建soundPool实例
  soundPool = await media.createSoundPool(5, audioRendererInfo);
  console.log("音频类型为:" + audioRendererInfo.usage.valueOf())
  //注册监听
  loadCallback();
  finishPlayCallback();
  setErrorCallback();
  // 加载音频资源
  let context: common.UIAbilityContext = getContext() as common.UIAbilityContext;
  let data = context.resourceManager.getRawFdSync('camera_shutter.mp3');
  let sanboxPath = context.filesDir
  console.log("沙箱路径:" + sanboxPath)
  let filePath = context.tempDir + "/camera_shutter.mp3"
  console.log("压缩文件路径:" + filePath)
  let dest = fs.openSync(filePath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE)
  let bufsize = 4096
  let buf = new ArrayBuffer(bufsize)
  let off = 0, len = 0, readedLen = 0

  /**
   * 通过buffer将rawfile文件内容copy到沙箱路径
   */
  while (len = fs.readSync(data.fd, buf, { offset: data.offset + off, length: bufsize })) {
    readedLen += len
    fs.writeSync(dest.fd, buf, { offset: off, length: len })
    off = off + len
    if ((data.length - readedLen) < bufsize) {
      bufsize = data.length - readedLen
    }
  }
  fs.close(dest.fd)

  context.resourceManager.closeRawFd("audio4Test.mp4", (err, data) => {
    console.log("closeRawFd start")
    if (err != null) {
      console.log(err.message)
    } else {
      console.log("close success")
    }
  })

  await fs.open(filePath, fs.OpenMode.READ_ONLY).then((file_: fs.File) => {
    let file = file_;
    console.info("file fd: " + file.fd);
    uri = 'fd://' + (file.fd).toString()
  });

  soundPool.load(uri).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);
  })
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进