如何通过HarmonyOS编解码播放Camera的实时预览流
1. 介绍
视频编解码的主要工作:
- 编码,即将原始的视频信息压缩为既定格式的数据。
- 解码,即将已知格式的数据还原为视频信息。
本教程将通过启动相机捕获预览帧,转换为视频原始数据并使用HamonyOS视频解码能力播放预览画面。
通过本教程,你将实现不受视频格式限制、不受视频完整性的影响、确保设备可以实时播放视频流数据,也可以以此为基础实现分布式相机预览、直播、视频聊天等功能。
实时播放预览流界面,效果图如下:
2. 代码结构解读
- camera:封装了HarmonyOS camera,通过自定义的CameraView和控制器CameraController,实现了Model和View的解耦。
- codec:是应用于视频编解码Codec的封装,包括编码器CodecEncoder和解码器CodecDecoder,方便开发者使用编码和解码。
- manager:是视频编解码播放器的封装,用于slice和编解码能力分离。
- media:是camera视频录制所使用recorder的封装,用于去CameraController代码复杂度。
- utils:工具类
- LogUtil是日志打印类,对HiLog日志进行了封装。
- ScreenUtils是获取其设备屏幕宽高和分辨率的工具类。
- CodecAbility:自定义视频编解码功能入口。
- MainAbility:主程序入口,DevEco Studio生成,未添加逻辑,无需变更。
- MyApplication:DevEco Studio生成,无需变更。
3. HarmonyOS Camera介绍
本应用通过鸿蒙Camera捕获预览帧,并实现了设置自拍镜像和切换摄像头的功能。
● 自拍镜像
通过FrameConfig.Builder设置返回帧参数接口可以设置镜像功能,代码如下:
● 捕获预览帧数据
HarmonyOS编码器需要传入视频原始数据,开发者可以通过设置帧接收器的格式为YUV420_888来获取帧的原始数据,
步骤如下:
1.创建帧接收器。
2.设置帧接收器回调接口。
3.开始连续捕获模式。
● 切换摄像头
通过CameraKit获取手机的摄像头硬件id,通过id创建Camera实例,代码如下:
4. YUV编码
使用HarmonyOS编码器Codec对Camera获取的视频YUV数据进行编码,步骤如下:
步骤 1 - 初始化编码器。
步骤 2 - videoEncoder= new CodecEncoder.Builder().setFormat(fmt).create();启动编码器。
步骤 3 - 开始编码,传入Camera获取的YUV帧数据。
步骤 4 - 设置编码成功回调,在回调中返回编码后数据,在本应用中在此回调中对数据解码播放。
—-结束
5. 视频源解码播放
编码回调返回自定义编码格式数据,使用Codec对视频源进行播放,步骤如下:
步骤 1 - 初始化解码器,需要传入surface作为视频承载。
步骤 2 - 启动解码器。
步骤 3 - 开始解码。
—-结束
6. 完整示例
CodecAbilitySlice完整示例代码如下:
其中,页面布局文件为ability_codec.xml,示例代码如下:
说明:
以上代码仅demo演示参考使用,产品化的代码需要考虑数据校验和国际化
7. 恭喜您
到这里您已经成功学习了如何通过HarmonyOS编解码播放Camera的实时预览流。
CameraView.java 里面的东西有没有详细的可以看一看不
有源码吗?
视频解码部分我不是很明白
求源码谢谢