相機(jī)組件支持相機(jī)業(yè)務(wù)的開(kāi)發(fā),開(kāi)發(fā)者可以通過(guò)已開(kāi)放的接口實(shí)現(xiàn)相機(jī)硬件的訪問(wèn)、操作和新功能開(kāi)發(fā),最常見(jiàn)的操作如:預(yù)覽、拍照和錄像等。
基本概念
- 拍照
此功能用于拍攝采集照片。 - 預(yù)覽
此功能用于在開(kāi)啟相機(jī)后,在緩沖區(qū)內(nèi)重復(fù)采集攝像幀,支持在拍照或錄像前進(jìn)行攝像幀預(yù)覽顯示。 - 錄像
此功能用于在開(kāi)始錄像后和結(jié)束錄像前的時(shí)間段內(nèi),在緩沖區(qū)內(nèi)重復(fù)采集攝像幀,支持視頻錄制。
圖 1 相機(jī)組件架構(gòu)圖

目錄
倉(cāng)目錄結(jié)構(gòu)如下:
/foundation/multimedia/camera_framework # 相機(jī)組件業(yè)務(wù)代碼
├── frameworks # 框架代碼
│ ├── native # 內(nèi)部接口實(shí)現(xiàn)
│ │ ├── camera # 相機(jī)框架實(shí)現(xiàn)
│ │ └── metadata # 元數(shù)據(jù)實(shí)現(xiàn)
│ └── js # 外部接口實(shí)現(xiàn)
│ └── camera_napi # 相機(jī)NAPI實(shí)現(xiàn)
├── interfaces # 接口代碼
│ ├── inner_api # 內(nèi)部接口
│ └── kits # 外部接口
├── LICENSE # 許可證文件
├── ohos.build # 構(gòu)建文件
├── sa_profile # 服務(wù)配置文件
└── services # 服務(wù)代碼
├── camera_service # 相機(jī)服務(wù)實(shí)現(xiàn)
└── etc # 相機(jī)服務(wù)配置
使用說(shuō)明
拍照
拍照的步驟:
- 創(chuàng)建緩沖區(qū)消費(fèi)者端監(jiān)聽(tīng)器(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); } } }; - 獲取相機(jī)管理器實(shí)例并獲取相機(jī)對(duì)象列表。
sptr< CameraManager > camManagerObj = CameraManager::GetInstance(); std::vector< sptr< CameraInfo >> cameraObjList = camManagerObj- >GetCameras(); - 使用相機(jī)對(duì)象創(chuàng)建相機(jī)輸入來(lái)打開(kāi)相機(jī)。
sptr< CaptureInput > cameraInput = camManagerObj- >CreateCameraInput(cameraObjList[0]); - 創(chuàng)建采集會(huì)話。
sptr< CaptureSession > captureSession = camManagerObj- >CreateCaptureSession(); - 開(kāi)始配置采集會(huì)話。
int32_t result = captureSession- >BeginConfig(); - 將相機(jī)輸入添加到采集會(huì)話。
result = captureSession- >AddInput(cameraInput); - 創(chuàng)建消費(fèi)者 Surface 并注冊(cè)監(jiān)聽(tīng)器以監(jiān)聽(tīng)緩沖區(qū)更新。拍照的寬和高可以配置為所支持的 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); - 使用上面創(chuàng)建的 Surface 創(chuàng)建拍照輸出。
sptr< CaptureOutput > photoOutput = camManagerObj- >CreatePhotoOutput(photoSurface); - 將拍照輸出添加到采集會(huì)話。
result = captureSession- >AddOutput(photoOutput); - 將配置提交到采集會(huì)話。
result = captureSession- >CommitConfig();
- 拍攝照片。
result = ((sptr PhotoOutput > &)photoOutput)- >Capture();
- 釋放采集會(huì)話資源。
captureSession- >Release();
- 釋放相機(jī)輸入關(guān)閉相機(jī)。
cameraInput- >Release();
開(kāi)始和停止預(yù)覽
開(kāi)始和停止預(yù)覽的步驟:
- 獲取相機(jī)管理器實(shí)例并獲取相機(jī)對(duì)象列表。
sptr< CameraManager > camManagerObj = CameraManager::GetInstance(); std::vector< sptr< CameraInfo >> cameraObjList = camManagerObj- >GetCameras(); - 使用相機(jī)對(duì)象創(chuàng)建相機(jī)輸入來(lái)打開(kāi)相機(jī)。
sptr< CaptureInput > cameraInput = camManagerObj- >CreateCameraInput(cameraObjList[0]); - 創(chuàng)建采集會(huì)話。
sptr< CaptureSession > captureSession = camManagerObj- >CreateCaptureSession(); - 開(kāi)始配置采集會(huì)話。
int32_t result = captureSession- >BeginConfig(); - 將相機(jī)輸入添加到采集會(huì)話。
result = captureSession- >AddInput(cameraInput); - 使用從窗口管理器獲得的 Surface 創(chuàng)建預(yù)覽輸出用以在顯示上渲染。預(yù)覽的寬和高可以配置為所支持的 640x480 或 832x480 分辨率,如果想保存到文件,可以按照拍照流程提到步驟,創(chuàng)建 Surface,注冊(cè)監(jiān)聽(tīng)器以監(jiān)聽(tīng)緩沖區(qū)更新。
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); - 將預(yù)覽輸出添加到采集會(huì)話。
result = captureSession- >AddOutput(previewOutput); - 將配置提交到采集會(huì)話。
result = captureSession- >CommitConfig(); - 開(kāi)始預(yù)覽。
result = captureSession- >Start(); - 需要時(shí)停止預(yù)覽。
result = captureSession- >Stop();
- 釋放采集會(huì)話資源。
captureSession- >Release();
- 釋放相機(jī)輸入關(guān)閉相機(jī)。
cameraInput- >Release();
視頻錄像
視頻錄像的步驟:
- 獲取相機(jī)管理器實(shí)例并獲取相機(jī)對(duì)象列表。
sptr< CameraManager > camManagerObj = CameraManager::GetInstance(); std::vector< sptr< CameraInfo >> cameraObjList = camManagerObj- >GetCameras(); - 使用相機(jī)對(duì)象創(chuàng)建相機(jī)輸入來(lái)打開(kāi)相機(jī)。
sptr< CaptureInput > cameraInput = camManagerObj- >CreateCameraInput(cameraObjList[0]); - 創(chuàng)建采集會(huì)話。
sptr< CaptureSession > captureSession = camManagerObj- >CreateCaptureSession(); - 開(kāi)始配置采集會(huì)話。
int32_t result = captureSession- >BeginConfig(); - 將相機(jī)輸入添加到采集會(huì)話。
result = captureSession- >AddInput(cameraInput); - 通過(guò) Surface 創(chuàng)建一個(gè)視頻輸出,來(lái)與音頻合成并保存到文件,Surface 通過(guò) Recoder 獲取。如果想僅保存視頻緩沖數(shù)據(jù)到文件里,可以按照拍照流程提到步驟,創(chuàng)建 Surface,注冊(cè)監(jiān)聽(tīng)器以監(jiān)聽(tīng)緩沖區(qū)更新。錄像的分辨率可以在錄制器內(nèi)配置為所支持的 1280x720 或 640x360 分辨率。
videoSurface- >SetUserData(CameraManager::surfaceFormat, std::to_string(OHOS_CAMERA_FORMAT_YCRCB_420_SP)); sptr< CaptureOutput > videoOutput = camManagerObj- >CreateVideoOutput(videoSurface); - 將視頻輸出添加到采集會(huì)話。
result = captureSession- >AddOutput(videoOutput); - 將配置提交到采集會(huì)話。
result = captureSession- >CommitConfig(); - 開(kāi)始視頻錄制。
result = ((sptr VideoOutput > &)videoOutput)- >Start(); - 需要時(shí)停止錄制。
result = ((sptr VideoOutput > &)videoOutput)- >Stop();
- 釋放采集會(huì)話的資源。
captureSession- >Release();
- 釋放相機(jī)輸入關(guān)閉相機(jī)。
cameraInput- >Release();
切換多個(gè)照相機(jī)設(shè)備
以下演示如何切換多個(gè)照相機(jī)設(shè)備。最初在采集會(huì)話中有一個(gè)視頻輸出(video output)。如果用戶想要切換其他 照相機(jī),現(xiàn)存的相機(jī)輸入和輸出需要先移除并加入新的相機(jī)輸入和輸出(示例中使用的是photo output)。
- 獲取相機(jī)管理器實(shí)例并獲取相機(jī)對(duì)象列表。
sptr< CameraManager > camManagerObj = CameraManager::GetInstance(); std::vector< sptr< CameraInfo >> cameraObjList = camManagerObj- >GetCameras(); - 使用相機(jī)對(duì)象創(chuàng)建相機(jī)輸入來(lái)打開(kāi)相機(jī)。
sptr< CaptureInput > cameraInput = camManagerObj- >CreateCameraInput(cameraObjList[0]); - 創(chuàng)建采集會(huì)話。
sptr< CaptureSession > captureSession = camManagerObj- >CreateCaptureSession(); - 開(kāi)始配置采集會(huì)話。
int32_t result = captureSession- >BeginConfig() - 將相機(jī)輸入添加到采集會(huì)話。
result = captureSession- >AddInput(cameraInput); - 通過(guò)Surface創(chuàng)建一個(gè)視頻輸出。
sptr< CaptureOutput > videoOutput = camManagerObj- >CreateVideoOutput(videoSurface); - 將視頻輸出添加到采集會(huì)話。
result = captureSession- >AddOutput(videoOutput); - 將配置提交到采集會(huì)話。
result = captureSession- >CommitConfig(); - 開(kāi)始錄制視頻。
result = ((sptr VideoOutput > &)videoOutput)- >Start(); - 需要時(shí)停止錄制。
result = ((sptr VideoOutput > &)videoOutput)- >Stop();
- 重新配置會(huì)話并移除相機(jī)輸入和輸出。
int32_t result = captureSession- >BeginConfig();
- 在新的會(huì)話配置中移除相機(jī)輸入。
int32_t result = captureSession- >RemoveInput(cameraInput);
- 同樣移除相機(jī)輸出。
int32_t result = captureSession- >RemoveOutut(videoOutput);
- 創(chuàng)建新的相機(jī)輸入,并把它添加到采集會(huì)話。
sptr< CaptureInput > cameraInput2 = camManagerObj- >CreateCameraInput(cameraObjList[1]);
result = captureSession- >AddInput(cameraInput2);
- 創(chuàng)建拍照輸出,成功創(chuàng)建后將拍照輸出添加到采集會(huì)話。創(chuàng)建消費(fèi)者 Surface 并注冊(cè)監(jiān)聽(tīng)器以監(jiān)聽(tīng)新的拍照輸出緩沖區(qū)更新。這個(gè) Surface 用于新創(chuàng)建的拍照輸出。
// 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);
- 將配置提交到采集會(huì)話。
result = captureSession- >CommitConfig();
- 釋放被移出會(huì)話的相機(jī)輸入。
cameraInput- >Release();
- 拍攝照片。
result = ((sptr PhotoOutput > &)photoOutput)- >Capture();
- 釋放采集會(huì)話資源。
captureSession- >Release();
- 釋放相機(jī)輸入關(guān)閉相機(jī)。
cameraInput2- >Release();
設(shè)置閃光燈
拍照和錄像前可以在相機(jī)輸入里設(shè)置閃光燈。
在照相中設(shè)置閃光燈。
cameraInput- >LockForControl(); cameraInput- >SetFlashMode(OHOS_CAMERA_FLASH_MODE_OPEN); cameraInput- >UnlockForControl();在錄像中設(shè)置閃光燈。
cameraInput- >LockForControl(); cameraInput- >SetFlashMode(OHOS_CAMERA_FLASH_MODE_ALWAYS_OPEN); cameraInput- >UnlockForControl();關(guān)閉閃光燈。
cameraInput- >LockForControl(); cameraInput- >SetFlashMode(OHOS_CAMERA_FLASH_MODE_CLOSE); cameraInput- >UnlockForControl();

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
Camera
+關(guān)注
關(guān)注
1文章
85瀏覽量
22329 -
鴻蒙
+關(guān)注
關(guān)注
60文章
3031瀏覽量
46194
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
熱點(diǎn)推薦
M4-R1 開(kāi)源鴻蒙(OpenHarmory)開(kāi)發(fā)板丨串口調(diào)試助手實(shí)戰(zhàn)案例
支持與高集成度設(shè)計(jì),成為開(kāi)發(fā)者體驗(yàn)與學(xué)習(xí)鴻蒙系統(tǒng)的理想平臺(tái)。無(wú)論是智慧家居、教學(xué)實(shí)驗(yàn),還是設(shè)備通信,M4-R1都能提供穩(wěn)定可靠的開(kāi)發(fā)環(huán)境。本次分享的實(shí)戰(zhàn)案例——串口
【HarmonyOS 5】鴻蒙頁(yè)面和組件生命周期函數(shù)
【HarmonyOS 5】鴻蒙頁(yè)面和組件生命周期函數(shù) ##鴻蒙開(kāi)發(fā)能力 ##HarmonyOS SDK應(yīng)用服務(wù)##鴻蒙金融類應(yīng)用 (金融理財(cái)
【HarmonyOS 5】金融應(yīng)用開(kāi)發(fā)鴻蒙組件實(shí)踐
【HarmonyOS 5】金融應(yīng)用開(kāi)發(fā)鴻蒙組件實(shí)踐 ##鴻蒙開(kāi)發(fā)能力 ##HarmonyOS SDK應(yīng)用服務(wù)##
鴻蒙5開(kāi)發(fā)寶藏案例分享---一多開(kāi)發(fā)實(shí)例(音樂(lè))
各位開(kāi)發(fā)者小伙伴們好呀!今天咱們來(lái)點(diǎn)硬核干貨!最近在鴻蒙文檔中心挖到一座“金礦”——官方竟然暗藏了100+實(shí)戰(zhàn)案例,從分布式架構(gòu)到交互動(dòng)效優(yōu)化應(yīng)有盡有!這些案例不僅藏著華為工程師的私房技巧,還直接
鴻蒙5開(kāi)發(fā)寶藏案例分享---Swiper組件性能優(yōu)化實(shí)戰(zhàn)
鴻蒙寶藏:Swiper組件性能優(yōu)化實(shí)戰(zhàn),告別卡頓丟幀!
大家好!最近在鴻蒙開(kāi)發(fā)時(shí),偶然發(fā)現(xiàn)了官方文檔里埋藏的 性能優(yōu)化寶藏案例 ,尤其是&l
發(fā)表于 06-12 17:53
鴻蒙5開(kāi)發(fā)寶藏案例分享---瀑布流優(yōu)化實(shí)戰(zhàn)分享
鴻蒙瀑布流性能優(yōu)化實(shí)戰(zhàn):告別卡頓的寶藏指南!
大家好!最近在鴻蒙文檔里挖到一個(gè) 性能優(yōu)化寶藏庫(kù) ,原來(lái)官方早就準(zhǔn)備好了各種場(chǎng)景的最佳實(shí)踐!今天重點(diǎn)分享「瀑布流加載慢丟幀」的解決方案,附完整代碼解析
發(fā)表于 06-12 17:41
鴻蒙5開(kāi)發(fā)寶藏案例分享---Web加載時(shí)延優(yōu)化解析
鴻蒙開(kāi)發(fā)寶藏:Web加載完成時(shí)延優(yōu)化實(shí)戰(zhàn)
大家好呀!今天在翻鴻蒙開(kāi)發(fā)者文檔時(shí),發(fā)現(xiàn)了一個(gè)隱藏的 性能優(yōu)化寶藏區(qū) ——官方竟然悄悄提供了超多
發(fā)表于 06-12 17:11
鴻蒙5開(kāi)發(fā)寶藏案例分享---性能優(yōu)化案例解析
鴻蒙性能優(yōu)化寶藏指南:實(shí)戰(zhàn)工具與代碼案例解析
大家好呀!今天在翻鴻蒙開(kāi)發(fā)者文檔時(shí),意外挖到一個(gè) 性能優(yōu)化寶藏庫(kù) ——原來(lái)官方早就提供了超多實(shí)用工具和案例,但很多小伙伴可能沒(méi)發(fā)現(xiàn)!這篇就
發(fā)表于 06-12 16:36
鴻蒙5開(kāi)發(fā)寶藏案例分享---埋點(diǎn)開(kāi)發(fā)實(shí)戰(zhàn)指南
鴻蒙埋點(diǎn)開(kāi)發(fā)寶藏指南:官方案例實(shí)戰(zhàn)解析,輕松搞定數(shù)據(jù)追蹤!
大家好呀!我是HarmonyOS開(kāi)發(fā)路上的探索者。最近在折騰應(yīng)用埋點(diǎn)時(shí),意外發(fā)現(xiàn)了鴻蒙
發(fā)表于 06-12 16:30
鴻蒙5開(kāi)發(fā)寶藏案例分享---切面編程實(shí)戰(zhàn)揭秘
鴻蒙切面編程(AOP)實(shí)戰(zhàn)指南:隱藏的寶藏功能大揭秘!
大家好!今天在翻鴻蒙開(kāi)發(fā)者文檔時(shí),意外發(fā)現(xiàn)了官方埋藏的「切面編程」寶藏案例!實(shí)際開(kāi)發(fā)
發(fā)表于 06-12 16:21
鴻蒙5開(kāi)發(fā)寶藏案例分享---應(yīng)用架構(gòu)實(shí)戰(zhàn)技巧
大家好! 今天咱們聊聊鴻蒙開(kāi)發(fā)中那些“官方文檔提了但實(shí)際開(kāi)發(fā)難找”的架構(gòu)設(shè)計(jì)技巧。結(jié)合官方文檔,我會(huì)用 真實(shí)代碼案例+通俗講解 ,幫你把分層架構(gòu)和線程通信落地到項(xiàng)目里,告別“理論會(huì)了,代碼不會(huì)
發(fā)表于 06-12 16:14
鴻蒙5開(kāi)發(fā)寶藏案例分享---Pura X開(kāi)發(fā)案例分享
爆發(fā),現(xiàn)在吃透這些技術(shù),你就是明年漲薪最靚的仔! **?
(原創(chuàng)整理不易,如果覺(jué)得有用,點(diǎn)個(gè)贊讓我知道吧~ 下期分享\"鴻蒙分布式相機(jī)開(kāi)發(fā)\"實(shí)戰(zhàn)!)
發(fā)表于 06-12 11:47
HarmonyOS實(shí)戰(zhàn):組件化項(xiàng)目搭建
前言 鴻蒙應(yīng)用開(kāi)發(fā)已經(jīng)成為互聯(lián)網(wǎng)新的風(fēng)口,開(kāi)發(fā)鴻蒙軟件已經(jīng)成為今年工作的核心目標(biāo)。在軟件開(kāi)發(fā)過(guò)程中,對(duì)于復(fù)雜度較大,功能較多的軟件都會(huì)采用
鴻蒙5開(kāi)發(fā)寶藏案例分享---折疊屏懸停態(tài)開(kāi)發(fā)實(shí)踐
?【鴻蒙折疊屏開(kāi)發(fā)寶藏指南】原來(lái)官方藏了這么多好東西!手把手教你玩轉(zhuǎn)懸停態(tài)開(kāi)發(fā)**?**
Hey小伙伴們!我是你們的老朋友XX,最近在肝鴻蒙折疊屏項(xiàng)目時(shí),意外挖到了官方文檔里的隱藏寶藏
發(fā)表于 06-03 12:04
鴻蒙5開(kāi)發(fā)寶藏案例分享---一多分欄開(kāi)發(fā)實(shí)踐
?【HarmonyOS開(kāi)發(fā)者的寶藏指南】一次搞定多設(shè)備分欄布局,原來(lái)還能這么玩!
大家好呀!今天在鴻蒙社區(qū)挖到一個(gè)超實(shí)用的大寶藏——原來(lái)官方早就藏了一堆分欄布局的實(shí)戰(zhàn)案例!作為被多端適配折磨
發(fā)表于 06-03 12:03
鴻蒙實(shí)戰(zhàn)開(kāi)發(fā)Camera組件:【相機(jī)】
評(píng)論