HarmonyOS鸿蒙Next中ohaudio播放音频问题

HarmonyOS鸿蒙Next中ohaudio播放音频问题 问题描述:

1、OhAudio音频延迟怎么获取, 目前根据OH_AudioRenderer_GetTimestamp获取的position是有延时的。

2、OhAudio怎么设置音量和静音,没找到对应的方法。

3、C++中使用OhAudio播放音频,还有对应方法:OH_AudioStreamBuilder_SetFrameSizeInCallback,我这边设置了低延时模式,并设置5ms延迟,但是实际回调回来的数据大小并没有变,还是和没设置延迟一样:

属性设置如下

// 低延迟模式

OH_AudioStreamBuilder_SetLatencyMode(builder, AUDIOSTREAM_LATENCY_MODE_FAST);

// 设置5ms延迟数据大小:44100 * 0.005 * 4 = 882

OH_AudioStreamBuilder_SetFrameSizeInCallback(builder, 882);

4、回调返回值

OH_AudioRenderer_OnWriteData length = 16384

返回值任然是默认的16384大小,没有改变。


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

4 回复

如果是解码出PCM数据然后用OhAudio进行播放音频,不是使用的AvPlayer的场景的话:

  1. 当前版本暂时没有获取音频播放延迟的接口,但是您可以在OH_AudioRenderer_OnWriteData中计算两次写入数据的时间差来获取延迟:
long last_ms = 0;
int64_t lastTimeStamp = 0;
OH_AudioRenderer_OnWriteData(OH_AudioRenderer *render, void *userData, void *buffer, int32_t bufferLen)
{
  int64_t frames;
  int32_t frameSize = 0;
  int64_t frame, timestamp;
  OH_AudioStream_Result ret = OH_AudioRenderer_GetTimestamp(render,CLOCK_MONOTONIC,&frame,&timestamp);
  OH_LOG_Print(LOG_APP, LOG_INFO, 0xFF00, "playing", "get timestamp ret = : %{public}d", ret);
  OH_LOG_Print(LOG_APP, LOG_INFO, 0xFF00, "playing", "frame: %{public}ld, position: %{public}ld, delay= %{public}ld ms", frame, timestamp, timestamp - lastTimeStamp);
  lastTimeStamp = timestamp;

  // 获取当前系统时间点
  auto now = std::chrono::system_clock::now();
  // 将时间点转换为毫秒表示
  auto ms = std::chrono::time_point_cast<std::chrono::milliseconds>(now);
  // 获取毫秒时间
  auto current_ms = ms.time_since_epoch().count();
  long delta_ms = current_ms - last_ms;

  last_ms = current_ms;
  OH_LOG_Print(LOG_APP, LOG_ERROR, 0xFF00, "delay", "test player length: %{public}d frameSize: %{public}d current_ms:%{public}ld frames:%{public}ld",
    bufferLen, frameSize, delta_ms, frames);
}

上面的示例代码提供了两种获取当前时间戳的方式来计算时间差,

补充说明:OH_AudioRenderer_GetTimestamp中的position是获取当前的播放位置用的,计算时间或者音画同步请使用timestamp。此外OH_AudioRenderer_GetTimestamp这个接口在一些版本中开启AUDIOSTREAM_LATENCY_MODE_FAST模式时有可能遇到无法获取当前时间的问题,如果遇到了可以先使用第二种方法:使用std::chrono::system_clock::now();获取当前时间点。

  1. 当前ohaudio没有设置音量和静音的接口

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


在HarmonyOS鸿蒙Next中,ohaudio是用于音频播放的模块。ohaudio提供了一系列接口,允许开发者加载、播放、暂停、停止音频文件,并控制音量、声道等音频参数。以下是一些关键点:

  1. 音频加载:使用ohaudio.createAudioContext创建音频上下文,通过audioContext.src设置音频文件路径,可以是本地文件或网络URL。

  2. 播放控制:通过audioContext.play()开始播放音频,audioContext.pause()暂停播放,audioContext.stop()停止播放。

  3. 音量控制:使用audioContext.volume属性设置音量,范围为0.0到1.0。

  4. 声道控制:通过audioContext.pan属性设置声道平衡,范围为-1.0(左声道)到1.0(右声道)。

  5. 事件监听:可以监听onPlayonPauseonStop等事件,处理音频播放状态变化。

  6. 音频格式:支持常见音频格式如MP3、WAV、AAC等。

  7. 性能优化:ohaudio模块针对鸿蒙系统进行了优化,确保低延迟和高性能的音频播放。

如果在使用ohaudio时遇到问题,建议检查音频文件路径、格式是否正确,以及是否正确处理了相关事件和属性。

在HarmonyOS鸿蒙Next中,使用ohaudio进行音频播放时,常见问题可能涉及音频格式不兼容、设备权限未开启或API调用错误。首先,确保音频文件格式(如MP3、WAV)被系统支持。其次,检查应用的音频权限是否已正确配置,包括ohos.permission.MICROPHONEohos.permission.MEDIA。最后,验证API调用是否正确,如AudioPlayer的初始化、播放控制等。若问题持续,建议查阅官方文档或社区论坛以获取更详细的解决方案。

回到顶部