当前位置: 首页 > news >正文

OpenHarmony Camera开发指导(四):相机会话管理(ArkTS)

概述

相机在使用预览、拍照、录像、获取元数据等功能前,都需要先创建相机会话。
相机会话Session的功能如下:

  • 配置相机的输入流和输出流。
    配置输入流即添加设备输入,通俗来讲即选择某一个摄像头进行拍照录像;配置输出流,即选择数据的输出形式,如预览、拍照。以实现拍照功能为例,输出流应配置为预览流和拍照流,预览流的数据将显示在XComponent组件上,拍照流的数据将通过ImageReceiver接口的能力保存到相册中。
  • 添加闪光灯、设置曝光模式、调整焦距等配置。
  • 会话切换控制。应用可以通过添加和删除输出流的方式,切换相机模式。如当前会话的输出流为拍照流,应用可以将拍照流移除,然后添加视频流作为输出流,即完成了拍照到录像的切换。

完成会话配置后,应用提交配置和开启会话,可以开始调用相机相关功能。

开发步骤

创建会话

调用cameraManager类中的createSession方法创建一个会话。

import { camera } from '@kit.CameraKit';
import { BusinessError } from '@kit.BasicServicesKit';function getSession(cameraManager: camera.CameraManager): camera.Session | undefined {let session: camera.Session | undefined = undefined;try {session = cameraManager.createSession(camera.SceneMode.NORMAL_PHOTO) as camera.PhotoSession;} catch (error) {let err = error as BusinessError;console.error(`Failed to create the session instance. error: ${JSON.stringify(err)}`);}return session;
}

配置会话

调用PhotoSession类中的beginConfig方法配置会话。

function beginConfig(photoSession: camera.PhotoSession): void {try {photoSession.beginConfig();} catch (error) {let err = error as BusinessError;console.error(`Failed to beginConfig. error: ${JSON.stringify(err)}`);}
}

添加输入输出流

通过addInput和addOutput向会话中添加相机的输入流和输出流。以添加预览流previewOutput和拍照流photoOutput为例,即当前模式支持预览和拍照。

async function addStream(photoSession: camera.PhotoSession, cameraInput: camera.CameraInput, previewOutput: camera.PreviewOutput, photoOutput: camera.PhotoOutput): Promise<void> {try {photoSession.addInput(cameraInput);} catch (error) {let err = error as BusinessError;console.error(`Failed to addInput. error: ${JSON.stringify(err)}`);}try {photoSession.addOutput(previewOutput);} catch (error) {let err = error as BusinessError;console.error(`Failed to add previewOutput. error: ${JSON.stringify(err)}`);}try {photoSession.addOutput(photoOutput);} catch (error) {let err = error as BusinessError;console.error(`Failed to add photoOutput. error: ${JSON.stringify(err)}`);}...
}

提交配置,启动会话

调用PhotoSession类中的commitConfig方法提交会话配置,并启动会话。

async function startSession(photoSession: camera.PhotoSession): Promise<void> {try {await photoSession.commitConfig();} catch (error) {let err = error as BusinessError;console.error(`Failed to commitConfig. error: ${JSON.stringify(err)}`);}try {await photoSession.start();} catch (error) {let err = error as BusinessError;console.error(`Failed to start. error: ${JSON.stringify(err)}`);}
}

会话切换控制

会话切换控制。调用PhotoSession类中的stop方法可以停止当前会话,调用removeOutput和addOutput方法可以完成会话切换控制。以移除拍照流photoOutput,添加视频流videoOutput为例,完成了拍照到录像的切换。

async function switchOutput(photoSession: camera.PhotoSession, videoOutput: camera.VideoOutput, photoOutput: camera.PhotoOutput): Promise<void> {try {await photoSession.stop();} catch (error) {let err = error as BusinessError;console.error(`Failed to stop. error: ${JSON.stringify(err)}`);}try {photoSession.beginConfig();} catch (error) {let err = error as BusinessError;console.error(`Failed to beginConfig. error: ${JSON.stringify(err)}`);}// 从会话中移除拍照输出流try {photoSession.removeOutput(photoOutput);} catch (error) {let err = error as BusinessError;console.error(`Failed to remove photoOutput. error: ${JSON.stringify(err)}`);}// 向会话中添加视频输出流try {photoSession.addOutput(videoOutput);} catch (error) {let err = error as BusinessError;console.error(`Failed to add videoOutput. error: ${JSON.stringify(err)}`);}
}

API参考

createSession

createSession<T extends Session>(mode: SceneMode): T

创建指定SceneMode的Session实例,同步返回结果
注:API11(4.1版本)之前统一创建CaptureSession实例操作,API 11后修改为创建Session实例,根据不同的SceneMode可派生为PhotoSession、VideoSession等。

Session

// 开始配置会话
beginConfig(): void// 提交配置信息
commitConfig(): Promise<void>// 判断当前cameraInput是否可以添加到session中。当前函数需要在beginConfig和commitConfig之间调用
canAddInput(cameraInput: CameraInput): boolean// 把CameraInput添加到会话
addInput(cameraInput: CameraInput): void// 移除CameraInput
removeInput(cameraInput: CameraInput): void// 判断当前cameraOutput是否可以添加到session中。当前函数需要在addInput和commitConfig之间调用
canAddOutput(cameraOutput: CameraOutput): boolean// 把CameraOutput添加到会话
addOutput(cameraOutput: CameraOutput): void// 从会话中移除CameraOutput
removeOutput(cameraOutput: CameraOutput): void// 开启会话
start(): Promise<void>  // 停止会话
stop(): Promise<void>//释放会话资源
release(): Promise<void>

相关文章:

  • js day2
  • 十五种光电器件综合对比——《器件手册--光电器件》
  • FastAPI与SQLAlchemy数据库集成
  • 2025.04.17【Dendrogram】生信数据可视化:Dendrogram图表详解
  • 无人机姿态稳定与动态控制模块概述!
  • 第六章:6.3求一个3*3的整型矩阵对角线元素之和
  • 基于FreeRTOS和STM32的微波炉
  • Google C++ Style Guide
  • Linux 文件传输:系统数据交互的动脉
  • 极狐GitLab 外部流水线验证功能解读
  • SpringAI+DeepSeek大模型应用开发——4 对话机器人
  • 多模态大模型的算力需求预测:从理论FLOPs到实际集群配置(搭建算力成本评估模型的方法论)
  • Linux,redis群集模式,主从复制,读写分离
  • 山东大学软件学院创新项目实训开发日志(15)之中医知识问答历史对话查看bug处理后端信息响应成功但前端未获取到
  • 在Pycharm配置stable diffusion环境(使用conda虚拟环境)
  • Python(19)Python并发编程:深入解析多线程与多进程的差异及锁机制实战
  • 1. 列表解决数列问题1
  • halcon模板匹配(七)adapt_shape_model_high_noise
  • 数据库-day06
  • FPGA阵列
  • 缺字危机:一本书背后有多少“不存在”的汉字?
  • 比特币挖矿公司GRYP股价涨超171%:将与特朗普儿子创设的公司合并
  • 英国首相斯塔默一处房产发生火灾
  • 从“求生”到“生活”:医保纳入创新药让梗阻性肥厚型心肌病患者重拾生活掌控权
  • 5年建成强化城市核心功能新引擎,上海北外滩“风景文化都是顶流”
  • 瑞士联邦主席凯勒-祖特尔、联邦副主席帕姆兰会见何立峰