色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鴻蒙實戰開發Camera組件:【相機】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-03-08 16:20 ? 次閱讀

相機組件支持相機業務的開發,開發者可以通過已開放的接口實現相機硬件的訪問、操作和新功能開發,最常見的操作如:預覽、拍照和錄像等。

基本概念

  • 拍照
    此功能用于拍攝采集照片。
  • 預覽
    此功能用于在開啟相機后,在緩沖區內重復采集攝像幀,支持在拍照或錄像前進行攝像幀預覽顯示。
  • 錄像
    此功能用于在開始錄像后和結束錄像前的時間段內,在緩沖區內重復采集攝像幀,支持視頻錄制。

圖 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                              # 相機服務配置

使用說明

拍照

拍照的步驟:

  1. 創建緩沖區消費者端監聽器(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);
            }
        }
    };
    
  2. 獲取相機管理器實例并獲取相機對象列表。
    sptr< CameraManager > camManagerObj = CameraManager::GetInstance();
    std::vector< sptr< CameraInfo >> cameraObjList = camManagerObj- >GetCameras();
    
  3. 使用相機對象創建相機輸入來打開相機。
    sptr< CaptureInput > cameraInput = camManagerObj- >CreateCameraInput(cameraObjList[0]);
    
  4. 創建采集會話。
    sptr< CaptureSession > captureSession = camManagerObj- >CreateCaptureSession();
    
  5. 開始配置采集會話。
    int32_t result = captureSession- >BeginConfig();
    
  6. 將相機輸入添加到采集會話。
    result = captureSession- >AddInput(cameraInput);
    
  7. 創建消費者 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);
    
  8. 使用上面創建的 Surface 創建拍照輸出。
    sptr< CaptureOutput > photoOutput = camManagerObj- >CreatePhotoOutput(photoSurface);
    
  9. 將拍照輸出添加到采集會話。
    result = captureSession- >AddOutput(photoOutput);
    
  10. 將配置提交到采集會話。
result = captureSession- >CommitConfig();
  1. 拍攝照片。
result = ((sptr PhotoOutput > &)photoOutput)- >Capture();
  1. 釋放采集會話資源。
captureSession- >Release();
  1. 釋放相機輸入關閉相機。
cameraInput- >Release();

開始和停止預覽

開始和停止預覽的步驟:

  1. 獲取相機管理器實例并獲取相機對象列表。
    sptr< CameraManager > camManagerObj = CameraManager::GetInstance();
    std::vector< sptr< CameraInfo >> cameraObjList = camManagerObj- >GetCameras();
    
  2. 使用相機對象創建相機輸入來打開相機。
    sptr< CaptureInput > cameraInput = camManagerObj- >CreateCameraInput(cameraObjList[0]);
    
  3. 創建采集會話。
    sptr< CaptureSession > captureSession = camManagerObj- >CreateCaptureSession();
    
  4. 開始配置采集會話。
    int32_t result = captureSession- >BeginConfig();
    
  5. 將相機輸入添加到采集會話。
    result = captureSession- >AddInput(cameraInput);
    
  6. 使用從窗口管理器獲得的 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);
    
  7. 將預覽輸出添加到采集會話。
    result = captureSession- >AddOutput(previewOutput);
    
  8. 將配置提交到采集會話。
    result = captureSession- >CommitConfig();
    
  9. 開始預覽。
    result = captureSession- >Start();
    
  10. 需要時停止預覽。
result = captureSession- >Stop();
  1. 釋放采集會話資源。
captureSession- >Release();
  1. 釋放相機輸入關閉相機。
cameraInput- >Release();

視頻錄像

