鸿蒙实战开发(OpenHarmony)照相示例开发

[复制链接]
发表于 2025-12-10 07:10:31 | 显示全部楼层 |阅读模式
  鸿蒙NEXT开发实战往期必看文章:
一分钟相识”纯血版!鸿蒙HarmonyOS Next应用开发!
“非常详细的” 鸿蒙HarmonyOS Next应用开发学习门路!(从零根本入门到夺目)
HarmonyOS NEXT应用开发案例实践总联合(连续更新......)
HarmonyOS NEXT应用开发性能优化实践总结(连续更新......)

利用场景

利用Camera产生图片帧(照相)。
接口分析

表 1 API列表

  类名
  接口名
  形貌
  CameraKit
  int32_t GetCameraIds(std::list<string> cameraList)
  获取cameraId列表
  CameraKit
  CameraAbility& GetCameraAbility(string cameraId)
  获取指定camera的本领
  CameraKit
  void RegisterCameraDeviceCallback(CameraDeviceCallback* callback, EventHandler* handler)
  注册camera装备状态回调
  CameraKit
  void UnregisterCameraDeviceCallback(CameraDeviceCallback* callback)
  去注册camera装备状态回调
  CameraKit
  void CreateCamera(string cameraId, CameraStateCallback* callback, EventHandler* handler)
  创建camera实例
  Camera
  string GetCameraId()
  获取cameraID
  Camera
  CameraConfig& GetCameraConfig()
  获取camera设置信息
  Camera
  FrameConfig& GetFrameConfig(int32_t type)
  获取捕捉帧范例
  Camera
  void Configure(CameraConfig& config)
  设置camera
  Camera
  void Release()
  开释camera
  Camera
  int TriggerLoopingCapture(FrameConfig& frameConfig)
  开始循环帧捕捉
  Camera
  void StopLoopingCapture()
  制止循环帧捕捉
  Camera
  int32_t TriggerSingleCapture(FrameConfig& frameConfig)
  抓图
  CameraConfig
  void SetFrameStateCallback(FrameStateCallback* callback, EventHandler* handler);
  设置帧状态回调
  CameraConfig
  static CameraConfig* CreateCameraConfig()
  创建camera设置信息实例
  CameraAbility
  std::list<Size> GetSupportedSizes(int format)
  根据范例获取支持输出图像尺寸巨细
  CameraAbility
  std::list<T> GetParameterRange(uint32_t key)
  获取支持的参数范围
  CameraDevice
  CameraDeviceCallback()
  camera装备回调类构造函数
  CameraDevice
  void OnCameraStatus​(std::string cameraId, int32_t status)
  camera装备状态厘革时的回调
  CameraStateCallback
  CameraStateCallback​()
  camera状态回调类构造函数
  CameraStateCallback
  void OnConfigured​(Camera& camera)
  camera设置乐成回调
  CameraStateCallback
  void OnConfigureFailed​(Camera& camera,int32_t errorCode)
  camera设置失败回调
  CameraStateCallback
  void OnCreated​(Camera& camera)
  camera创建乐成回调
  CameraStateCallback
  void OnCreateFailed​(std::string cameraId,int32_t errorCode)
  camera创建失败回调
  CameraStateCallback
  void OnReleased​(Camera& camera)
  camera开释回调
  FrameStateCallback
  FrameStateCallback​()
  帧状态回调类构造函数
  FrameStateCallback
  void OnFrameFinished(Camera& camera, FrameConfig& frameConfig, FrameResult& frameResult)
  照相帧完成回调
  FrameStateCallback
  void OnFrameError​(Camera& camera, FrameConfig& frameConfig, int32_t errorCode, FrameResult& frameResult)
  照相帧非常回调
  FrameConfig
  int32_t GetFrameConfigType()
  获取帧设置范例
  FrameConfig
  std::list<OHOS::Surface> GetSurfaces()
  获取帧设置的surface
  FrameConfig
  void AddSurface(OHOS::AGP::UISurface& surface);
  添加surface
  FrameConfig
  void RemoveSurface(OHOS::AGP::UISurface& surface);
  删除surface
束缚与限定

