鸿蒙3.0设置视频播放速度

123 阅读2分钟

在鸿蒙(HarmonyOS 3.0)中设置视频播放速度,可以通过 VideoPlayer 组件媒体会话管理类(如 AVPlayer)实现。以下是具体实现步骤和代码示例:


方法 1:使用 VideoPlayer 组件(推荐)

适用于简单的视频播放场景,通过 setPlaybackSpeed() 方法调整播放速度。

步骤 1:XML 布局文件

<!-- video_layout.xml -->
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:width="match_parent"
    ohos:height="match_parent"
    ohos:orientation="vertical">

    <!-- 视频播放器 -->
    <VideoPlayer
        ohos:id="$+id:video_player"
        ohos:width="match_parent"
        ohos:height="300vp"
        ohos:scale_mode="fit" />

    <!-- 控制面板:播放速度按钮 -->
    <DirectionalLayout
        ohos:width="match_parent"
        ohos:height="50vp"
        ohos:orientation="horizontal">
        <Button
            ohos:id="$+id:btn_speed_1x"
            ohos:text="1x"
            ohos:width="80vp"
            ohos:height="match_parent" />
        <Button
            ohos:id="$+id:btn_speed_1_5x"
            ohos:text="1.5x"
            ohos:width="80vp"
            ohos:height="match_parent" />
        <Button
            ohos:id="$+id:btn_speed_2x"
            ohos:text="2x"
            ohos:width="80vp"
            ohos:height="match_parent" />
    </DirectionalLayout>

</DirectionalLayout>

步骤 2:Java/JS 代码

public class VideoAbilitySlice extends AbilitySlice {
    private VideoPlayer videoPlayer;
    private Button btnSpeed1x, btnSpeed1_5x, btnSpeed2x;

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        setUIContent(ResourceTable.Layout_video_layout);

        // 初始化组件
        videoPlayer = (VideoPlayer) findComponentById(ResourceTable.Id_video_player);
        btnSpeed1x = findComponentById(ResourceTable.Id_btn_speed_1x);
        btnSpeed1_5x = findComponentById(ResourceTable.Id_btn_speed_1_5x);
        btnSpeed2x = findComponentById(ResourceTable.Id_btn_speed_2x);

        // 设置视频源
        videoPlayer.setVideoSource(new File("/data/video.mp4"));
        videoPlayer.start();

        // 设置播放速度按钮点击事件
        btnSpeed1x.setClickedListener(v -> setPlaybackSpeed(1.0f));
        btnSpeed1_5x.setClickedListener(v -> setPlaybackSpeed(1.5f));
        btnSpeed2x.setClickedListener(v -> setPlaybackSpeed(2.0f));
    }

    // 调整播放速度
    private void setPlaybackSpeed(float speed) {
        if (videoPlayer != null) {
            // 判断是否支持变速
            if (videoPlayer.isPlaybackSpeedSupported(speed)) {
                videoPlayer.setPlaybackSpeed(speed);
            } else {
                ToastDialog.showToast(this, "当前设备不支持此播放速度");
            }
        }
    }
}

方法 2:使用 AVPlayer(更底层控制)

适用于需要自定义播放逻辑的场景,需通过媒体会话管理类实现。

代码实现

public class CustomVideoPlayerAbilitySlice extends AbilitySlice {
    private AVPlayer avPlayer;
    private SurfaceProvider surfaceProvider;

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        setUIContent(ResourceTable.Layout_custom_video_layout);

        // 初始化 SurfaceProvider(用于显示视频画面)
        surfaceProvider = new SurfaceProvider(this);
        surfaceProvider.pinToZTop(true);
        DirectionalLayout layout = findComponentById(ResourceTable.Id_video_container);
        layout.addComponent(surfaceProvider);

        // 初始化 AVPlayer
        avPlayer = new AVPlayer();
        avPlayer.setSource(new AVFileDescriptor("/data/video.mp4"));
        avPlayer.setVideoSurface(surfaceProvider.getSurface());
        avPlayer.prepare();
        avPlayer.play();

        // 设置播放速度(需 API 版本支持)
        try {
            avPlayer.setPlaybackSpeed(1.5f); // 1.5 倍速
        } catch (UnsupportedOperationException e) {
            ToastDialog.showToast(this, "不支持变速播放");
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (avPlayer != null) {
            avPlayer.stop();
            avPlayer.release();
        }
    }
}

关键配置与注意事项

1. 权限配置

config.json 中添加文件读取权限:

{
  "module": {
    "reqPermissions": [
      {
        "name": "ohos.permission.READ_MEDIA",
        "reason": "读取视频文件"
      }
    ]
  }
}

2. 播放速度范围

  • 鸿蒙系统支持的播放速度范围通常为 0.5x ~ 2.0x,具体取决于设备硬件和编解码器支持。
  • 使用前需通过 isPlaybackSpeedSupported() 检查是否支持目标速度。

3. 音频同步问题

  • 变速播放可能导致音频失真,建议通过 AVPlayer.setParameter("speed-audio-mode", "stretch") 启用音频拉伸算法(需设备支持)。

常见问题解决

问题解决方案
变速后音画不同步检查视频编码格式(H.264/HEVC 兼容性更好),降低变速倍数。
不支持变速使用软件解码或集成第三方播放器(如 ExoPlayer)。
按钮状态未更新setPlaybackSpeed() 后更新 UI 按钮的选中状态。

扩展功能

  • 手势控制:通过滑动屏幕左右区域调整播放速度。
  • 变速动画:在 UI 中显示动态的速度变化提示(如浮层文字)。
  • 保存用户偏好:使用 Preferences 存储用户上次设置的播放速度。

通过以上方法,可以在鸿蒙 3.0 中实现视频播放速度的动态调整。如需完整代码示例,可参考华为开发者文档:HarmonyOS 媒体开发指南