# 播放音频，进度条无法拖动

#### 问题现象

播放音频时不能拖动进度条。

#### 背景知识

1.  使用AVPlayer播放音频(ArkTS)：使用AVPlayer可以实现端到端播放原始媒体资源，在应用开发的过程中，开发者可以通过AVPlayer的state属性主动获取当前状态，或使用on('stateChange')方法监听状态变化。
2.  Slider：滑动条组件，通常用于快速调节设置值，如音量调节、亮度调节等应用场景。

#### 问题定位

1.  检查是否注册事件监听：AVPlayer需注册timeUpdate和seekDone事件实现进度同步。若未处理seekDone事件可能导致播控中心状态不同步。
    
    ```
    avPlayer.on('timeUpdate', (currentTime: number) => {
      this.currentPosition = currentTime; // 实时更新进度条位置
    });
    
    avPlayer.on('seekDone', (seekTime: number) => {
      this.currentPosition = seekTime; // 确保seek完成后更新状态
      session.setAVPlaybackState({ position: { elapsedTime: seekTime } });
    });
    ```
    
2.  检查异步操作时序：避免在seek()操作完成前修改进度条显示。
    
    ```
    // 错误写法：未等待seek操作完成即更新进度
    this.avPlayer.seek(newPosition);
    this.currentPosition = newPosition; // 可能导致进度条回弹
    
    // 正确写法：在seekDone回调中更新状态
    avPlayer.on('seekDone', (time) => {
      this.currentPosition = time;
    });
    ```
    
3.  检查Slider组件与AVPlayer联动是否异常：使用Slider的onChange事件触发seek()操作时，需绑定AVPlayer实例。
    
    ```
    Slider({
      value: this.currentPosition,
      max: this.duration
    })
    .onChange((value: number) => {
      this.avPlayer.seek(value); // 调用AVPlayer的seek方法
    });
    ```
    

#### 分析结论

1.  未进行相关事件监听。
2.  异步操作时序混乱。
3.  Slider组件未绑定AVPlayer实例调用seek方法控制滑动条跳转。

#### 修改建议

以下方案详细步骤及完整示例可参考运行完整示例。

1.  添加timeUpdate和seekDone事件监听。
2.  确保在seek操作完成后更新进度。
3.  Slider组件在onChange时调用AVPlayer的seek方法同步状态。