无。
开发步调


  • 实现装备状态回调的派生类,用户在装备状态发生变动(如新插入相机装备/相机掉线)时,自界说操纵。
    1. class SampleCameraDeviceCallback : public CameraDeviceCallback {
    2.     void OnCameraStatus(std::string cameraId, int32_t status) override
    3.     {
    4.         //do something when camera is available/unavailable
    5.     }
    6. };
    复制代码
  • 实现帧变乱回调的派生类,这里在拿到帧数据以后将其转存为文件。
    1. static void SampleSaveCapture(const char *p, uint32_t size)
    2. {
    3.     cout << "Start saving picture" << endl;
    4.     struct timeval tv;
    5.     gettimeofday(&tv, NULL);
    6.     struct tm *ltm = localtime(&tv.tv_sec);
    7.     if (ltm != nullptr) {
    8.         ostringstream ss("Capture_");
    9.         ss << "Capture" << ltm->tm_hour << "-" << ltm->tm_min << "-" << ltm->tm_sec << ".jpg";
    10.         ofstream pic("/sdcard/" + ss.str(), ofstream::out | ofstream::trunc);
    11.         cout << "write " << size << " bytes" << endl;
    12.         pic.write(p, size);
    13.         cout << "Saving picture end" << endl;
    14.     }
    15. }
    16. class TestFrameStateCallback : public FrameStateCallback {
    17.     void OnFrameFinished(Camera &camera, FrameConfig &fc, FrameResult &result) override
    18.     {
    19.         cout << "Receive frame complete inform." << endl;
    20.         if (fc.GetFrameConfigType() == FRAME_CONFIG_CAPTURE) {
    21.             cout << "Capture frame received." << endl;
    22.             list<Surface *> surfaceList = fc.GetSurfaces();
    23.             for (Surface *surface : surfaceList) {
    24.                 SurfaceBuffer *buffer = surface->AcquireBuffer();
    25.                 if (buffer != nullptr) {
    26.                     char *virtAddr = static_cast<char *>(buffer->GetVirAddr());
    27.                     if (virtAddr != nullptr) {
    28.                         SampleSaveCapture(virtAddr, buffer->GetSize());
    29.                     }
    30.                     surface->ReleaseBuffer(buffer);
    31.                 }
    32.                 delete surface;
    33.             }
    34.             delete &fc;
    35.         }
    36.     }
    37. };
    复制代码
  • 实现相机状态回调的派生类,自界说相机状态发生厘革(设置乐成/失败,创建乐成/失败)时的操纵。
    1. class SampleCameraStateMng : public CameraStateCallback {
    2. public:
    3.     SampleCameraStateMng() = delete;
    4.     SampleCameraStateMng(EventHandler &eventHdlr) : eventHdlr_(eventHdlr) {}
    5.     ~SampleCameraStateMng()
    6.     {
    7.         if (recordFd_ != -1) {
    8.             close(recordFd_);
    9.         }
    10.     }
    11.     void OnCreated(Camera &c) override
    12.     {
    13.         cout << "Sample recv OnCreate camera." << endl;
    14.         auto config = CameraConfig::CreateCameraConfig();
    15.         config->SetFrameStateCallback(&fsCb_, &eventHdlr_);
    16.         c.Configure(*config);
    17.         cam_ = &c;
    18.     }
    19.     void OnCreateFailed(const std::string cameraId, int32_t errorCode) override {}
    20.     void OnReleased(Camera &c) override {}
    21. };
    复制代码
  • 创建CameraKit,用于创建和获取camera信息。
    1. CameraKit *camKit = CameraKit::GetInstance();
    2. list<string> camList = camKit->GetCameraIds();
    3. string camId;
    4. for (auto &cam : camList) {
    5.     cout << "camera name:" << cam << endl;
    6.     const CameraAbility *ability = camKit->GetCameraAbility(cam);
    7.     /* find camera which fits user's ability */
    8.     list<CameraPicSize> sizeList = ability->GetSupportedSizes(0);
    9.     if (find(sizeList.begin(), sizeList.end(), CAM_PIC_1080P) != sizeList.end()) {
    10.         camId = cam;
    11.         break;
    12.     }
    13. }
    复制代码
  • 创建Camera实例。
    1. EventHandler eventHdlr; // Create a thread to handle callback events
    2. SampleCameraStateMng CamStateMng(eventHdlr);
    3. camKit->CreateCamera(camId, CamStateMng, eventHdlr);
    复制代码
  • 根据步调1、步调2、步调3中的回调筹划,同步期待 OnCreated 回调拿到 cam_ 之后,举行相干操纵。
    1. void OnCreated(Camera &c) override
    2. {
    3.     cout << "Sample recv OnCreate camera." << endl;
    4.     auto config = CameraConfig::CreateCameraConfig();
    5.     config->SetFrameStateCallback(&fsCb_, &eventHdlr_);
    6.     c.Configure(*config);
    7.     cam_ = &c;
    8. }
    9. void Capture()
    10. {
    11.     if (cam_ == nullptr) {
    12.         cout << "Camera is not ready." << endl;
    13.         return;
    14.     }
    15.     FrameConfig *fc = new FrameConfig(FRAME_CONFIG_CAPTURE);
    16.     Surface *surface = Surface::CreateSurface();
    17.     if (surface == nullptr) {
    18.         delete fc;
    19.         return;
    20.     }
    21.     surface->SetWidthAndHeight(1920, 1080); /* 1920:width,1080:height */
    22.     fc->AddSurface(*surface);
    23.     cam_->TriggerSingleCapture(*fc);
    24. }
    复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表