HarmonyOS 使用AVPlayer开发音频播放功能,mp3类型的本地音频文件可以正常播放,但是wav类型的音频文件播放失败

使用AVPlayer开发音频播放功能,mp3类型的本地音频文件可以正常播放,但是wav类型的音频文件播放失败demo文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/using-avplayer-for-playback-V5#完整示例

HarmonyOS
1天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Excelsior_abit

可参考如下demo:

/** 实现步骤
 1.利用AVrecord录制音频病获取音频振幅
 2.利用振幅的变化,换算出column的height并加上动画效果。
 3.使用AVplayer播放录制的音频文件。
 */
import media from '@ohos.multimedia.media';
import { BusinessError } from '@ohos.base';
import fs from '@ohos.file.fs';
import common from '@ohos.app.ability.common';
import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
import { CommonConstants as Const } from '../utils/CommonConstants';
import { Logger } from '../utils/Logger';

// 音频播放
export class AVPlayerDemo {
  private count: number = 0;
  private isSeek: boolean = true; // 用于区分模式是否支持seek操作
  private fileSize: number = -1;
  private fd: number = 0;
  public flag:number = 1;
  public static avPlayerCom: media.AVPlayer ;
  public static avFileDescriptorCom: media.AVFileDescriptor;
  public curAudioPath: string = '';
  public avFileDescriptor4: media.AVFileDescriptor| undefined = undefined ;

  // 注册avplayer回调函数
  setAVPlayerCallback(avPlayer: media.AVPlayer): void {
    // seek操作结果回调函数
    avPlayer.on('seekDone', (seekDoneTime: number) => {
      console.info(`AVPlayer seek succeeded, seek time is ${seekDoneTime}`);
    })
    // error回调监听函数,当avPlayer在操作过程中出现错误时调用 reset接口触发重置流程
    avPlayer.on('error', (err: BusinessError) => {
      console.error(`Invoke avPlayer failed, code is ${err.code}, message is ${err.message}`);
      avPlayer.reset(); // 调用reset重置资源,触发idle状态
    })
    // 状态机变化回调函数
    avPlayer.on('stateChange', async (state: string, _: media.StateChangeReason) => {
      switch (state) {
        case 'idle': // 成功调用reset接口后触发该状态机上报
          console.info('AVPlayer state idle called.');
          avPlayer.release(); // 调用release接口销毁实例对象
          break;
        case 'initialized': // avplayer 设置播放源后触发该状态上报
          console.info('AVPlayer state initialized called.');
          avPlayer.prepare();
          break;
        case 'prepared': // prepare调用成功后上报该状态机
          console.info('AVPlayer state prepared called.');
          avPlayer.play(); // 调用播放接口开始播放
          break;
        case 'playing': // play成功调用后触发该状态机上报
          console.info('AVPlayer state playing called.');
          this.count++;
          break;
        case 'paused': // pause成功调用后触发该状态机上报
          console.info('AVPlayer state paused called.');
          avPlayer.play(); // 再次播放接口开始播放
          break;
        case 'completed': // 播放结束后触发该状态机上报
          console.info('AVPlayer state completed called.');
          avPlayer.stop(); //调用播放结束接口
          break;
        case 'stopped': // stop接口成功调用后触发该状态机上报
          console.info('AVPlayer state stopped called.');
          avPlayer.reset(); // 调用reset接口初始化avplayer状态
          break;
        case 'released':
          console.info('AVPlayer state released called.');
          break;
        default:
          console.info('AVPlayer state unknown called.');
          break;
      }
    })
  }

  // 以下demo为使用fs文件系统打开沙箱地址获取媒体文件地址并通过url属性进行播放示例
  async avPlayerUrlDemo(): Promise<void> {
    // 创建avPlayer实例对象
    try {
      const avPlayer: media.AVPlayer = await media.createAVPlayer();
      avPlayer.audioRendererInfo
      // 创建状态机变化回调函数
      await this.setAVPlayerCallback(avPlayer);
      // 通过UIAbilityContext获取沙箱地址filesDir,以Stage模型为例
      const context = getContext(this) as common.UIAbilityContext;
      let fileDescriptor = await context.resourceManager.getRawFd('boisterous.wav');
      let avFileDescriptor: media.AVFileDescriptor =
        { fd: fileDescriptor.fd, offset: fileDescriptor.offset, length: fileDescriptor.length };
      this.isSeek = true; // 支持seek操作
      // 为fdSrc赋值触发initialized状态机上报
      // 测试可以播放
      avPlayer.fdSrc = avFileDescriptor;
      AVPlayerDemo.avFileDescriptorCom = avFileDescriptor;
    } catch (e) {
      Logger.error("=============hwj===" + e)
    }
  }
}

@Entry
@Component
export struct AudioSimple {
  AVplaer = new AVPlayerDemo();
  build() {
    Column() {
      Button('播放音频2222')
        .onClick(() => {
          this.AVplaer.avPlayerUrlDemo().then(()=>{});
        }).width('100').height('100')
    }
    .width('200')
    .height('200')
  }
}
分享
微博
QQ
微信
回复
1天前
相关问题
HarmonyOS 播放本地音频文件
244浏览 • 1回复 待解决
AVplayer开发音频播放功能
1246浏览 • 1回复 待解决
使用AudioRenderer开发音频播放功能
1141浏览 • 1回复 待解决
怎么读取本地音频文件列表?
6371浏览 • 1回复 待解决
基于AVPlayer音频后台播放
618浏览 • 1回复 待解决
SoundPool实现音频播放功能
1408浏览 • 1回复 待解决
使用AudioRenderer播放pcm音频失败
1769浏览 • 1回复 待解决
AVPlayer实现音频播放(c++侧)
1380浏览 • 1回复 待解决
HarmonyOS 是否支持MP3音频录制?
222浏览 • 1回复 待解决
HarmonyOS mp3播放与暂停
29浏览 • 1回复 待解决
HarmonyOS SoundPool播放rawfile音频失败
38浏览 • 1回复 待解决
HarmonyOS 音频播放相关
24浏览 • 1回复 待解决
HarmonyOS音频播放问题
457浏览 • 1回复 待解决