在鸿蒙系统中,如何通过C API播放音频数据?

我正在开发一个需要播放音频的应用。请问,鸿蒙系统提供了哪些C API来启动和停止音频播放?这些API如何使用?能否提供一个简单的示例代码来展示如何播放音频数据?

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

阅读 614
avatarAI BotBETA

在鸿蒙系统中,可以通过C API播放音频数据。鸿蒙系统提供了OHAudio和AVPlayer等API来实现音频播放功能。以下是关于如何使用这些API来启动和停止音频播放的详细解答以及示例代码。

OHAudio API

OHAudio是鸿蒙系统在API version 10中引入的一套C API,支持普通音频通路和低时延通路,仅支持PCM格式。

使用方法

  1. 添加头文件
    开发者需要添加对应的头文件来使用OHAudio提供的播放或录制能力。

    #include <ohaudio/native_audiorenderer.h>
    #include <ohaudio/native_audiostreambuilder.h>
  2. 链接动态库
    在CMake脚本中链接动态库libohaudio.so

    target_link_libraries(sample PUBLIC libohaudio.so)
  3. 创建并配置音频流
    使用OH_AudioStreamBuilder接口来构建音频流,并设置必要的参数,如采样率、声道数、采样格式等。
  4. 设置回调
    开发者需要实现回调接口,用于写入音频数据和处理音频事件。
  5. 启动和停止播放
    通过OH_AudioRenderer的API来控制音频的播放和暂停。

示例代码

以下是一个使用OHAudio API播放音频数据的简单示例:

#include <ohaudio/native_audiorenderer.h>
#include <ohaudio/native_audiostreambuilder.h>

// 自定义写入数据函数
int32_t MyOnWriteData(OH_AudioRenderer* renderer, void* userData, void* buffer, int32_t length) {
    // 将待播放的数据,按length长度写入buffer
    return 0;
}

// 自定义音频流事件函数
int32_t MyOnStreamEvent(OH_AudioRenderer* renderer, void* userData, OH_AudioStream_Event event) {
    // 根据event表示的音频流事件信息,更新播放器状态和界面
    return 0;
}

// 自定义音频中断事件函数
int32_t MyOnInterruptEvent(OH_AudioRenderer* renderer, void* userData, OH_AudioInterrupt_ForceType type, OH_AudioInterrupt_Hint hint) {
    // 根据type和hint表示的音频中断信息,更新播放器状态和界面
    return 0;
}

// 自定义异常回调函数
int32_t MyOnError(OH_AudioRenderer* renderer, void* userData, OH_AudioStream_Result error) {
    // 根据error表示的音频异常信息,做出相应的处理
    return 0;
}

int main() {
    OH_AudioStreamBuilder* builder;
    OH_AudioRenderer* audioRenderer;
    OH_AudioRenderer_Callbacks callbacks;

    // 创建音频流构建器
    OH_AudioStreamBuilder_Create(&builder, AUDIOSTREAM_TYPE_RENDERER);

    // 设置音频流参数
    OH_AudioStreamBuilder_SetSamplingRate(builder, 48000);
    OH_AudioStreamBuilder_SetChannelCount(builder, 2);
    OH_AudioStreamBuilder_SetSampleFormat(builder, AUDIOSTREAM_SAMPLE_S16LE);
    OH_AudioStreamBuilder_SetEncodingType(builder, AUDIOSTREAM_ENCODING_TYPE_RAW);
    OH_AudioStreamBuilder_SetRendererInfo(builder, AUDIOSTREAM_USAGE_MUSIC);

    // 配置回调函数
    callbacks.OH_AudioRenderer_OnWriteData = MyOnWriteData;
    callbacks.OH_AudioRenderer_OnStreamEvent = MyOnStreamEvent;
    callbacks.OH_AudioRenderer_OnInterruptEvent = MyOnInterruptEvent;
    callbacks.OH_AudioRenderer_OnError = MyOnError;

    // 设置输出音频流的回调
    OH_AudioStreamBuilder_SetRendererCallback(builder, callbacks, nullptr);

    // 创建音频渲染器
    OH_AudioStreamBuilder_CreateRenderer(builder, &audioRenderer);

    // 设置音频渲染器参数
    OH_AudioRenderer_SetContentType(audioRenderer, OH_AudioContentType_MUSIC);
    OH_AudioRenderer_SetUsage(audioRenderer, OH_AudioUsage_MEDIA);

    // 准备音频渲染器
    OH_AudioRenderer_Prepare(audioRenderer);

    // 开始播放
    OH_AudioRenderer_Start(audioRenderer);

    // ...(播放过程中可以进行其他操作)

    // 停止播放并清理资源
    OH_AudioRenderer_Stop(audioRenderer);
    OH_AudioRenderer_Destroy(audioRenderer);
    OH_AudioStreamBuilder_Destroy(builder);

    return 0;
}

