【鸿蒙实战开发】如何通过HarmonyOS编解码播放Camera的实时预览流

1. 介绍

视频编解码的主要工作:

  • 编码,即将原始的视频信息压缩为既定格式的数据。
  • 解码,即将已知格式的数据还原为视频信息。

本教程将通过启动相机捕获预览帧,转换为视频原始数据并使用HamonyOS视频解码能力播放预览画面。
通过本教程,你将实现不受视频格式限制、不受视频完整性的影响、确保设备可以实时播放视频流数据,也可以以此为基础实现分布式相机预览、直播、视频聊天等功能。
实时播放预览流界面,效果图如下:image.png

2. 代码结构解读

image.png

  • 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设置返回帧参数接口可以设置镜像功能,代码如下:

frameConfigBuilder.setParameter(ParameterKey.IMAGE_MIRROR, true);

● 捕获预览帧数据
HarmonyOS编码器需要传入视频原始数据,开发者可以通过设置帧接收器的格式为YUV420_888来获取帧的原始数据,

步骤如下:

1.创建帧接收器。

imageReceiver =ImageReceiver.create( 
				Math.max(resoluteX, resoluteY), 
				Math.min(resoluteX, resoluteY), 
				ImageFormat.YUV420_888, 
				CameraConst.IMAGE_RCV_CAPACITY);

2.设置帧接收器回调接口。

imageReceiver.setImageArrivalListener(new ImageReceiver.IImageArrivalListener() { 
	@Override 
	public void onImageArrival(ImageReceiver imageReceiver) { 
	    //帧数据回调 
	} 
});

3.开始连续捕获模式。

frameConfigBuilder.addSurface(imageReceiver.getRecevingSurface()); 
try { 
	cameraDevice.triggerLoopingCapture(frameConfigBuilder.build()); 
} catch (IllegalArgumentException e) { 
	LogUtil.info(TAG, "pushFlow is failed," + e.getMessage()); 
}

● 切换摄像头
通过CameraKit获取手机的摄像头硬件id,通过id创建Camera实例,代码如下:

private void cameraInit() { 
	CameraKit camerakit = CameraKit.getInstance(context.getApplicationContext()); 
	if (camerakit == null || camerakit.getCameraIds().length <= 0) { 
		return; 
	} 
	String cameraId = camerakit.getCameraIds()[0]; 
	if (camerakit.getCameraIds().length > 1) { 
		cameraId = isFrontCamer
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值