HarmonyOS鸿蒙Next中求助使用AVPlayer播放.ogg格式的短音频没有声音

HarmonyOS鸿蒙Next中求助使用AVPlayer播放.ogg格式的短音频没有声音 我们需要实现 【点击一个按钮播放对应音效】的功能,音频格式为.ogg格式,时长都是几秒种的短音频,音频文件都放到了资源文件resource下的rawfile文件夹下,结果点击按钮之后没有声音,麻烦各位大佬帮忙看下是什么问题

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

点击事件:

Image(this.isProcessed ? $r('app.media.five_black_key_sel') : $r('app.media.five_black_key'))
  .height(150)
  .width(36)
  .objectFit(ImageFit.Contain)
  .onTouch((event: TouchEvent) => {
    if (event.type === TouchType.Down) {
      this.createavPlayer();
      this.isProcessed = true;
    }
    if (event.type === TouchType.Up) {
      this.avPlayer.release()
      this.isProcessed = false;
    }
  })

更多关于HarmonyOS鸿蒙Next中求助使用AVPlayer播放.ogg格式的短音频没有声音的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

学习了,我还得努力学,

更多关于HarmonyOS鸿蒙Next中求助使用AVPlayer播放.ogg格式的短音频没有声音的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


楼主你好,可参考如下代码:

