第13章_HarmonyOs开发图解 视频

第13章 HarmonyOs开发图解 视频

HarmonyOS 学习系统 | 阶段三:高级深耕期


学习目标

序号 能力
1 掌握 HarmonyOS 视频播放(Player)的完整生命周期管理
2 能够使用 Codec 实现视频编解码能力查询
3 掌握视频录制(Recorder)的基本配置与使用

核心图解

内容讲解

13.1 视频能力总览

HarmonyOS 视频模块提供了完整的视频处理能力,涵盖三个核心方向:

  • 视频编解码:通过 Codec 类实现编码和解码,支持查询设备编解码能力
  • 视频播放:通过 Player 类实现,支持播放/暂停/拖拽/倍速/循环
  • 视频录制:通过 Recorder 类实现,支持配置音视频源和存储属性

生活化类比:视频编解码就像"翻译官"

原始视频数据(每一帧像素)就像一篇很长的中文文章,体积庞大。编码器(Encoder)把它"翻译"成精简的英文(压缩格式如 H.264),体积小了很多但保留了核心含义。解码器(Decoder)则做反向翻译,把压缩数据还原成可以显示的画面。而播放器(Player)就像朗读者,拿着翻译好的稿子按节奏"朗读"(播放)出来。

13.2 视频播放器 Player

Player 是 HarmonyOS 视频播放的核心类,支持多种媒体格式(MP4、H.264、H.265、AAC 等)。Player 的生命周期为:创建 -> 设置数据源 -> 准备 -> 播放/暂停 -> 停止 -> 释放。

java 复制代码
// 创建播放器并设置数据源
Player player = new Player(context);
player.setSource(new Source("resources/rawfile/big_buck_bunny.mp4"));

// 设置视频渲染 Surface(关键步骤)
surfaceProvider.setSurfaceCreatedCallback(new SurfaceOpsCallback() {
    @Override
    public void onSurfaceCreated(SurfaceOps surfaceOps) {
        player.setVideoSurface(surfaceOps.getSurface());
    }
});

// 准备并播放
player.prepare();
player.play();

// 设置播放速度(0.75x ~ 2.0x)
player.setPlaybackSpeed(1.5f);

// 开启单曲循环
player.enableSingleLooping(true);

// 拖拽到指定位置(单位:微秒)
player.rewindTo(30000000); // 跳到30秒处

// 注册播放状态回调
player.setPlayerCallback(new Player.IPlayerCallback() {
    @Override
    public void onPrepared() { HiLog.info(TAG, "准备完成"); }
    @Override
    public void onPlayCompleted() { HiLog.info(TAG, "播放完成"); }
    @Override
    public void onError(int errorType, int errorCode) {
        HiLog.error(TAG, "播放错误: " + errorCode);
    }
});

13.3 视频资源释放

非常重要 :Player 持有 Native 资源,必须在 Ability 的 onStop() 中释放,否则会导致内存泄漏。

java 复制代码
@Override
protected void onStop() {
    super.onStop();
    if (player != null) {
        player.stop();
        player.release();
        player = null;
    }
}

13.4 视频录制

Recorder 类支持录制音视频并保存到文件,需要配置视频源(如相机)、音频源(如麦克风)和输出格式。

java 复制代码
// 创建录制器
Recorder recorder = new Recorder();

// 配置录制参数
RecorderConfig config = new RecorderConfig.Builder()
    .setVideoSource(RecorderConfig.VideoSource.VIDEO_SOURCE_SURFACE)
    .setAudioSource(RecorderConfig.AudioSource.AUDIO_SOURCE_MIC)
    .setOutputFormat(RecorderConfig.OutputFormat.OUTPUT_FORMAT_MPEG_4)
    .setVideoEncoder(RecorderConfig.VideoEncoder.VIDEO_ENCODER_H264)
    .setAudioEncoder(RecorderConfig.AudioEncoder.AUDIO_ENCODER_AAC)
    .setVideoSize(new Size(1920, 1080))
    .setVideoFrameRate(30)
    .setOutputFile(new File("path/to/output.mp4"))
    .build();

recorder.setRecorderConfig(config);
recorder.prepare();
recorder.start(); // 开始录制

// 停止录制
recorder.stop();
recorder.release();

13.5 编解码能力查询

不同设备支持的编解码器差异很大,开发前务必查询设备能力:

java 复制代码
// 查询设备支持的编解码格式
CodecDescriptionList codecList = new CodecDescriptionList();
List<CodecDescription> supported = codecList.getSupportedMimes(CodecDescription.CodecType.CODEC_TYPE_DECODER);
for (CodecDescription desc : supported) {
    HiLog.info(TAG, "支持格式: " + desc.getMimeType());
}

代码速查卡

