当前位置:   article > 正文

基于CameraKit,通过avrecorder进行录像_camerakit 例程

camerakit 例程

1  场景描述

  录像是相机应用的最重要功能之一,录像是循环帧的捕获。本文通过CameraKit自定义相机并通过avrecorder进行录像。

2  效果图

3  自定义相机录像流程图

4 方案描述

4.1  整体描述:

   总体可分为:1、相机输入,2、同时输出预览流+录像流

1、通过cameraInputt,获取相机采集数据,创建相机输入

2、创建previewOutput,获取预览输出流,通过xcomponent的surfaceid连接,送显xcomponent

3、通过AVrecorder的surfaceid创建录像输出流VideoOutput输出到文件中

4.2   步骤一:通过CameraManager获取相机管理对象

 1、创建CameraManager对象

let cameraManager: camera.CameraManager = camera.getCameraManager(context);

2、通过getSupportedCameras 获取相机列表

let cameraArray: Array<camera.CameraDevice> = cameraManager.getSupportedCameras();

3、通过getSupportedSceneModes获取支持的模式类型

let sceneModes: Array<camera.SceneMode> = cameraManager.getSupportedSceneModes(cameraArray[0]);

4.3 步骤二:通过 cameraManager.createCameraInput获取相机输入

创建相机输入

let cameraInput: camera.CameraInput = cameraManager.createCameraInput(cameraArray[0]);

4.4   步骤三:通过cameraManager.createPreviewOutput获取预览输出流

let previewOutput: camera.PreviewOutput = cameraManager.createPreviewOutput(previewProfilesArray[0], surfaceId);

4.5   步骤四:获取录像输出流

 4.5.1    步骤一:创建avRcorder的surface

  1. let avRecorder: media.AVRecorder = await media.createAVRecorder();
  2. let videoSurfaceId = await avRecorder.getInputSurface();

4.5.2    步骤二: 配置AVRecorderProfile信息

  1. let aVRecorderProfile: media.AVRecorderProfile = {
  2.   fileFormat : media.ContainerFormatType.CFT_MPEG_4, // 视频文件封装格式,只支持MP4
  3.   videoBitrate : 100000, // 视频比特率
  4.   videoCodec : media.CodecMimeType.VIDEO_AVC, // 视频文件编码格式,支持avc格式
  5.   videoFrameWidth : 640// 视频分辨率的宽
  6.   videoFrameHeight : 480, // 视频分辨率的高
  7.   videoFrameRate : 30 // 视频帧率
  8. };

 4.5.3    步骤三:创建视频录制的参数

  1. let aVRecorderConfig: media.AVRecorderConfig = {
  2.   videoSourceType: media.VideoSourceType.VIDEO_SOURCE_TYPE_SURFACE_YUV,
  3.   profile: aVRecorderProfile,
  4.   url: "fd://" + file.fd,//获取文件的fd,且创建的文件要有读写权限
  5.   rotation: 90 // 90°为默认竖屏显示角度,如果由于设备原因或应用期望以其他方式显示等原因,请根据实际情况调整该参数
  6. };

注:预览流与录像输出流的分辨率的宽(videoFrameWidth)高(videoFrameHeight)比要保持一致

4.5.4   步骤四:创建avrecorder和录像输出流videoOutput

  1. // 创建avRecorder
  2. let avRecorder: media.AVRecorder = await media.createAVRecorder();
  3. // avRecorder准备
  4. avRecorder.prepare(aVRecorderConfig);
  5. // 创建VideoOutput对象
  6. let videoOutput: camera.VideoOutput | undefined = undefined;
  7. // createVideoOutput传入的videoProfile对象的宽高需要和aVRecorderProfile保持一致。
  8. let videoProfile: undefined | camera.VideoProfile = videoProfilesArray.find((profile: camera.VideoProfile) => {
  9.   return profile.size.width === aVRecorderProfile.videoFrameWidth && profile.size.height === aVRecorderProfile.videoFrameHeight;
  10. });
  11. videoOutput = cameraManager.createVideoOutput(videoProfile, videoSurfaceId);

4.6   步骤五:会话配置

  1. //创建会话
  2. let videoSession: camera.CaptureSession | undefined = undefined;
  3. videoSession.beginConfig();
  4. // 向会话中添加相机输入流
  5. videoSession.addInput(cameraInput);
  6. // 向会话中添加预览输出流
  7. videoSession.addOutput(previewOutput);
  8. // 向会话中添加录像输出流
  9. videoSession.addOutput(videoOutput);
  10. // 提交会话配置
  11. videoSession.commitConfig();
  12. // 启动会话
  13. videoSession.start();

4.7   步骤六:开始、停止录像

  1. // 启动录像输出流
  2. videoOutput.start()
  3. // 开始录像
  4. avRecorder.start();
  5. // 停止录像
  6. avRecorder.stop();

4.8   步骤七:释放资源

  1. // 停止当前会话
  2. videoSession.stop();
  3. // 释放相机输入流
  4. cameraInput.close();
  5. // 释放预览输出流
  6. previewOutput.release();
  7. // 释放录像输出流
  8. videoOutput.release();
  9. // 释放会话
  10. videoSession.release();
  11. // 会话置空
  12. videoSession = undefined;

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/974219
推荐阅读
相关标签
  

闽ICP备14008679号