HarmonyOS鸿蒙Next中怎么写app里面的相机功能

HarmonyOS鸿蒙Next中怎么写app里面的相机功能 最近在写一个app其中有一个录短视频的功能,是跟现在世面上的录视频功能差不多,但是不知道怎么写这个相机的或者是录像的功能,写完了也不知道怎么保存到自己的作品里面,求大神可以帮帮忙谢谢

10 回复

关于楼主提到的两个问题:
1.如何录制视频可以参考这个文档HDR Vivid视频录制、播放与转码-音频和视频-媒体 - 华为HarmonyOS开发者

2.关于录制的作品保存到哪里
这个要看楼主的产品定位是怎样的,楼主可以先保存在手机文件里面,也可以存储到沙箱,等需要导出的时候再保存到相册中,还有就是这种也可以考虑保存部分到云端

更多关于HarmonyOS鸿蒙Next中怎么写app里面的相机功能的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


背景知识:

需要实现拍照/录制可以直接调用系统的项目功能

问题解决:

实现代码:

@Entry
@Component
struct CameraPage {

    build() {
        Column() {
            Button("调用系统相机")
                .fontSize(20)
                .fontColor(Color.White)
                .fontWeight(FontWeight.Bold)
                .onClick(()=>{
                    let pickerProfile: picker.PickerProfile = {
                        cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK
                    };
                    picker.pick(this.context, [picker.PickerMediaType.PHOTO, picker.PickerMediaType.VIDEO], pickerProfile)
                        .then((res:picker.PickerResult)=>{
                            console.log("CameraPage res:"+JSON.stringify(res))
                        })
                    ;
                })

           
        }
        .width("100%")
        .height("100%")
    }    
    
}

日志:

CameraPage res:{"resultCode":0,"resultUri":"file://media/Photo/1658/IMG_1755421948_1599/IMG_20250817_171048.jpg","mediaType":"photo"}

真机演示:

cke_9184.gif

配置权限和动态申请权限

// config.json

{
  "reqPermissions": [
    {"name": "ohos.permission.CAMERA"},
    {"name": "ohos.permission.MICROPHONE"},
    {"name": "ohos.permission.READ_MEDIA"},
    {"name": "ohos.permission.WRITE_MEDIA"}
  ]
}
import abilityAccessCtrl from '@kit.AbilityAccessCtrlKit';

async function requestPermissions() {
  const permissions: Array<string> = [
    'ohos.permission.CAMERA',
    'ohos.permission.MICROPHONE',
    'ohos.permission.READ_MEDIA',
    'ohos.permission.WRITE_MEDIA'
  ];
  const atManager = abilityAccessCtrl.createAtManager();
  try {
    await atManager.requestPermissionsFromUser(this.context, permissions);
  } catch (err) {
    console.error('Permission request failed: ' + JSON.stringify(err));
  }
}

相机功能

1 初始化相机服务

import camera from '@kit.CameraKit';

// 创建相机管理对象
let cameraManager = camera.createCameraManager();

// 获取可用相机列表
let cameras = cameraManager.getSupportedCameras();
let cameraObj = cameraManager.createCamera(cameras.cameraId);

2 配置视频输出

// 创建视频配置参数
let videoProfile: camera.VideoProfile = {
  format: camera.VideoFormat.VIDEO_DEFAULT,
  width: 1080,
  height: 1920,
  frameRate: 30
};

// 创建视频输出对象
let videoOutput: camera.VideoOutput;
videoOutput = cameraManager.createVideoOutput(videoProfile, surfaceId); // surfaceId为XComponent组件ID

3 创建录像会话

let captureSession: camera.VideoSession;
try {
  captureSession = cameraManager.createSession(camera.SceneMode.NORMAL_VIDEO) as camera.VideoSession;
  captureSession.beginConfig();
  captureSession.addInput(cameraObj);
  captureSession.addOutput(videoOutput);
  await captureSession.commitConfig();
  await captureSession.start();
} catch (error) {
  console.error('Session setup failed: ' + JSON.stringify(error));
}

视频录制控制

启动/停止录制

// 开始录制
videoOutput.start().then(() => {
  console.log('Video recording started');
});

// 停止录制
videoOutput.stop().then(() => {
  console.log('Video recording stopped');
});

保存视频到本地

import mediaLibrary from '@kit.MediaLibraryKit';

