OHAudio实现低时延音频录制和播放功能

OHAudio实现低时延音频录制和播放功能

HarmonyOS
2024-05-20 21:12:01
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
LenZhong

OHAudio是HarmonyOS在API version 10中引入的一套全新Naitve API,此API在设计上实现归一,同时支持普通音频通路和低时延通路。

使用的核心API

OHAudio

核心代码解释

添加动态库和头文件

target_link_libraries(sample PUBLIC libohaudio.so) 
​ 
#include <ohaudio/native_audiorenderer.h> 
#include <ohaudio/native_audiostreambuilder.h>

创建构造器

录制

OH_AudioStreamBuilder* builder; 
OH_AudioStreamBuilder_Create(&builder, AUDIOSTREAM_TYPE_RENDERER);

播放

OH_AudioStreamBuilder* builder; 
OH_AudioStreamBuilder_Create(&builder, AUDIOSTREAM_TYPE_RENDERER);

配置音频流参数

  • 音频录制的音频数据要通过回调接口写入,开发者要实现回调接口,使用OH_AudioStreamBuilder_SetCapturerCallback设置回调函数。
  • 播放的音频数据要通过回调接口写入,开发者要实现回调接口,使用OH_AudioStreamBuilder_SetRendererCallback设置回调函数。
///设置音频采样率 
OH_AudioStreamBuilder_SetSamplingRate(builder, 48000); 
//设置音频声道 
OH_AudioStreamBuilder_SetChannelCount(builder, 2); 
//设置音频采样格式 
OH_AudioStreamBuilder_SetSampleFormat(builder, (OH_AudioStream_SampleFormat)0); 
//设置音频流的编码类型 
OH_AudioStreamBuilder_SetEncodingType(builder, (OH_AudioStream_EncodingType)0); 
//设置输出音频流的工作场景 
OH_AudioStreamBuilder_SetRendererInfo(builder, (OH_AudioStream_Usage)1);

设置回调函数和低时延模式

//音频录制 
static OH_AudioCapturer_Callbacks callbacks; 
  // 2. set params and callbacks 
    
  OH_AudioStreamBuilder_SetSamplingRate(builder, g_samplingRate); 
  OH_AudioStreamBuilder_SetChannelCount(builder, g_channelCount); 
//低时延录制 
  OH_AudioStreamBuilder_SetLatencyMode(builder, (OH_AudioStream_LatencyMode)g_latencyMode); 
​ 
  callbacks.OH_AudioCapturer_OnReadData = AudioCapturerOnReadData; 
  OH_AudioStreamBuilder_SetCapturerCallback(builder, callbacks, nullptr); 
​ 
//音频播放 
static OH_AudioRenderer_Callbacks rendererCallbacks; 
// set params and callbacks 
  OH_AudioStreamBuilder_SetSamplingRate(rendererBuilder, g_samplingRate); 
  OH_AudioStreamBuilder_SetChannelCount(rendererBuilder, g_channelCount); 
//低时延播放 
  OH_AudioStreamBuilder_SetLatencyMode(builder, (OH_AudioStream_LatencyMode)g_latencyMode); 
​ 
  rendererCallbacks.OH_AudioRenderer_OnWriteData = AudioRendererOnWriteData; 
  OH_AudioStreamBuilder_SetRendererCallback(rendererBuilder, rendererCallbacks, nullptr);

构造录制和播放音频流

// 3. create OH_AudioCapturer 
    
  OH_AudioStreamBuilder_GenerateCapturer(builder, &audioCapturer); 
    
    // create OH_AudioRenderer 
    
  OH_AudioStreamBuilder_GenerateRenderer(rendererBuilder, &audioRenderer);

使用音频流

录制音频流包含下面接口,用来实现对音频流的控制。



接口




说明


OH_AudioStream_Result OH_AudioCapturer_Start(OH_AudioCapturer* capturer)

开始录制

OH_AudioStream_Result OH_AudioCapturer_Pause(OH_AudioCapturer* capturer)

暂停录制

OH_AudioStream_Result OH_AudioCapturer_Stop(OH_AudioCapturer* capturer)

停止录制

OH_AudioStream_Result OH_AudioCapturer_Flush(OH_AudioCapturer* capturer)

释放缓存数据

OH_AudioStream_Result OH_AudioCapturer_Release(OH_AudioCapturer* capturer)

释放录制实例

播放音频流包含下面接口,用来实现对音频流的控制。



接口




说明


OH_AudioStream_Result OH_AudioRenderer_Start(OH_AudioRenderer* renderer)

开始播放

OH_AudioStream_Result OH_AudioRenderer_Pause(OH_AudioRenderer* renderer)

暂停播放

OH_AudioStream_Result OH_AudioRenderer_Stop(OH_AudioRenderer* renderer)

停止播放

OH_AudioStream_Result OH_AudioRenderer_Flush(OH_AudioRenderer* renderer)

释放缓存数据

