相機組件支持相機業務的開發,開發者可以通過已開放的接口實現相機硬件的訪問、操作和新功能開發,最常見的操作如:預覽、拍照和錄像等。
基本概念
- 拍照
此功能用于拍攝采集照片。 - 預覽
此功能用于在開啟相機后,在緩沖區內重復采集攝像幀,支持在拍照或錄像前進行攝像幀預覽顯示。 - 錄像
此功能用于在開始錄像后和結束錄像前的時間段內,在緩沖區內重復采集攝像幀,支持視頻錄制。
圖 1 相機組件架構圖
目錄
倉目錄結構如下:
/foundation/multimedia/camera_framework # 相機組件業務代碼
├── frameworks # 框架代碼
│ ├── native # 內部接口實現
│ │ ├── camera # 相機框架實現
│ │ └── metadata # 元數據實現
│ └── js # 外部接口實現
│ └── camera_napi # 相機NAPI實現
├── interfaces # 接口代碼
│ ├── inner_api # 內部接口
│ └── kits # 外部接口
├── LICENSE # 許可證文件
├── ohos.build # 構建文件
├── sa_profile # 服務配置文件
└── services # 服務代碼
├── camera_service # 相機服務實現
└── etc # 相機服務配置
使用說明
拍照
拍照的步驟:
- 創建緩沖區消費者端監聽器(CaptureSurfaceListener)以保存圖像。
class CaptureSurfaceListener : public IBufferConsumerListener { public: int32_t mode_; sptr< Surface > surface_; void OnBufferAvailable() override { int32_t flushFence = 0; int64_t timestamp = 0; OHOS::Rect damage; // initialize the damage OHOS::sptr< OHOS::SurfaceBuffer > buffer = nullptr; surface_- >AcquireBuffer(buffer, flushFence, timestamp, damage); if (buffer != nullptr) { void* addr = buffer- >GetVirAddr(); int32_t size = buffer- >GetSize(); // Save the buffer(addr) to a file. surface_- >ReleaseBuffer(buffer, -1); } } };
- 獲取相機管理器實例并獲取相機對象列表。
sptr< CameraManager > camManagerObj = CameraManager::GetInstance(); std::vector< sptr< CameraInfo >> cameraObjList = camManagerObj- >GetCameras();
- 使用相機對象創建相機輸入來打開相機。
sptr< CaptureInput > cameraInput = camManagerObj- >CreateCameraInput(cameraObjList[0]);
- 創建采集會話。
sptr< CaptureSession > captureSession = camManagerObj- >CreateCaptureSession();
- 開始配置采集會話。
int32_t result = captureSession- >BeginConfig();
- 將相機輸入添加到采集會話。
result = captureSession- >AddInput(cameraInput);
- 創建消費者 Surface 并注冊監聽器以監聽緩沖區更新。拍照的寬和高可以配置為所支持的 1280x960 分辨率。
sptr< Surface > photoSurface = Surface::CreateSurfaceAsConsumer(); int32_t photoWidth = 1280; int32_t photoHeight = 960; photoSurface- >SetDefaultWidthAndHeight(photoWidth, photoHeight); photoSurface- >SetUserData(CameraManager::surfaceFormat, std::to_string(OHOS_CAMERA_FORMAT_JPEG)); sptr< CaptureSurfaceListener > capturelistener = new(std::nothrow) CaptureSurfaceListener(); capturelistener- >mode_ = MODE_PHOTO; capturelistener- >surface_ = photoSurface; photoSurface- >RegisterConsumerListener((sptr< IBufferConsumerListener > &)capturelistener);
- 使用上面創建的 Surface 創建拍照輸出。
sptr< CaptureOutput > photoOutput = camManagerObj- >CreatePhotoOutput(photoSurface);
- 將拍照輸出添加到采集會話。
result = captureSession- >AddOutput(photoOutput);
- 將配置提交到采集會話。
result = captureSession- >CommitConfig();
- 拍攝照片。
result = ((sptr PhotoOutput > &)photoOutput)- >Capture();
- 釋放采集會話資源。
captureSession- >Release();
- 釋放相機輸入關閉相機。
cameraInput- >Release();
開始和停止預覽
開始和停止預覽的步驟:
- 獲取相機管理器實例并獲取相機對象列表。
sptr< CameraManager > camManagerObj = CameraManager::GetInstance(); std::vector< sptr< CameraInfo >> cameraObjList = camManagerObj- >GetCameras();
- 使用相機對象創建相機輸入來打開相機。
sptr< CaptureInput > cameraInput = camManagerObj- >CreateCameraInput(cameraObjList[0]);
- 創建采集會話。
sptr< CaptureSession > captureSession = camManagerObj- >CreateCaptureSession();
- 開始配置采集會話。
int32_t result = captureSession- >BeginConfig();
- 將相機輸入添加到采集會話。
result = captureSession- >AddInput(cameraInput);
- 使用從窗口管理器獲得的 Surface 創建預覽輸出用以在顯示上渲染。預覽的寬和高可以配置為所支持的 640x480 或 832x480 分辨率,如果想保存到文件,可以按照拍照流程提到步驟,創建 Surface,注冊監聽器以監聽緩沖區更新。
int32_t previewWidth = 640; int32_t previewHeight = 480; previewSurface- >SetUserData(CameraManager::surfaceFormat, std::to_string(OHOS_CAMERA_FORMAT_YCRCB_420_SP)); sptr< CaptureOutput > previewOutput = camManagerObj- >CreateCustomPreviewOutput(previewSurface, previewWidth, previewHeight);
- 將預覽輸出添加到采集會話。
result = captureSession- >AddOutput(previewOutput);
- 將配置提交到采集會話。
result = captureSession- >CommitConfig();
- 開始預覽。
result = captureSession- >Start();
- 需要時停止預覽。
result = captureSession- >Stop();
- 釋放采集會話資源。
captureSession- >Release();
- 釋放相機輸入關閉相機。
cameraInput- >Release();
視頻錄像
視頻錄像的步驟:
- 獲取相機管理器實例并獲取相機對象列表。
sptr< CameraManager > camManagerObj = CameraManager::GetInstance(); std::vector< sptr< CameraInfo >> cameraObjList = camManagerObj- >GetCameras();
- 使用相機對象創建相機輸入來打開相機。
sptr< CaptureInput > cameraInput = camManagerObj- >CreateCameraInput(cameraObjList[0]);
- 創建采集會話。
sptr< CaptureSession > captureSession = camManagerObj- >CreateCaptureSession();
- 開始配置采集會話。
int32_t result = captureSession- >BeginConfig();
- 將相機輸入添加到采集會話。
result = captureSession- >AddInput(cameraInput);
- 通過 Surface 創建一個視頻輸出,來與音頻合成并保存到文件,Surface 通過 Recoder 獲取。如果想僅保存視頻緩沖數據到文件里,可以按照拍照流程提到步驟,創建 Surface,注冊監聽器以監聽緩沖區更新。錄像的分辨率可以在錄制器內配置為所支持的 1280x720 或 640x360 分辨率。
videoSurface- >SetUserData(CameraManager::surfaceFormat, std::to_string(OHOS_CAMERA_FORMAT_YCRCB_420_SP)); sptr< CaptureOutput > videoOutput = camManagerObj- >CreateVideoOutput(videoSurface);
- 將視頻輸出添加到采集會話。
result = captureSession- >AddOutput(videoOutput);
- 將配置提交到采集會話。
result = captureSession- >CommitConfig();
- 開始視頻錄制。
result = ((sptr VideoOutput > &)videoOutput)- >Start();
- 需要時停止錄制。
result = ((sptr VideoOutput > &)videoOutput)- >Stop();
- 釋放采集會話的資源。
captureSession- >Release();
- 釋放相機輸入關閉相機。
cameraInput- >Release();
切換多個照相機設備
以下演示如何切換多個照相機設備。最初在采集會話中有一個視頻輸出(video output)。如果用戶想要切換其他 照相機,現存的相機輸入和輸出需要先移除并加入新的相機輸入和輸出(示例中使用的是photo output)。
- 獲取相機管理器實例并獲取相機對象列表。
sptr< CameraManager > camManagerObj = CameraManager::GetInstance(); std::vector< sptr< CameraInfo >> cameraObjList = camManagerObj- >GetCameras();
- 使用相機對象創建相機輸入來打開相機。
sptr< CaptureInput > cameraInput = camManagerObj- >CreateCameraInput(cameraObjList[0]);
- 創建采集會話。
sptr< CaptureSession > captureSession = camManagerObj- >CreateCaptureSession();
- 開始配置采集會話。
int32_t result = captureSession- >BeginConfig()
- 將相機輸入添加到采集會話。
result = captureSession- >AddInput(cameraInput);
- 通過Surface創建一個視頻輸出。
sptr< CaptureOutput > videoOutput = camManagerObj- >CreateVideoOutput(videoSurface);
- 將視頻輸出添加到采集會話。
result = captureSession- >AddOutput(videoOutput);
- 將配置提交到采集會話。
result = captureSession- >CommitConfig();
- 開始錄制視頻。
result = ((sptr VideoOutput > &)videoOutput)- >Start();
- 需要時停止錄制。
result = ((sptr VideoOutput > &)videoOutput)- >Stop();
- 重新配置會話并移除相機輸入和輸出。
int32_t result = captureSession- >BeginConfig();
- 在新的會話配置中移除相機輸入。
int32_t result = captureSession- >RemoveInput(cameraInput);
- 同樣移除相機輸出。
int32_t result = captureSession- >RemoveOutut(videoOutput);
- 創建新的相機輸入,并把它添加到采集會話。
sptr< CaptureInput > cameraInput2 = camManagerObj- >CreateCameraInput(cameraObjList[1]);
result = captureSession- >AddInput(cameraInput2);
- 創建拍照輸出,成功創建后將拍照輸出添加到采集會話。創建消費者 Surface 并注冊監聽器以監聽新的拍照輸出緩沖區更新。這個 Surface 用于新創建的拍照輸出。
// Get the surface
sptr< Surface > photoSurface = Surface::CreateSurfaceAsConsumer();
int32_t photoWidth = 1280;
int32_t photoHeight = 960;
photoSurface- >SetDefaultWidthAndHeight(photoWidth, photoHeight);
photoSurface- >SetUserData(CameraManager::surfaceFormat, std::to_string(OHOS_CAMERA_FORMAT_JPEG));
sptr< CaptureSurfaceListener > capturelistener = new(std::nothrow) CaptureSurfaceListener();
capturelistener- >mode_ = MODE_PHOTO;
capturelistener- >surface_ = photoSurface;
photoSurface- >RegisterConsumerListener((sptr< IBufferConsumerListener > &)capturelistener);
// Create the Photo Output
sptr< CaptureOutput > photoOutput = camManagerObj- >CreatePhotoOutput(photoSurface);
// Add the output to the capture session
result = captureSession- >AddOutput(photoOutput);
- 將配置提交到采集會話。
result = captureSession- >CommitConfig();
- 釋放被移出會話的相機輸入。
cameraInput- >Release();
- 拍攝照片。
result = ((sptr PhotoOutput > &)photoOutput)- >Capture();
- 釋放采集會話資源。
captureSession- >Release();
- 釋放相機輸入關閉相機。
cameraInput2- >Release();
設置閃光燈
拍照和錄像前可以在相機輸入里設置閃光燈。
在照相中設置閃光燈。
cameraInput- >LockForControl(); cameraInput- >SetFlashMode(OHOS_CAMERA_FLASH_MODE_OPEN); cameraInput- >UnlockForControl();
在錄像中設置閃光燈。
cameraInput- >LockForControl(); cameraInput- >SetFlashMode(OHOS_CAMERA_FLASH_MODE_ALWAYS_OPEN); cameraInput- >UnlockForControl();
關閉閃光燈。
cameraInput- >LockForControl(); cameraInput- >SetFlashMode(OHOS_CAMERA_FLASH_MODE_CLOSE); cameraInput- >UnlockForControl();
鴻蒙OpenHarmony知識已更新←前往
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
Camera
+關注
關注
0文章
79瀏覽量
21321 -
鴻蒙
+關注
關注
59文章
2491瀏覽量
43714
發布評論請先 登錄
相關推薦
熱點推薦
開源啦!!!基于鴻蒙ArkTS封裝的圖表組件《McCharts》,大家快來一起共創
的地方請大家高抬貴手,寬容一下,謝謝。
這次主要是給大家帶來一個重磅消息,就是我自己使用鴻蒙ArkTS語法開發的圖表組件今日正式開源了。為什么?原因有兩點吧!
鴻蒙是國產的操作系統,
發表于 03-15 15:21
【「極速探索HarmonyOS NEXT 」閱讀體驗】 初印象:一本純血鴻蒙應用開發入門的好書
實戰,就純血鴻蒙的整個技術鏈條進行了簡單細致的介紹。
書中先介紹了鴻蒙整體的概念,然后介紹了開發工具DevEco Studio的下載安裝和使用以及軟件布局,以及如何使用它創建基本工程、
發表于 03-04 12:41
名單公布!【書籍評測活動NO.56】極速探索HarmonyOS NEXT:純血鴻蒙應用開發實踐
開發的核心技術,以及鴻蒙應用在實際開發中的應用方法。
本書共分為四篇,共計16章,分別為鴻蒙開發基礎篇、
發表于 01-20 16:53
鴻蒙Flutter實戰:14-現有Flutter 項目支持鴻蒙 II
分別安裝官方的3.22版本,以及鴻蒙社區的 3.22.0 版本
3.搭建 Flutter鴻蒙開發環境
參考文章《鴻蒙Flutter實戰:0
發表于 12-26 14:59
鴻蒙原生開發手記:03-元服務開發全流程(開發元服務,只需要看這一篇文章)
廣告
服務相伴履約提醒服務閉環
用完即走退出無彈窗服務隨賬號同步
原生智能小藝智能精準觸達全域搜索系統搜索框
高效開發UX 組件集、場景化模板等
創建元服務
創建項目
1.打開 DevEco
發表于 11-23 21:52
鴻蒙原生開發手記:01-元服務開發
簡介
元服務是鴻蒙中的一種輕量應用形態,無需下載,直接運行。類似于微信小程序,但與小程序不同的是,元服務更加輕量。
元服務使用原生開發,是系統級提供的,無論從易用性、性能、體驗上,都要比小程序好
發表于 11-14 17:28
鴻蒙Flutter實戰:11-使用 Flutter SDK 3.22.0
# 使用 Flutter SDK 3.22.0
## SDK 安裝
參考[鴻蒙Flutter實戰:01-搭建開發環境]文章的說明,首先安裝 Flutter SDK 3.22.0。
目前鴻
發表于 11-01 15:03
鴻蒙Flutter實戰:09-現有Flutter項目支持鴻蒙
# 鴻蒙Flutter實戰:現有Flutter項目支持鴻蒙
## 背景
原來使用Flutter開發的項目,需要適配鴻蒙。
## 環境搭
發表于 10-23 16:36
鴻蒙Flutter實戰:08-如何調試代碼
# 鴻蒙Flutter實戰:如何調試代碼
## 1.環境搭建
參考文章[鴻蒙Flutter實戰:01-搭建開發環境](https://g
發表于 10-23 16:29
鴻蒙Flutter實戰:07混合開發
# 鴻蒙Flutter實戰:混合開發
鴻蒙Flutter混合開發主要有兩種形式。
## 1.基于har
將flutter module
發表于 10-23 16:00
鴻蒙Flutter實戰:05-使用第三方插件
# 鴻蒙Flutter 實戰:使用第三方插件
在鴻蒙Flutter開發中,如果涉及到使用原生功能,就要使用插件。使用插件有兩種方式,一種是自己編寫原生ArkTS代碼,在Dart側調用
發表于 10-22 21:54
鴻蒙Flutter實戰:01-搭建開發環境
:
備注:鴻蒙Flutter
wx:zacksleo
參考資料
Flutter中文文檔
Harmonyos Next 開發文檔
發表于 10-21 19:35
51camera 2024產品型錄-工業相機、工業鏡頭、光源
51camera 2024產品型錄涵蓋了工業相機、工業鏡頭、光源、采集卡、工控機、線纜等視覺器件產品型號。
發表于 10-18 16:31
?0次下載
鴻蒙原生應用元服務開發-鴻蒙真機運行項目實戰與注意事項
一、解壓項目注意項目包不能為中文
二、用數據線將裝好DevEco Studio的電腦與設置為開發者模式的鴻蒙手機相連接。
三、將項目包托進DevEco Studio 中 注意項目包文件不能有嵌套
四
發表于 05-24 15:12
評論