async function saveVideoToGallery(fileUri: string) {
  let mediaTest = mediaLibrary.getMediaLibrary();
  let publicPath = await mediaTest.getPublicDirectory(mediaLibrary.DirectoryType.DIR_VIDEO);
  let asset = await mediaTest.createAsset(
    mediaLibrary.MediaType.VIDEO,
    'my_video.mp4',
    publicPath + 'MyVideos/'
  );
  await mediaTest.commitModify(asset);
}

界面预览实现

// XComponent布局定义
XComponent({
  id: 'xc_preview',
  type: 'surface',
  controller: xcController
})
.onSurfaceCreate((surfaceId) => {
  // 将surfaceId传递给视频输出配置
  setupCameraPreview(surfaceId);
})

如有帮助楼主记得关注哦

有以下示例可以参考:

1、实现相机数据采集保存功能

本示例主要展示了相机的相关功能,使用libohcamera.so 接口实现相机的预览、拍照、录像、前后置摄像头切换进行拍照、录像,以及对焦、曝光等控制类功能。

2、基于相机开放能力实现系统级相机

本示例展示如何使用HarmonyOS提供的相机开放能力,主要包括使用camera kit拍摄以及photoAccessHelper进行保存图片和视频。

3、基于CameraKit通过AVRecorder录像

本示例通过CameraKit自定义相机,并通过AVRecorder进行录像。帮助开发者在自定义相机的场景开发中,实现使用AVRecorder录像的功能。

4、相机数据采集

本示例主要展示了相机的相关功能接口,实现相机的预览拍照功能。帮助开发者在相机相关场景开发中,实现相机的预览、拍照、录像、变焦、对焦等功能。

在HarmonyOS Next中,相机功能主要通过CameraKit框架实现。首先在module.json5中声明相机权限。使用CameraKitCameraManager获取相机列表,通过CameraInput创建输入流,PreviewOutput设置预览,PhotoOutput处理拍照。调用capturePhoto()方法拍照,通过ImageReceiver接收图像数据。

在HarmonyOS Next中实现相机和录像功能,主要使用@ohos.multimedia.camera@ohos.multimedia.image等系统能力。以下是核心步骤:

  1. 权限申请与相机管理module.json5中声明ohos.permission.CAMERAohos.permission.MICROPHONE权限。通过getCameraManager获取相机管理器,并调用getSupportedCameras获取设备相机列表。

  2. 创建相机输入流与预览流 使用createCameraInput创建指定相机的输入流,并调用open打开。通过createPreviewOutput创建预览输出流,并绑定到XComponent组件进行画面显示。

  3. 实现视频录制 调用createVideoOutput创建视频输出流,指定录制参数(如分辨率、编码格式)。使用createAVRecorder创建录制器,配置录制文件路径、视频源等参数后,调用start开始录制。

  4. 保存与处理视频 录制结束后,视频文件将自动保存至指定路径。你可以通过@ohos.file.fs文件系统接口,将文件移动或复制到应用的私有目录(如data/storage/el2/base/files/)进行管理,并可将文件信息存入数据库以便在应用内展示。

关键代码示例(视频录制部分)

// 创建视频输出流
let videoProfile: camera.VideoProfile = {
  audioSampleRate: 48000,
  audioChannels: 2,
  audioBitrate: 48000,
  videoFrameWidth: 640,
  videoFrameHeight: 480,
  videoBitrate: 2000000
};
let videoOutput: camera.VideoOutput = await cameraManager.createVideoOutput(videoProfile);

// 创建AVRecorder并开始录制
let avRecorder: media.AVRecorder = await media.createAVRecorder();
let config: media.AVRecorderConfig = {
  videoSourceType: media.VideoSourceType.VIDEO_SOURCE_TYPE_SURFACE_YUV,
  profile: {
    fileFormat: media.ContainerFormatType.CFT_MPEG_4,
    videoBitrate: 2000000,
    videoCodec: media.CodecMimeType.VIDEO_AVC,
    videoFrameWidth: 640,
    videoFrameHeight: 480,
    videoFrameRate: 30
  },
  url: 'file:///data/storage/el2/base/files/video.mp4'
};
await avRecorder.prepare(config);
await avRecorder.start();

注意:实际开发中需处理相机状态回调、权限动态申请及异常捕获。建议参考官方文档中的相机管理完整示例。

回到顶部