视频播放页面退出时声音暂停有延迟
================

#### 问题现象

用户在退出视频播放页面时，视频声音会继续播放一段时间才停止。

#### 背景知识

*   ArkUI Inspector：DevEco Studio提供的[布局分析](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-arkui-inspector)工具，开发者可以借助它预览真机或模拟器中的UI效果，快速定位布局层级问题，也可以观察组件属性、不同组件之间的关系等。
*   DevEco Profiler：集成在DevEco Studio中的性能调优工具，提供场景化的性能调优功能体验，可以检测应用的性能指标、录制Trace信息，通过分析Trace数据能够发现代码中的性能瓶颈，进而优化性能，更多详细内容可看[使用Profiler进行性能调优](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-profiler-introduction)。

#### 问题定位

1.  首先使用ArkUI Inspector抓取视频播放页面确认当前播放页面是ArkUI页面还是Web页面。
    *   ArkUI页面（如下图示例应用使用Video组件播放视频）：
        
        ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/7/v3/I0FtxVQjSFWLJYpZJOWZoA/zh-cn_image_0000002628395118.png?HW-CC-KV=V1&HW-CC-Date=20260709T133744Z&HW-CC-Expire=86400&HW-CC-Sign=CA72506FC6455C2E4A8528CE69AD3E79B78991586711B3793429D37D3B64094A "点击放大")
        
    *   Web页面（如下图示例应用使用Web组件显示视频页）：
        
        ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/7b/v3/nkityJnhQPunDe5R7GXF-A/zh-cn_image_0000002658914339.png?HW-CC-KV=V1&HW-CC-Date=20260709T133744Z&HW-CC-Expire=86400&HW-CC-Sign=218FEEF307CF91ED5D1C4E4C1F44B14046323F7F51E61EA1B60DEF2DDC517A71 "点击放大")
        

