HarmonyOS ohaudio播放音频问题?

1、ohaudio 音频延迟怎么获取,目前根据OH\_AudioRenderer\_GetTimestamp获取的position是有延时的。

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

用于音视频同步。

阅读 721
1 个回答

设置音量参考文档:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-media-0000001821001557\#ZH-CN\_TOPIC\_0000001811157018\_\_setvolume9

设置静音可以设置音量为0参考文档:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-audio-0000001820881233\#ZH-CN\_TOPIC\_0000001811317122\_\_%E5%B8%B8%E9%87%8F

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模式时有可能遇到无法获取当前时间的问题,这个bug还在定位中,如果您遇到了可以先使用第二种方法:使用

std::chrono::system_clock::now();

获取当前时间点。

  1. 当前ohaudio 没有设置音量和静音的接口,相关的需求仍在确认中
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进