【鸿蒙实战开发】HarmonyOS应用开发-音频解码

开发者可以调用本模块的Native API接口,完成音频解码,即将媒体数据解码为PCM码流。

当前支持的解码能力如下:

容器规格 音频解码类型
mp4 AAC、MPEG(MP3)、Flac、Vorbis、AudioViVid11+
m4a AAC
flac Flac
ogg Vorbis、opus
aac AAC
mp3 MPEG(MP3)
amr AMR(amrnb、amrwb)
raw G711mu
ape APE

适用场景

  • 音频播放

    在播放音频之前,需要先解码音频,再将数据输送到硬件扬声器播放。

  • 音频渲染

    在对音频文件进行音效处理之前,需要先解码再由音频处理模块进行音频渲染。

  • 音频编辑

    音频编辑(如调整单个声道的播放倍速等)需要基于PCM码流进行,所以需要先将音频文件解码。

开发指导

详细的API说明请参考API文档。

参考以下示例代码,完成音频解码的全流程,包括:创建解码器、设置解码参数(采样率/码率/声道数等)、开始、刷新、重置、销毁资源。

在应用开发过程中,开发者应按一定顺序调用方法,执行对应操作,否则系统可能会抛出异常或生成其他未定义的行为。具体顺序可参考下列开发步骤及对应说明。

如下为音频解码调用关系图:

image.png

在 CMake 脚本中链接动态库

target_link_libraries(sample PUBLIC libnative_media_codecbase.so)
target_link_libraries(sample PUBLIC libnative_media_core.so)
target_link_libraries(sample PUBLIC libnative_media_acodec.so)

开发步骤

  1. 添加头文件。
#include <multimedia/player_framework/native_avcodec_audiocodec.h>
#include <multimedia/native_audio_channel_layout.h>
#include <multimedia/player_framework/native_avcapability.h>
#include <multimedia/player_framework/native_avcodec_base.h>
#include <multimedia/player_framework/native_avformat.h>
#include <multimedia/player_framework/native_avbuffer.h>
  1. 创建解码器实例对象,OH_AVCodec *为解码器实例指针。
//c++标准库命名空间
using namespace std;
// 通过 codecname 创建解码器
OH_AVCapability *capability = OH_AVCodec_GetCapability(OH_AVCODEC_MIMETYPE_AUDIO_MPEG, false);
const char *name = OH_AVCapability_GetName(capability);
OH_AVCodec *audioDec_ = OH_AudioCodec_CreateByName(name);
// 设置判定是否为编码;设置false表示当前是解码。
bool isEncoder = false;
// 通过 Mimetype 创建解码器
OH_AVCodec *audioDec_ = OH_AudioCodec_CreateByMime(OH_AVCODEC_MIMETYPE_AUDIO_MPEG, isEncoder);
// 初始化队列
class ADecBufferSignal {
public:
    std::mutex inMutex_;
    std::mutex outMutex_;
    std::mutex startMutex_;
    std::condition_variable inCond_;
    std::condition_variable outCond_;
    std::condition_variable startCond_;
    std::queue<uint32_t> inQueue_;
    std::queue<uint32_t> outQueue_;
    std::queue<OH_AVBuffer *> inBufferQueue_;
    std::queue<OH_AVBuffer *> outBufferQueue_;
};
ADecBufferSignal *signal_;
  1. 调用OH_AudioCodec_RegisterCallback()注册回调函数。

    注册回调函数指针集合OH_AVCodecCallback,包括:

    • OH_AVCodecOnError:解码器运行错误。
    • OH_AVCodecOnStreamChanged:码流信息变化,如声道变化等。
    • OH_AVCodecOnNeedInputBuffer:运行过程中需要新的输入数据,即解码器已准备好,可以输入数据。
    • OH_AVCodecOnNewOutputBuffer:运行过程中产生了新的输出数据,即解码完成。

    开发者可以通过处理该回调报告的信息,确保解码器正常运转。

// OH_AVCodecOnError回调函数的实现
static void OnError(OH_AVCodec *codec, int32_t errorCode, void *userData)
{
    (void)codec;
    (void)errorCode;
    (void)userData;
}
// OH_AVCodecOnStreamChanged回调函数的实现
static void OnOutputFormatChanged(OH_AVCodec
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值