API 功能 示例
Player(context) 创建播放器实例 new Player(context)
setSource(source) 设置媒体源 player.setSource(new Source(path))
prepare() / play() / pause() / stop() 准备/播放/暂停/停止 player.prepare(); player.play();
rewindTo(microseconds) 拖拽到指定位置 player.rewindTo(30000000)
setPlaybackSpeed(speed) 设置播放速度 player.setPlaybackSpeed(1.5f)
setVideoSurface(surface) 设置视频渲染 Surface player.setVideoSurface(surface)
enableSingleLooping(true) 开启单曲循环 player.enableSingleLooping(true)
setPlayerCallback(cb) 注册播放状态回调 player.setPlayerCallback(callback)
getCurrentTime() 获取当前播放位置 player.getCurrentTime()

与 Android/iOS 对比

特性 HarmonyOS Android iOS
播放器类 Player MediaPlayer / ExoPlayer AVPlayer
Surface 渲染 SurfaceProvider + SurfaceOps SurfaceView / TextureView AVPlayerLayer
倍速播放 setPlaybackSpeed() setPlaybackParams() rate 属性
录制类 Recorder MediaRecorder AVAssetWriter
编解码查询 CodecDescriptionList MediaCodecList supportedVideoTypes

⚠️ 踩坑回忆录

为什么视频播放黑屏?

我第一次写视频播放器时,prepare() 和 play() 都调用了,但画面始终是黑的。排查了半天,发现 SurfaceProvider 的回调还没触发就调了 play()------Surface 还没准备好,画面往哪渲染?正确做法是在 onSurfaceCreated 回调中设置 Surface 后再 play。

另外,不同设备支持的编解码器差异很大,一定要先用 CodecDescriptionList.getSupportedMimes() 查询设备能力,别假设所有设备都支持 H.265。我曾在一台中端机上硬编码 H.265 播放,结果只有声音没有画面。


必做实操任务

序号 任务 难度
1 实现一个完整的视频播放器,支持播放、暂停、拖拽和倍速 中
2 添加播放进度条,实时更新播放位置 中
3 查询当前设备的编解码能力,列出支持的格式 低
4 实现视频播放器的单曲循环和列表播放功能 高
5 实现视频录制功能并保存到本地 高

学习检查清单

  • 能说出 Player 的完整生命周期(创建 -> 释放)
  • 能正确使用 SurfaceProvider 显示视频画面
  • 知道为什么必须在 onSurfaceCreated 回调中设置 Surface
  • 能实现视频的播放、暂停、拖拽和倍速功能
  • 能正确释放 Player 资源(在 onStop 中)
  • 能查询设备的编解码能力
  • 了解 Recorder 的基本配置方式
  • 理解视频格式与编解码器的关系(H.264、H.265 等)

进阶方向

  • 结合第 15 章相机能力,实现自定义视频录制 App
  • 学习 HLS/DASH 流媒体协议,实现网络视频播放
  • 探索视频帧的实时处理(如滤镜、美颜)
    ayer 资源(在 onStop 中)
  • 能查询设备的编解码能力
  • 了解 Recorder 的基本配置方式
  • 理解视频格式与编解码器的关系(H.264、H.265 等)

进阶方向

  • 结合第 15 章相机能力,实现自定义视频录制 App
  • 学习 HLS/DASH 流媒体协议,实现网络视频播放
  • 探索视频帧的实时处理(如滤镜、美颜)
相关推荐
Token_w5 小时前
2026鸿蒙平板远控电脑怎么选?大屏适配、自动校准等适配完整度逐项实测
华为·harmonyos
allnlei6 小时前
Opus In-Band FEC 详解:原理、实现与开源方案
ffmpeg·音视频·gstreamer
爱吃提升7 小时前
文生视频模型发展趋势(2026)
人工智能·音视频
梦想不只是梦与想7 小时前
鸿蒙应用市场:版本升级
harmonyos·应用升级·签名不一致
resh_people7 小时前
开源鸿蒙平台 KMP_CMP 三方库「WhatIf」适配全流程
华为·开源·harmonyos
可乐鸡翅yeah_8 小时前
新手梳理:M3U8 线上问题,哪些是前端锅,哪些是后端锅
前端·ios·音视频·实时音视频·m3u8·音视频在线播放
小雨青年9 小时前
【HarmonyOS 7 闪控窗深度实战】04 闪控窗调整窗口形态与显示区域
华为·harmonyos
李游Leo9 小时前
HarmonyOS 7 + ArkUI + RelationalStore 学习笔记:本地数据分层存储与状态持久化架构实践【鸿蒙心迹】
笔记·学习·架构·harmonyos
apple_692658859 小时前
最新ComfyUI 0.37.1使用教程:画图、3D、音频都有改动 ComfyUI升级到0.37.1啦,新增或改进五大功能
音视频
李游Leo10 小时前
《HarmonyOS 7 精准碰一碰跨设备协作开发实战》07:异常恢复、状态机与CrossDrop工程收尾【鸿蒙心迹】
android·harmonyos