2.  使用DevEco Profiler Frame分析工具抓取视频播放页退出时的Trace信息，根据步骤1确认的结果按以下步骤分析。
    *   视频播放页是ArkUI页面：
        
        展开应用主线程泳道，通过其中的子泳道H:ABILITY\_OR\_PAGE\_SWITCH找到页面退出的部分。![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/7d/v3/Tv4L5VL5TOOsvjpCDBh0tA/zh-cn_image_0000002658794387.png?HW-CC-KV=V1&HW-CC-Date=20260709T133744Z&HW-CC-Expire=86400&HW-CC-Sign=3752E2EDA2541C72D7E1812E95993F934FA48BA77C07FF45763FBA5A80CED1BD "点击放大")
        
        在上方搜索框中输入H:AudioRenderer::Pause关键字，找到停止音频播放的部分，如果有多个H:AudioRenderer::Pause搜索结果，可通过点击搜索框右侧的箭头来找到靠近H:ABILITY\_OR\_PAGE\_SWITCH的那一个。如下图所示可看到停止音频播放是在页面切换完成之后执行的，而应用停止音频播放时，系统侧需要时间处理，因此会有延迟。
        
        ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/14/v3/1qH_3q2fS-qajo7KwDnJhg/zh-cn_image_0000002628555024.png?HW-CC-KV=V1&HW-CC-Date=20260709T133744Z&HW-CC-Expire=86400&HW-CC-Sign=EAEC0F3FFC54EE05EA4B0A56EC3B90FBE734A8522A1651D2E1B7F50A64B523B0 "点击放大")
        
        从停止音频播放操作处看不出来是由什么触发的，但通常音频播放和停止是由应用控制的，因此可以通过查看线程的唤醒关系来确定。点击应用线程状态中的Runnable状态、查看其中WakeUp From Tid，从下图中可看到是由PlayerRequest线程唤醒的。
        
        ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/8b/v3/n9rFT4uuSGKoCczgXHeo4A/zh-cn_image_0000002628395120.png?HW-CC-KV=V1&HW-CC-Date=20260709T133744Z&HW-CC-Expire=86400&HW-CC-Sign=728323B1637BEA476358D7062C641B6ACA2CAB8A60E721FD610E1208D5C92C40 "点击放大")
        
        PlayerRequest线程是属于音频服务media\_service的子线程，不属于应用部分，因此继续查看该线程的唤醒线程。![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/40/v3/aKwwI9IQTzKOxwEwxfdCaw/zh-cn_image_0000002658914341.png?HW-CC-KV=V1&HW-CC-Date=20260709T133744Z&HW-CC-Expire=86400&HW-CC-Sign=17CD074A1A901BB03F77818F4074722DF4FDD34976A62E95D7B27C2EA05F3A36 "点击放大")
        
        通过不断查看线程的唤醒关系，最终找到唤醒线程为主线程，从下图中可看到停止音频播放时在视频页面退出过渡完成之后才执行的，而暂停音频播放需要时间，因此会出现页面退出后声音延迟暂停的问题。
        
        ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/61/v3/pIdU3ne8SAaE3R3eKD7j7Q/zh-cn_image_0000002658794389.png?HW-CC-KV=V1&HW-CC-Date=20260709T133744Z&HW-CC-Expire=86400&HW-CC-Sign=0BD5354C80328CCA52613D2154C8B3408AAD30D9FABCC2DF311C21FD5D13364F "点击放大")
        
    *   视频播放页面是Web页面：
        
        首先展开应用主线程泳道，通过其中的子泳道H:ABILITY\_OR\_PAGE\_SWITCH找到页面退出的部分。
        
        ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/14/v3/PhNP3muhRfmlu-f3Xm8JcQ/zh-cn_image_0000002628555026.png?HW-CC-KV=V1&HW-CC-Date=20260709T133744Z&HW-CC-Expire=86400&HW-CC-Sign=EF2CA7D4CF0C32CF6E5D3348E8F27C30DDCEA4ABD0DE6B4E8071D8AADC4DA6CB "点击放大")
        
        然后确定停止音频播放的地方，Web页面音频开始播放、发送数据、停止播放时由AudioThread线程完成的，因此在应用泳道中找到AudioThread，同时通过H:RendererInClientInner::StopAudioStream关键字来确定停止音频播放的部分。从下图中可看到停止音频播放是在页面切换完成后执行的，而暂停音频播放需要时间，因此会出现页面退出后声音延迟暂停的问题。
        
        ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/a3/v3/eGEitLPqTSWQFjq2laRPnA/zh-cn_image_0000002628395122.png?HW-CC-KV=V1&HW-CC-Date=20260709T133744Z&HW-CC-Expire=86400&HW-CC-Sign=B9FA305AF789F9BCDBA6A843012D3C99B762C3F52B9AD3E70BAA61CDD506BCD1 "点击放大")
        
        Web页面音频播放和暂停是由Web相关的线程控制，可搜索H:AudioOutputDevice::Stop关键字确认Web侧触发音频停止的地方，然后通过该线程的Runnable线程状态查看该线程的唤醒线程，可看到Web侧音频停止是由应用Web渲染线程在执行SetPageLifecycleState时触发。
        
        ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/a1/v3/HU_ERcsnTJmL0b6MAN6AEQ/zh-cn_image_0000002658914343.png?HW-CC-KV=V1&HW-CC-Date=20260709T133744Z&HW-CC-Expire=86400&HW-CC-Sign=F3D8274C4AA7399A683FA51DDAB6B1FC3067D954600DD74CB448AB8C5BED35F4 "点击放大")
        
        对比SetPageLifecycleState和H:ABILITY\_OR\_PAGE\_SWITCH，可看到SetPageLifecycleState执行在页面切换完成，由此可知页面退出后，应用Web渲染线程会更新Web页面生命周期状态，同时停止音频播放，停止音频播放是在页面切换完成后执行的，导致页面退出后声音延迟暂停的问题。
        
        ![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/ee/v3/ZPRJV5W-RbiKZ1ThnZUnHQ/zh-cn_image_0000002658794391.png?HW-CC-KV=V1&HW-CC-Date=20260709T133744Z&HW-CC-Expire=86400&HW-CC-Sign=95A67EDFBED201A3D7A8DB5B02AFDF7E76EE5300E7EF57A3E785E383E855F042 "点击放大")
        

#### 分析结论

视频播放页面退出过程中，暂停音频播放是在页面退出完成后执行的，导致声音暂停有延迟。

#### 修改建议

可重写[onBackPress](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-custom-component-lifecycle#onbackpress)，在开始退出时就停止音频播放。

*   采用Video组件播放视频：
    
    @Entry
    @Component
    struct VideoPage {
      controller: VideoController = new VideoController();
    
      onBackPress(): boolean | void {
        this.controller.stop();
      }
    
      build() {
        Column() {
          Video({
            src: $rawfile('sample.mp4'), _// 测试需要替换成可引用到的资源_
            controller: this.controller
          })
            .size({
              width: '100%',
              height: '100%'
            })
            .autoPlay(true)
        }
        .height('100%')
        .width('100%')
      }
    }
    
*   视频播放页面是Web页面：
    
    import { webview } from '@kit.ArkWeb';
    
    @Entry
    @Component
    struct VideoPage {
      controller: webview.WebviewController = new webview.WebviewController();
    
      onBackPress(): boolean | void {
        try {
          this.controller.stopAllMedia();
        } catch (error) {
          console.error('error: ', error);
        }
      }
    
      build() {
        Column() {
          Web({
            src: 'https://developer.huawei.com/consumer/cn/design/', _// 测试需要替换成可引用到的资源_
            controller: this.controller
          })
        }
        .height('100%')
        .width('100%')
      }
    }