OHAudio播放音频出现卡顿问题
=================

#### 问题现象

OHAudio播放音频出现卡顿，如何定位？

#### 背景知识

*   [OHAudio](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/using-ohaudio-for-playback)是系统在API version 10中引入的一套C API，此API在设计上实现归一，同时支持普通音频通路和低时延通路。仅支持PCM格式，适用于依赖Native层实现音频输出功能的场景。
*   [HiProfiler](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/hiprofiler)调优组件旨在为开发者提供一系列调优能力，可以用来帮助分析内存、性能等问题。

#### 问题定位

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

1.  抓取trace数据。
    
    *   先执行hdc shell进入命令行。
    *   粘贴如下Bash脚本执行，并同时复现问题，开始抓30秒trace数据。也可以参考[命令行说明](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/hiprofiler#命令行说明)，或使用[DevEco Studio](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-software-install)和[Smartperf](https://gitcode.com/openharmony/developtools_smartperf_host/releases)网页抓取。
    *   执行命令将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调优工具](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-profiler)或[Smartperf](https://gitcode.com/openharmony/developtools_smartperf_host/releases)网页中打开trace文件分析。
    *   查看应用进程下的音频输出回调线程OS\_AudioWriteCB，其中RendererInClientInner::OnWriteData是应用送数据给系统的回调处理函数，trace中发现此回调函数处理耗时都小于1ms，没有明显堵塞问题，运行正常。
    *   查看RendererInClientInClient线程，会打印应用送给系统的数据大小，发现有几次为0的数据，这不是正常现象。
        
        ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/5a/v3/1WIAqJmeTtaKgPHaQvoWug/zh-cn_image_0000002664157965.png?HW-CC-KV=V1&HW-CC-Date=20260709T134249Z&HW-CC-Expire=86400&HW-CC-Sign=DD23AEA1A0268230437C485EBBEB70D3D2DE7166A86DE8717B8D5BDC9B9D949C "点击放大")
        

#### 分析结论

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

#### 修改建议

应用侧需要排查[OH\_AudioRenderer\_OnWriteDataCallback](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/capi-native-audiostream-base-h#oh_audiorenderer_onwritedatacallback)回调函数中写入静音数据的问题。在无法填满回调所需长度数据的情况下，建议返回AUDIO\_DATA\_CALLBACK\_RESULT\_INVALID，系统不会处理该段音频数据。