目录

OHAudio播放音频出现卡顿问题

问题现象

OHAudio播放音频出现卡顿,如何定位?

背景知识

问题定位

此类问题可通过抓取trace数据,分析问题出现时音频数据回调是否正常。

  1. 抓取trace数据。
    • 先执行hdc shell进入命令行。
    • 粘贴如下Bash脚本执行,并同时复现问题,开始抓30秒trace数据。也可以参考命令行说明,或使用DevEco Studio和Smartperf网页抓取。
    • 执行命令将trace文件保存到本地hdc file recv /data/local/tmp/hiprofiler_data.htrace ./hiprofiler_data.htrace。
    hiprofiler_cmd \
      -c - \
      -o /data/local/tmp/hiprofiler_data.htrace \
      -t 30 \
      -s \
      -k \
    <<CONFIG
     request_id: 1
     session_config {
      buffers {
       pages: 16384
      }
     }
     plugin_configs {
      plugin_name: "ftrace-plugin"
      sample_interval: 1000
      config_data {
       ftrace_events: "sched/sched_switch"
       ftrace_events: "power/suspend_resume"
       ftrace_events: "sched/sched_wakeup"
       ftrace_events: "sched/sched_wakeup_new"
       ftrace_events: "sched/sched_waking"
       ftrace_events: "sched/sched_process_exit"
       ftrace_events: "sched/sched_process_free"
       ftrace_events: "task/task_newtask"
       ftrace_events: "task/task_rename"
       ftrace_events: "power/cpu_frequency"
       ftrace_events: "power/cpu_idle"
       hitrace_categories: "ability"
       hitrace_categories: "ace"
       hitrace_categories: "app"
       hitrace_categories: "ark"
       hitrace_categories: "binder"
       hitrace_categories: "disk"
       hitrace_categories: "freq"
       hitrace_categories: "graphic"
       hitrace_categories: "idle"
       hitrace_categories: "irq"
       hitrace_categories: "memreclaim"
       hitrace_categories: "mmc"
       hitrace_categories: "multimodalinput"
       hitrace_categories: "notification"
       hitrace_categories: "ohos"
       hitrace_categories: "pagecache"
       hitrace_categories: "rpc"
       hitrace_categories: "sched"
       hitrace_categories: "sync"
       hitrace_categories: "window"
       hitrace_categories: "workq"
       hitrace_categories: "zaudio"
       hitrace_categories: "zcamera"
       hitrace_categories: "zimage"
       hitrace_categories: "zmedia"
       buffer_size_kb: 204800
       flush_interval_ms: 1000
       flush_threshold_kb: 4096
       parse_ksyms: true
       clock: "boot"
       trace_period_ms: 200
       debug_on: false
      }
     }
    CONFIG
  2. 使用DevEco Profiler调优工具或Smartperf网页中打开trace文件分析。
    • 查看应用进程下的音频输出回调线程OS_AudioWriteCB,其中RendererInClientInner::OnWriteData是应用送数据给系统的回调处理函数,trace中发现此回调函数处理耗时都小于1ms,没有明显堵塞问题,运行正常。
    • 查看RendererInClientInClient线程,会打印应用送给系统的数据大小,发现有几次为0的数据,这不是正常现象。

分析结论

应用送给系统的音频数据中,有为0的静音数据,播放后会有卡顿现象。

修改建议

应用侧需要排查OH_AudioRenderer_OnWriteDataCallback回调函数中写入静音数据的问题。在无法填满回调所需长度数据的情况下,建议返回AUDIO_DATA_CALLBACK_RESULT_INVALID,系统不会处理该段音频数据。