OH_AudioStream_Result OH_AudioRenderer_Release(OH_AudioRenderer* renderer)

释放播放实例

释放构造器

static napi_value AudioCapturerRelease(napi_env env, napi_callback_info info) 
{ 
  if (audioCapturer) { 
      OH_AudioCapturer_Release(audioCapturer); 
      OH_AudioStreamBuilder_Destroy(builder); 
      audioCapturer = nullptr; 
      builder = nullptr; 
  } 
  return nullptr; 
} 
static napi_value AudioRendererRelease(napi_env env, napi_callback_info info) 
{ 
  if (audioRenderer) { 
      OH_AudioRenderer_Release(audioRenderer); 
      OH_AudioStreamBuilder_Destroy(rendererBuilder); 
      audioRenderer = nullptr; 
      rendererBuilder = nullptr; 
  } 
  return nullptr; 
}

接口映射

EXTERN_C_START static napi_value Init(napi_env env, napi_value exports) 
{ 
  napi_property_descriptor desc[] = { 
      {"closeFile", nullptr, CloseFile, nullptr, nullptr, nullptr, napi_default, nullptr}, 
      {"audioCapturerLowLatencyInit", nullptr, AudioCapturerLowLatencyInit, nullptr, nullptr, nullptr, napi_default, 
        nullptr}, 
      {"audioCapturerInit", nullptr, AudioCapturerInit, nullptr, nullptr, nullptr, napi_default, nullptr}, 
      {"audioCapturerStart", nullptr, AudioCapturerStart, nullptr, nullptr, nullptr, napi_default, nullptr}, 
      {"audioCapturerPause", nullptr, AudioCapturerPause, nullptr, nullptr, nullptr, napi_default, nullptr}, 
      {"audioCapturerRelease", nullptr, AudioCapturerRelease, nullptr, nullptr, nullptr, napi_default, nullptr}, 
      {"audioCapturerStop", nullptr, AudioCapturerStop, nullptr, nullptr, nullptr, napi_default, nullptr}, 
      {"audioRendererLowLatencyInit", nullptr, AudioRendererLowLatencyInit, nullptr, nullptr, nullptr, napi_default, 
        nullptr}, 
      {"audioRendererInit", nullptr, AudioRendererInit, nullptr, nullptr, nullptr, napi_default, nullptr}, 
      {"audioRendererStart", nullptr, AudioRendererStart, nullptr, nullptr, nullptr, napi_default, nullptr}, 
      {"audioRendererPause", nullptr, AudioRendererPause, nullptr, nullptr, nullptr, napi_default, nullptr}, 
      {"audioRendererRelease", nullptr, AudioRendererRelease, nullptr, nullptr, nullptr, napi_default, nullptr}, 
      {"getRendererState", nullptr, GetRendererState, nullptr, nullptr, nullptr, napi_default, nullptr}, 
      {"getFileSize", nullptr, GetFileSize, nullptr, nullptr, nullptr, napi_default, nullptr}, 
      {"getFramesWritten", nullptr, GetFramesWritten, nullptr, nullptr, nullptr, napi_default, nullptr}, 
      {"getFileState", nullptr, GetFileState, nullptr, nullptr, nullptr, napi_default, nullptr}, 
      {"audioRendererStop", nullptr, AudioRendererStop, nullptr, nullptr, nullptr, napi_default, nullptr}}; 
  napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 
  return exports; 
} 
EXTERN_C_END

实现效果

开发者可以使用低时延模式创建音频录制构造器和音频播放构造器,获得更高质量的音频体验

注明适配的版本信息

DevEco Studio Version: 4.1.1.400

SDK:HarmoneyOS 4.1.0.25

分享
微博
QQ
微信
回复
2024-05-21 17:03:58
相关问题
SoundPool实现音频播放功能
554浏览 • 1回复 待解决
使用AudioCapturer开发音频录制功能
543浏览 • 1回复 待解决
使用AudioRenderer开发音频播放功能
434浏览 • 1回复 待解决
AVplayer开发音频播放功能
450浏览 • 1回复 待解决
如何实现双路预览+录制功能
451浏览 • 1回复 待解决
音频录制开发相关问题
4312浏览 • 1回复 待解决
OpenSL ES音频录制示例调用崩溃
723浏览 • 1回复 待解决
AVPlayer实现音频播放(c++侧)
354浏览 • 1回复 待解决
鸿蒙-如何实现播放一段音频
9636浏览 • 2回复 待解决
AudioCapturer录音+AudioRenderer播放音频
613浏览 • 1回复 待解决
鸿蒙 如何使用 player 播放网络音频
5871浏览 • 1回复 已解决
音频播放长时任务不生效
454浏览 • 1回复 待解决
OH _Audio播放音频问题
494浏览 • 1回复 待解决
怎么使用player播放网络音频呢?
2130浏览 • 1回复 待解决
使用AudioRenderer播放pcm音频流失败
518浏览 • 1回复 待解决