視頻錄像的步驟:

  1. 獲取相機管理器實例并獲取相機對象列表。
    sptr< CameraManager > camManagerObj = CameraManager::GetInstance();
    std::vector< sptr< CameraInfo >> cameraObjList = camManagerObj- >GetCameras();
    
  2. 使用相機對象創建相機輸入來打開相機。
    sptr< CaptureInput > cameraInput = camManagerObj- >CreateCameraInput(cameraObjList[0]);
    
  3. 創建采集會話。
    sptr< CaptureSession > captureSession = camManagerObj- >CreateCaptureSession();
    
  4. 開始配置采集會話。
    int32_t result = captureSession- >BeginConfig();
    
  5. 將相機輸入添加到采集會話。
    result = captureSession- >AddInput(cameraInput);
    
  6. 通過 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);
    
  7. 將視頻輸出添加到采集會話。
    result = captureSession- >AddOutput(videoOutput);
    
  8. 將配置提交到采集會話。
    result = captureSession- >CommitConfig();
    
  9. 開始視頻錄制。
    result = ((sptr VideoOutput > &)videoOutput)- >Start();
    
  10. 需要時停止錄制。
result = ((sptr VideoOutput > &)videoOutput)- >Stop();
  1. 釋放采集會話的資源。
captureSession- >Release();
  1. 釋放相機輸入關閉相機。
cameraInput- >Release();

切換多個照相機設備

以下演示如何切換多個照相機設備。最初在采集會話中有一個視頻輸出(video output)。如果用戶想要切換其他 照相機,現存的相機輸入和輸出需要先移除并加入新的相機輸入和輸出(示例中使用的是photo output)。

  1. 獲取相機管理器實例并獲取相機對象列表。
    sptr< CameraManager > camManagerObj = CameraManager::GetInstance();
    std::vector< sptr< CameraInfo >> cameraObjList = camManagerObj- >GetCameras();
    
  2. 使用相機對象創建相機輸入來打開相機。
    sptr< CaptureInput > cameraInput = camManagerObj- >CreateCameraInput(cameraObjList[0]);
    
  3. 創建采集會話。
    sptr< CaptureSession > captureSession = camManagerObj- >CreateCaptureSession();
    
  4. 開始配置采集會話。
    int32_t result = captureSession- >BeginConfig()
    
  5. 將相機輸入添加到采集會話。
    result = captureSession- >AddInput(cameraInput);
    
  6. 通過Surface創建一個視頻輸出。
    sptr< CaptureOutput > videoOutput = camManagerObj- >CreateVideoOutput(videoSurface);
    
  7. 將視頻輸出添加到采集會話。
    result = captureSession- >AddOutput(videoOutput);
    
  8. 將配置提交到采集會話。
    result = captureSession- >CommitConfig();
    
  9. 開始錄制視頻。
    result = ((sptr VideoOutput > &)videoOutput)- >Start();
    
  10. 需要時停止錄制。
result = ((sptr VideoOutput > &)videoOutput)- >Stop();
  1. 重新配置會話并移除相機輸入和輸出。
int32_t result = captureSession- >BeginConfig();
  1. 在新的會話配置中移除相機輸入。
int32_t result = captureSession- >RemoveInput(cameraInput);
  1. 同樣移除相機輸出。
int32_t result = captureSession- >RemoveOutut(videoOutput);
  1. 創建新的相機輸入,并把它添加到采集會話。
sptr< CaptureInput > cameraInput2 = camManagerObj- >CreateCameraInput(cameraObjList[1]);
result = captureSession- >AddInput(cameraInput2);
  1. 創建拍照輸出,成功創建后將拍照輸出添加到采集會話。創建消費者 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);
  1. 將配置提交到采集會話。
result = captureSession- >CommitConfig();
  1. 釋放被移出會話的相機輸入。
cameraInput- >Release();
  1. 拍攝照片。
result = ((sptr PhotoOutput > &)photoOutput)- >Capture();
  1. 釋放采集會話資源。
captureSession- >Release();
  1. 釋放相機輸入關閉相機。
cameraInput2- >Release();

設置閃光燈

