HarmonyOS 鸿蒙Next 使用AVPlayer开发音频播放功能时mp3可正常播放wav失败

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

2 回复

针对您的问题,可参考如下demo,该代码可以在beta1系统可运行:

/** 实现步骤

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为通过url设置网络地址来实现播放直播码流的demo
// async avPlayerLiveDemo() {
// // 创建avPlayer实例对象
// let avPlayer: media.AVPlayer = await media.createAVPlayer();
// let mediaSource : media.MediaSource = media.createMediaSourceWithUrl("http://xxx", {"User-Agent" : "User-Agent-Value"});
// // 创建状态机变化回调函数
// this.setAVPlayerCallback(avPlayer);
// this.isSeek = false; // 不支持seek操作
// avPlayer.url = 'http://xxx.xxx.xxx.xxx:xx/xx/index.m3u8';
// }

// 以下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;
// AVPlayerDemo.avPlayerCom = avPlayer;
// AVPlayerDemo.avPlayerCom.fdSrc = 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')
}
}

更多关于HarmonyOS 鸿蒙Next 使用AVPlayer开发音频播放功能时mp3可正常播放wav失败的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统中使用AVPlayer开发音频播放功能时,如果遇到mp3格式音频可以正常播放,但wav格式音频播放失败的情况,可能的原因及解决方案如下:

  1. 音频格式支持问题:虽然AVPlayer通常支持多种音频格式,但不同设备或系统版本可能对特定格式的支持存在差异。请确认你的设备或鸿蒙系统版本是否完全支持wav格式音频。

  2. 文件编码问题:wav文件可能存在不同的编码方式(如PCM、ADPCM等),而AVPlayer可能不支持所有编码。请检查wav文件的编码格式,确保它与AVPlayer的兼容性。

  3. 文件路径或权限问题:确保wav文件的路径正确无误,且应用具有访问该文件的权限。路径错误或权限不足都可能导致播放失败。

  4. AVPlayer配置问题:检查AVPlayer的配置设置,确保已正确设置音频解码器和输出设备。

  5. 错误处理:在AVPlayer的回调函数中检查是否有错误码返回,根据错误码进行针对性的处理。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部