```typescript
import media from '[@ohos](/user/ohos).multimedia.media';
import fs from '[@ohos](/user/ohos).file.fs';
import common from '[@ohos](/user/ohos).app.ability.common';
import { BusinessError } from '[@ohos](/user/ohos).base';

[@Component](/user/Component)
struct Index {
  [@State](/user/State) message: string = 'Hello World';
  private avPlayer: media.AVPlayer | null = null;
  private count: number = 0;
  private isSeek: boolean = true; // 用于区分模式是否支持seek操作
  private fileSize: number = -1;
  private fd: number = 0;

  async aboutToAppear(): Promise<void> {
    // 创建avPlayer实例对象
    this.avPlayer = await media.createAVPlayer();
    console.log('666660' + this.avPlayer.state)
    // 创建状态机变化回调函数
    this.setAVPlayerCallback(this.avPlayer);
    if (this.avPlayer != null) {
      // this.avPlayerFdSrcDemo();
      this.avPlayerUrlDemo();
    }
  }

  async avPlayerFdSrcDemo() {
    // 通过UIAbilityContext的resourceManager成员的getRawFd接口获取媒体资源播放地址
    let context = getContext(this) as common.UIAbilityContext;
    let fileDescriptor = await context.resourceManager.getRawFd('123.mp3');
    let avFileDescriptor: media.AVFileDescriptor = { fd: fileDescriptor.fd, offset: fileDescriptor.offset, length: fileDescriptor.length };
    this.isSeek = false; // 支持seek操作
    // 为fdSrc赋值触发initialized状态机上报
    if (this.avPlayer != null) {
      this.avPlayer.fdSrc = avFileDescriptor;
      console.log('666661' + this.avPlayer.state)
      console.log('666662' + this.avPlayer.state)
    }
  }

  async avPlayerLiveDemo() {
    // 创建avPlayer实例对象
    this.avPlayer = await media.createAVPlayer();
    // 创建状态机变化回调函数
    this.setAVPlayerCallback(this.avPlayer);
    this.isSeek = false; // 不支持seek操作
    this.avPlayer.url = 'https://www.cambridgeenglish.org/images/153149-movers-sample-listening-test-vol2.mp3'
  }

  async avPlayerUrlDemo() {
    // 创建avPlayer实例对象
    // 创建状态机变化回调函数
    const resourceManager = getContext(this).resourceManager
    const imageArray = await resourceManager.getMediaContent($r("app.media.dx"));
    let fdPath = 'fd://';
    let path: string = getContext().filesDir + "/01.mp3";
    console.log("yuv_path is:" + path);
    let file = fs.openSync(path, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
    fs.write(file.fd, imageArray.buffer).then(async (writeLen) => {
      console.info("write data to file succeed and size is:" + writeLen);
      fs.closeSync(file);
      let file1 = await fs.open(path);
      fdPath = fdPath + '' + file1.fd;
      if (this.avPlayer != null) {
        this.avPlayer.url = fdPath;
        console.log('666661' + this.avPlayer.state)
      }
    }).catch((err: BusinessError) => {
      console.info("write data to file failed with error message: " + err.message + ", error code: " + err.code);
    });
  }

  setAVPlayerCallback(avPlayer: media.AVPlayer) {
    // 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, reason: media.StateChangeReason) => {
      switch (state) {
        case 'idle': // 成功调用reset接口后触发该状态机上报
          console.info('AVPlayer state idle called.');
          // avPlayer.release(); // 调用release接口销毁实例对象
          break;
        case 'initialized': // avplayer 设置播放源后触发该状态上报
          console.info('666AVPlayer state initialized called.666666666666666');
          avPlayer.prepare();
          break;
        case 'prepared': // prepare调用成功后上报该状态机
          console.info('AVPlayer state prepared called.');
          // avPlayer.play(); // 调用播放接口开始播放
          break;
        case 'playing': // play成功调用后触发该状态机上报
          console.info('AVPlayer state playing called.');
          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;
      }
    })
  }

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
        Button('play')
          .margin(10).onClick(async (event: ClickEvent) => {
            if (this.avPlayer != null) {
              console.log('6666677' + this.avPlayer.state)
              this.avPlayer.play();
            }
          })
        Button('reset').onClick(async (event: ClickEvent) => {
          if (this.avPlayer != null) {
            await this.avPlayer.reset();
            let context = getContext(this) as common.UIAbilityContext;
            let fileDescriptor = await context.resourceManager.getRawFd('稻香.mp3');
            let avFileDescriptor1: media.AVFileDescriptor = { fd: fileDescriptor.fd, offset: fileDescriptor.offset, length: fileDescriptor.length };
            this.isSeek = false; // 支持seek操作
            // 为fdSrc赋值触发initialized状态机上报
            this.avPlayer.fdSrc = avFileDescriptor1;
          }
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}

在HarmonyOS鸿蒙Next中使用AVPlayer播放.ogg格式的短音频没有声音,可能是由于以下原因:

  1. 编解码器支持问题:AVPlayer可能不支持.ogg格式的音频编解码器。鸿蒙系统默认支持的音频格式有限,需要确认系统是否内置了对.ogg格式的解码支持。

  2. 音频文件损坏:确保.ogg文件本身没有损坏,可以在其他设备或播放器上测试该文件是否能正常播放。

  3. 音频流配置问题:检查音频流的配置是否正确,包括采样率、比特率、声道数等参数是否在AVPlayer支持的范围内。

  4. 权限问题:确认应用是否获取了必要的音频播放权限,如ohos.permission.MEDIA

  5. 硬件问题:检查设备的音频输出硬件是否正常工作,尝试播放其他格式的音频文件以确认硬件无故障。

  6. 系统版本兼容性:某些系统版本可能存在对特定音频格式的兼容性问题,建议确认使用的鸿蒙系统版本是否支持.ogg格式。

  7. AVPlayer配置错误:检查AVPlayer的配置是否正确,如是否设置了正确的音频源、是否调用了正确的播放方法等。

如果以上问题均排除,仍无法解决问题,可能需要进一步检查系统日志或使用其他播放器进行测试。

在HarmonyOS鸿蒙Next中使用AVPlayer播放.ogg格式的短音频没有声音,可能是由于以下原因:

  1. 格式支持问题:确保AVPlayer支持.ogg格式。虽然AVPlayer支持多种音频格式,但某些特定编码可能不被支持。

  2. 文件损坏:检查.ogg文件是否完整且未损坏。

  3. 音量设置:确认设备音量未静音,且应用程序内的音量设置正确。

  4. 权限问题:确保应用已获取播放音频的权限。

  5. 代码实现:检查AVPlayer的初始化、播放控制等代码是否正确。

建议使用MediaPlayerAudioManager进行调试,确认问题来源。

回到顶部