拍照和錄像前可以在相機輸入里設置閃光燈。

  1. 在照相中設置閃光燈。

    cameraInput- >LockForControl();
    cameraInput- >SetFlashMode(OHOS_CAMERA_FLASH_MODE_OPEN);
    cameraInput- >UnlockForControl();
    
  2. 在錄像中設置閃光燈。

    cameraInput- >LockForControl();
    cameraInput- >SetFlashMode(OHOS_CAMERA_FLASH_MODE_ALWAYS_OPEN);
    cameraInput- >UnlockForControl();
    
  3. 關閉閃光燈。

    cameraInput- >LockForControl();
    cameraInput- >SetFlashMode(OHOS_CAMERA_FLASH_MODE_CLOSE);
    cameraInput- >UnlockForControl();
    

    鴻蒙OpenHarmony知識已更新←前往

765e5079845b5bb77f2aa30a2da70670.jpeg

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Camera
    +關注

    關注

    0

    文章

    79

    瀏覽量

    21321
  • 鴻蒙
    +關注

    關注

    59

    文章

    2491

    瀏覽量

    43714
收藏 0人收藏

    評論

    相關推薦
    熱點推薦

    開源啦!!!基于鴻蒙ArkTS封裝的圖表組件《McCharts》,大家快來一起共創

    的地方請大家高抬貴手,寬容一下,謝謝。 這次主要是給大家帶來一個重磅消息,就是我自己使用鴻蒙ArkTS語法開發的圖表組件今日正式開源了。為什么?原因有兩點吧! 鴻蒙是國產的操作系統,
    發表于 03-15 15:21

    【「極速探索HarmonyOS NEXT 」閱讀體驗】 初印象:一本純血鴻蒙應用開發入門的好書

    實戰,就純血鴻蒙的整個技術鏈條進行了簡單細致的介紹。 書中先介紹了鴻蒙整體的概念,然后介紹了開發工具DevEco Studio的下載安裝和使用以及軟件布局,以及如何使用它創建基本工程、
    發表于 03-04 12:41

    名單公布!【書籍評測活動NO.56】極速探索HarmonyOS NEXT:純血鴻蒙應用開發實踐

    開發的核心技術,以及鴻蒙應用在實際開發中的應用方法。 本書共分為四篇,共計16章,分別為鴻蒙開發基礎篇、
    發表于 01-20 16:53

    LwIP應用開發實戰指南—基于野火STM32

    LwIP應用開發實戰指南—基于野火STM32—20210122
    發表于 01-17 14:34 ?8次下載

    鴻蒙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
    主站蜘蛛池模板: 亚洲精品乱码8久久久久久日本 | 亚洲精品无AMM毛片 亚洲精品网址 | 蜜柚在线观看免费高清官网视频 | 久久国产36精品色熟妇 | 欧美一区二区日韩一区二区 | 黄色天堂网站 | 24小时日本在线观看片 | 国产国拍精品AV在线观看 | 2020最新无码国产在线视频 | SM脚奴调教丨踩踏贱奴 | 亚洲精品自在在线观看 | 亚洲大片在线观看 | 国产精品第十页 | 国产精品亚欧美一区二区三区 | 玖玖爱在线播放 | 亚洲人成7777| 成人国产在线看不卡 | 诱咪视频免费 | 18日本人XXXXXX18 | 欧美xxxxb| 亚洲综合久久一本伊伊区 | xxxxxx日本处大片免费看 | 日本激情在线 | 台湾佬综合娱乐网 | 欧美日韩888在线观看 | www.青青草 | 十八禁啪啦啪漫画 | 午夜影院c绿象 | 亚洲人人为我我为人人 | 三色午夜秀 | 色就色 综合偷拍区欧美 | 北原夏美 快播 | 亚洲精品乱码8久久久久久日本 | 亚洲黄色高清视频 | 久久理伦片琪琪电影院 | 午夜理论片YY4399影院 | 被老师按在办公桌吸奶头 | 久久精品亚洲 | 亚洲一二三产品区别在哪里 | 色狠狠色狠狠综合天天 | 中国xxxxxz|

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品