注意:上述示例代码中的MyOnWriteData函数需要开发者根据实际情况实现,以将音频数据写入到缓冲区中。

AVPlayer API

AVPlayer是鸿蒙系统提供的另一个用于音频播放的API,支持端到端播放原始媒体资源。

使用方法

  1. 添加头文件

    #include <multimedia/player_framework/avplayer.h>
    #include <multimedia/player_framework/avplayer_base.h>
    #include <multimedia/player_framework/native_averrors.h>
  2. 链接动态库
    在CMake脚本中链接动态库libavplayer.so

    target_link_libraries(sample PUBLIC libavplayer.so)
  3. 创建AVPlayer实例
    使用OH_AVPlayer_Create函数创建AVPlayer实例。
  4. 设置播放资源
    使用OH_AVPlayer_SetURLSource函数设置播放资源的URL。
  5. 准备播放
    调用OH_AVPlayer_Prepare函数使AVPlayer进入prepared状态。
  6. 控制播放
    使用OH_AVPlayer_PlayOH_AVPlayer_Pause等函数控制音频的播放、暂停等操作。
  7. 释放资源
    播放结束后,调用OH_AVPlayer_Release函数释放资源。

示例代码(简略)

由于AVPlayer的使用相对复杂,这里只提供一个简略的示例代码框架:

#include <multimedia/player_framework/avplayer.h>
#include <multimedia/player_framework/avplayer_base.h>
#include <multimedia/player_framework/native_averrors.h>

// ...(必要的头文件和全局变量定义)

int main() {
    OH_AVPlayer* player;
    // ...(创建AVPlayer实例、设置监听事件等)

    // 设置播放资源
    OH_AVPlayer_SetURLSource(player, "your_audio_url");

    // 准备播放
    OH_AVPlayer_Prepare(player);

    // 开始播放
    OH_AVPlayer_Play(player);

    // ...(播放过程中可以进行其他操作)

    // 停止播放并释放资源
    OH_AVPlayer_Stop(player);
    OH_AVPlayer_Release(player);

    return 0;
}

注意:上述示例代码中的your_audio_url需要替换为实际的音频资源URL,并且需要实现相应的监听事件处理函数以处理播放过程中的各种状态变化。

通过以上介绍和示例代码,你可以在鸿蒙系统中使用C API来播放音频数据。根据你的具体需求选择合适的API,并按照相应的使用方法进行实现。

1 个回答

据我所知,在鸿蒙系统中,你可以通过OH_AudioRenderer相关的C API来播放音频数据。具体步骤如下:

创建音频渲染器:使用音频流构造器(OH_AudioStreamBuilder)创建音频渲染器实例。
配置音频渲染器:设置音频流的参数,如采样率、通道数、编码类型等。
启动音频播放:调用OH_AudioRenderer_Start函数开始播放音频数据。
停止音频播放:调用OH_AudioRenderer_Stop函数停止音频播放。


c
#include <multimedia/player_framework/native_audiorenderer.h>
 
// 假设你已经通过OH_AudioStreamBuilder创建并获取了audioRenderer实例
OH_AudioRenderer *audioRenderer;
 
// 启动音频播放
OH_AudioStream_Result result = OH_AudioRenderer_Start(audioRenderer);
if (result == AUDIOSTREAM_SUCCESS) {
    // 播放成功
}
 
// ... 播放完成后停止播放
result = OH_AudioRenderer_Stop(audioRenderer);
if (result == AUDIOSTREAM_SUCCESS) {
    // 停止成功
}
 
// 释放音频渲染器资源
result = OH_AudioRenderer_Release(audioRenderer);
if (result == AUDIOSTREAM_SUCCESS) {
    // 释放成功
}

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题