HarmonyOS 鸿蒙Next中播放问题

HarmonyOS 鸿蒙Next中播放问题

AudioCapturer录制的音频使用AVPlayer播放,报类型不支持错误怎么解决

6 回复

首先得明确:AudioCapturer是音频采集器,用于录制PCM(Pulse Code Modulation)音频数据。

AVPlayer 报类型不支持错误可参考: 如何播放PCM格式的音频-音频(Audio)-音频和视频

如何播放PCM格式的音频数据-行业常见问题-公交地铁类行业实践

问题根因

AVPlayer不支持直接播放PCM格式文件。

解决方案

  • AudioRenderer:用于音频输出的ArkTS/JS API,仅支持PCM格式,需要应用持续写入音频数据进行工作。应用可以在输入前添加数据预处理,如设定音频文件的采样率、位宽等,要求开发者具备音频处理的基础知识,适用于更专业、更多样化的媒体播放应用开发。
  • OHAudio:用于音频输出的Native API,此API在设计上实现归一,同时支持普通音频通路和低时延通路。仅支持PCM格式,适用于依赖Native层实现音频输出功能的场景。

AVPlayer和AudioRenderer存在如下差异:

播放工具 支持格式 播放占用内存 播放PCM数据 优势
AudioRenderer PCM 可直接播放 数据预处理实现更灵活播放、可支持多实例音频播放。
AVPlayer MP3/WAV等 需要转码播放 播放封装后的音频占用内存小。
OHAudio PCM 可直接播放 适用于依赖Native层实现音频输出的场景。

更多关于HarmonyOS 鸿蒙Next中播放问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


楼主使用AudioCapturer录制的音频在其他位置能否播放,比如放在电脑上,如果使用其他的SDK能播放AVPlayer不能播放的话尝试一下转格式

cke_175.png

我也遇到一样的情况,尝试了MP3和m4a都不行。求解,只能使用ijkplayer了吗?

AVPlaye支持的音频播放格式如下

音频容器规格 规格描述
m4a 音频格式:AAC
aac 音频格式:AAC
mp3 音频格式:MP3
ogg 音频格式:VORBIS
wav 音频格式:PCM
flac 音频格式:FLAC
amr 音频格式:AMR
ape 音频格式:APE

录制时按照支持的格式才可以使用AVPlayer播放

在HarmonyOS Next中,播放问题可能涉及媒体播放器API使用不当或权限配置错误。检查是否已正确导入@ohos.multimedia.media模块,并调用createAVPlayer()初始化播放器。确保应用已申请ohos.permission.INTERNET网络权限(在线播放时)及ohos.permission.READ_MEDIA本地文件读取权限。若播放卡顿,需验证视频编码格式(如H.264/AAC)是否受支持,并确认资源路径有效性。通过AVPlayeron('stateChange')事件监听状态机切换,排查preparedplaying状态异常。

在HarmonyOS Next中,使用AudioCapturer录制的音频数据无法直接通过AVPlayer播放,因为AVPlayer主要用于解码和播放完整的音频文件(如MP3、AAC等),而AudioCapturer输出的是原始PCM数据,未经过编码。AVPlayer不支持原始PCM格式,因此会报类型不支持错误。

解决方法:

  1. 使用AudioRenderer播放PCM数据:将AudioCapturer录制的PCM数据通过AudioRenderer直接播放。AudioRenderer专用于播放原始音频数据流,需确保采样率、通道数等参数与AudioCapturer设置一致。

  2. 先编码再播放:如果必须使用AVPlayer,可以先将PCM数据编码为AVPlayer支持的格式(如AAC),再通过AVPlayer播放。但需引入编码库(如MediaCodec)进行处理,步骤较复杂。

推荐采用第一种方法,简单高效。示例代码片段如下:

// 初始化AudioRenderer
AudioStreamInfo audioStreamInfo = new AudioStreamInfo.Builder()
    .encodingFormat(AudioStreamInfo.EncodingFormat.ENCODING_PCM_16BIT)
    .channelMask(AudioStreamInfo.ChannelMask.CHANNEL_IN_MONO)
    .sampleRate(44100)
    .build();
AudioRenderer audioRenderer = new AudioRenderer(audioStreamInfo, AudioRenderer.AudioOutputFlag.AUDIO_OUTPUT_FLAG_NONE);
audioRenderer.start();

// 从AudioCapturer读取PCM数据并写入AudioRenderer
byte[] pcmData = new byte[bufferSize];
while (isRecording) {
    int readSize = audioCapturer.read(pcmData, 0, pcmData.length);
    if (readSize > 0) {
        audioRenderer.write(pcmData, 0, readSize);
    }
}

确保AudioCapturer和AudioRenderer参数匹配,避免播放异常。

回到顶部