HarmonyOS鸿蒙Next中怎么写app里面的相机功能
HarmonyOS鸿蒙Next中怎么写app里面的相机功能 最近在写一个app其中有一个录短视频的功能,是跟现在世面上的录视频功能差不多,但是不知道怎么写这个相机的或者是录像的功能,写完了也不知道怎么保存到自己的作品里面,求大神可以帮帮忙谢谢
关于楼主提到的两个问题:
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"}
真机演示:

配置权限和动态申请权限
// 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);
})
如有帮助楼主记得关注哦
Camera Kit(相机服务)
官方文档地址
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/camera-kit
相机实现的官方demo
有以下示例可以参考:
本示例主要展示了相机的相关功能,使用libohcamera.so 接口实现相机的预览、拍照、录像、前后置摄像头切换进行拍照、录像,以及对焦、曝光等控制类功能。
本示例展示如何使用HarmonyOS提供的相机开放能力,主要包括使用camera kit拍摄以及photoAccessHelper进行保存图片和视频。
本示例通过CameraKit自定义相机,并通过AVRecorder进行录像。帮助开发者在自定义相机的场景开发中,实现使用AVRecorder录像的功能。
4、相机数据采集
本示例主要展示了相机的相关功能接口,实现相机的预览拍照功能。帮助开发者在相机相关场景开发中,实现相机的预览、拍照、录像、变焦、对焦等功能。
直接看示例demo: https://gitee.com/harmonyos_samples/camera
在HarmonyOS Next中,相机功能主要通过CameraKit框架实现。首先在module.json5中声明相机权限。使用CameraKit的CameraManager获取相机列表,通过CameraInput创建输入流,PreviewOutput设置预览,PhotoOutput处理拍照。调用capturePhoto()方法拍照,通过ImageReceiver接收图像数据。
在HarmonyOS Next中实现相机和录像功能,主要使用@ohos.multimedia.camera和@ohos.multimedia.image等系统能力。以下是核心步骤:
-
权限申请与相机管理 在
module.json5中声明ohos.permission.CAMERA和ohos.permission.MICROPHONE权限。通过getCameraManager获取相机管理器,并调用getSupportedCameras获取设备相机列表。 -
创建相机输入流与预览流 使用
createCameraInput创建指定相机的输入流,并调用open打开。通过createPreviewOutput创建预览输出流,并绑定到XComponent组件进行画面显示。 -
实现视频录制 调用
createVideoOutput创建视频输出流,指定录制参数(如分辨率、编码格式)。使用createAVRecorder创建录制器,配置录制文件路径、视频源等参数后,调用start开始录制。 -
保存与处理视频 录制结束后,视频文件将自动保存至指定路径。你可以通过
@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();
注意:实际开发中需处理相机状态回调、权限动态申请及异常捕获。建议参考官方文档中的相机管理完整示例。


