OpenHarmony子系统开发 - 媒体相机

深入鸿蒙开发-OpenHarmony ArkUI 如何调用相机 本指导主要展示了openharmony arkui调用相机的调用过程,以及调用相机的权限准备;本指导对比了两种设计方案优劣,并给出推荐方案;Camera由于相机强关联硬件设备,在开发前要确保硬件设备完整性。其次,相机开发主要关注权限问题,避免因权限问题延长调试时间。此外,还因关注不同设备差异性产生的接口不兼容问题,需要测试覆盖完整。​Camera。 阅读详情

OpenHarmony子系统开发 - 媒体相机


一、相机开发概述

基本概念

相机是OpenHarmony多媒体进程提供的服务之一,提供了相机的录像、预览、拍照功能,支持多用户并发取流。

在进行应用的开发前,开发者应了解以下基本概念:

  • 视频帧

    视频流指的是将一系列图片数据按照固定时间间隔排列形成的数据流,每一张图片数据成为一帧,这样的一帧称为视频帧。

  • 帧速率(FPS,Frames Per Second)

    视频播放每秒钟刷新图片的速度,或是视频每秒的帧数,帧速率越高,视频的观感越流畅。

  • 分辨率

    每一帧的图片信息都是由像素点组成的,分辨率描述了一张图片中像素点的个数。例如1920*1080(1080P),是指图片宽1920像素,高1080像素。

运作机制

  • 多媒体服务进程

    多媒体服务作为系统服务,在系统启动时由Init进程拉起,并初始化和分配媒体硬件资源(内存/显示硬件/图像传感器/编解码器等)。初始化过程解析配置文件,确定了多媒体各个服务的能力和资源上限,通常由OEM厂商通过配置文件进行配置。相机服务在多媒体进程初始化时有以下配置项:

    • 内存池:所有媒体服务依赖于内存池中的内存轮转运行
    • 图像传感器:包括了传感器类型、分辨率、ISP等
    • 图像处理器:分辨率、码率、图像翻转等
    • 图像编码器:编码格式、码率、分辨率等
  • 关键类的解释

    应用通过持有下面4个类,配置和使用Camera的功能,包括了Camera类和它的三个异步回调类,三类回调分别对应了不同类型的异步处理场景,详见下表。

    表1 关键类的解释

    对象用途举例
    Camera对相机进行静态配置(通过配置类),触发相机基本功能拍照/录像/预览
    CameraDeviceCallback处理相机硬件状态变化可用/不可用
    CameraStateCallback处理camera自身状态变化创建/释放
    FrameStateCallback处理帧状态的变化拍照开始和结束/帧率发生变化
  • 流的传递

    Surface是多媒体传递音视频的基本数据结构,Camera一般作为Surface中数据的生产者,在不同的场景下有特定的消费者。

    相机的预览和录像输出均为视频流,拍照输出为图像帧,二者均通过Surface类进行传递。Surface类可以屏蔽进程内/跨进程的场景,进行多媒体信息流的传递。

    以录像为例,用户首先创建Recorder实例,并从Recorder中获取对应Surface,再将此Surface传递给Camera实例,此时Camera将作为生产者向Surface注入视频流,而Recorder作为消费者从Surface中取出视频流进行保存,用户的行为类似桥接,把二者通过Surface连接起来。

    类似的,用户也可以自行创建Surface传递给Camera实例,并实现消费者逻辑(例如通过网络传输视频流,或是将拍照的帧数据保存成图片文件)。

    图形图像模块也通过Surface从Camera获取流资源,具体步骤详见图形图像开发指导。

  • 相机运行流程

    1. Camera创建流程

      本进程通过CameraManager创建Camera实例,并从服务端绑定camera设备,创建成功后异步通知developer。类之间的时序图如下:

      图1 Camera创建时序图

      zh-cn_image_0000001200114819

    2. Camera录像/预览流程

      开发者首先通过CameraKit创建Camera,然后FrameConfig类对录像或者预览帧属性进行配置。录像/预览时序如下:

      图2 Camera录像/预览时序图

      zh-cn_image_0000001200115193


二、拍照开发指导

使用场景

使用Camera产生图片帧(拍照)。

接口说明

表1 API列表

类名接口名描述
CameraKitint32_t GetCameraIds(std::list<string> cameraList)获取cameraId列表
CameraKitCameraAbility& GetCameraAbility(string cameraId)获取指定camera的能力
CameraKitvoid RegisterCameraDeviceCallback(CameraDeviceCallback* callback, EventHandler* handler)注册camera设备状态回调
CameraKitvoid UnregisterCameraDeviceCallback(CameraDeviceCallback* callback)去注册camera设备状态回调
CameraKitvoid CreateCamera(string cameraId, CameraStateCallback* callback, EventHandler* handler)创建camera实例
Camerastring GetCameraId()获取cameraID
CameraCameraConfig& GetCameraConfig()获取camera配置信息
CameraFrameConfig& GetFrameConfig(int32_t type)获取捕获帧类型
Cameravoid Configure(CameraConfig& config)配置camera
Cameravoid Release()释放camera
Cameraint TriggerLoopingCapture(FrameConfig& frameConfig)开始循环帧捕获
Cameravoid StopLoopingCapture()停止循环帧捕获
Cameraint32_t TriggerSingleCapture(FrameConfig& frameConfig)截图
CameraConfigvoid SetFrameStateCallback(FrameStateCallback* callback, EventHandler* handler);设置帧状态回调
CameraConfigstatic CameraConfig* CreateCameraConfig()创建camera配置信息实例
CameraAbilitystd::list<Size> GetSupportedSizes(int format)根据类型获取支持输出图像尺寸大小
CameraAbilitystd::list<T> GetParameterRange(uint32_t key)获取支持的参数范围
CameraDeviceCameraDeviceCallback()camera设备回调类构造函数
CameraDevicevoid OnCameraStatus​(std::string cameraId, int32_t status)camera设备状态变化时的回调
CameraStateCallbackCameraStateCallback​()camera状态回调类构造函数
CameraStateCallbackvoid OnConfigured​(Camera& camera)camera配置成功回调
CameraStateCallbackvoid OnConfigureFailed​(Camera& camera,int32_t errorCode)camera配置失败回调
CameraStateCallbackvoid OnCreated​(Camera& camera)camera创建成功回调
CameraStateCallbackvoid OnCreateFailed​(std::string cameraId,int32_t errorCode)camera创建失败回调
CameraStateCallbackvoid OnReleased​(Camera& camera)camera释放回调
FrameStateCallbackFrameStateCallback​()帧状态回调类构造函数
FrameStateCallbackvoid OnFrameFinished(Camera& camera, FrameConfig& frameConfig, FrameResult& frameResult)拍照帧完成回调
FrameStateCallbackvoid OnFrameError​(Camera& camera, FrameConfig& frameConfig, int32_t errorCode, FrameResult& frameResult)拍照帧异常回调
FrameConfigint32_t GetFrameConfigType()获取帧配置类型
FrameConfigstd::list<OHOS::Surface> GetSurfaces()获取帧配置的surface
FrameConfigvoid AddSurface(OHOS::AGP::UISurface& surface);添加surface
FrameConfigvoid RemoveSurface(OHOS::AGP::UISurface& surface);删除surface

约束与限制

无。

开发步骤

  1. 实现设备状态回调的派生类,用户在设备状态发生变更(如新插入相机设备/相机掉线)时,自定义操作。

    class SampleCameraDeviceCallback : public CameraDeviceCallback {
        void OnCameraStatus(std::string cameraId, int32_t status) override
        {
            //do something when camera is available/unavailable
        }
    };
    
  2. 实现帧事件回调的派生类,这里在拿到帧数据以后将其转存为文件。

    static void SampleSaveCapture(const char *p, uint32_t size)
    {
        cout << "Start saving picture" << endl;
        struct timeval tv;
        gettimeofday(&tv, NULL);
        struct tm *ltm = localtime(&tv.tv_sec);
        if (ltm != nullptr) {
            ostringstream ss("Capture_");
            ss << "Capture" << ltm->tm_hour << "-" << ltm->tm_min << "-" << ltm->tm_sec << ".jpg";
    
            ofstream pic("/sdcard/" + ss.str(), ofstream::out | ofstream::trunc);
            cout << "write " << size << " bytes" << endl;
            pic.write(p, size);
            cout << "Saving picture end" << endl;
        }
    }
    
    class TestFrameStateCallback : public FrameStateCallback {
        void OnFrameFinished(Camera &camera, FrameConfig &fc, FrameResult &result) override
        {
            cout << "Receive frame complete inform." << endl;
            if (fc.GetFrameConfigType() == FRAME_CONFIG_CAPTURE) {
                cout << "Capture frame received." << endl;
                list<Surface *> surfaceList = fc.GetSurfaces();
                for (Surface *surface : surfaceList) {
                    SurfaceBuffer *buffer = surface->AcquireBuffer();
                    if (buffer != nullptr) {
                        char *virtAddr = static_cast<char *>(buffer->GetVirAddr());
                        if (virtAddr != nullptr) {
                            SampleSaveCapture(virtAddr, buffer->GetSize());
                        }
                        surface->ReleaseBuffer(buffer);
                    }
                    delete surface;
                }
                delete &fc;
            }
        }
    };
    
  3. 实现相机状态回调的派生类,自定义相机状态发生变化(配置成功/失败,创建成功/失败)时的操作。

    class SampleCameraStateMng : public CameraStateCallback {
    public:
        SampleCameraStateMng() = delete;
        SampleCameraStateMng(EventHandler &eventHdlr) : eventHdlr_(eventHdlr) {}
        ~SampleCameraStateMng()
        {
            if (recordFd_ != -1) {
                close(recordFd_);
            }
        }
        void OnCreated(Camera &c) override
        {
            cout << "Sample recv OnCreate camera." << endl;
            auto config = CameraConfig::CreateCameraConfig();
            config->SetFrameStateCallback(&fsCb_, &eventHdlr_);
            c.Configure(*config);
            cam_ = &c;
        }
        void OnCreateFailed(const std::string cameraId, int32_t errorCode) override {}
        void OnReleased(Camera &c) override {}
    };
    
  4. 创建CameraKit,用于创建和获取camera信息。

    CameraKit *camKit = CameraKit::GetInstance();
    list<string> camList = camKit->GetCameraIds();
    string camId;
    for (auto &cam : camList) {
        cout << "camera name:" << cam << endl;
        const CameraAbility *ability = camKit->GetCameraAbility(cam);
        /* find camera which fits user's ability */
        list<CameraPicSize> sizeList = ability->GetSupportedSizes(0);
        if (find(sizeList.begin(), sizeList.end(), CAM_PIC_1080P) != sizeList.end()) {
            camId = cam;
            break;
        }
    }
    
  5. 创建Camera实例。

    EventHandler eventHdlr; // Create a thread to handle callback events
    SampleCameraStateMng CamStateMng(eventHdlr);
    
    camKit->CreateCamera(camId, CamStateMng, eventHdlr);
    
  6. 根据步骤1、步骤2、步骤3中的回调设计,同步等待 OnCreated 回调拿到 cam_ 之后,进行相关操作。

    void OnCreated(Camera &c) override
    {
        cout << "Sample recv OnCreate camera." << endl;
        auto config = CameraConfig::CreateCameraConfig();
        config->SetFrameStateCallback(&fsCb_, &eventHdlr_);
        c.Configure(*config);
        cam_ = &c;
    }
    
    void Capture()
    {
        if (cam_ == nullptr) {
            cout << "Camera is not ready." << endl;
            return;
        }
        FrameConfig *fc = new FrameConfig(FRAME_CONFIG_CAPTURE);
        Surface *surface = Surface::CreateSurface();
        if (surface == nullptr) {
            delete fc;
            return;
        }
        surface->SetWidthAndHeight(1920, 1080); /* 1920:width,1080:height */
        fc->AddSurface(*surface);
        cam_->TriggerSingleCapture(*fc);
    }
    

三、录像开发指导

使用场景

使用Camera采集视频码流。

接口说明

参考拍照开发指导的“接口说明”。

约束与限制

无。

开发步骤

  1. 参考拍照开发指导中步骤1、步骤2、步骤3、步骤4。

  2. 获取录像FrameConfig。

    /* 从recorder获取surface */
    Surface *surface = recorder_->GetSurface(0);
    surface->SetWidthAndHeight(1920, 1080);
    surface->SetQueueSize(3);
    surface->SetSize(1024 * 1024);
    /* 将surface配置到帧配置中 */
    FrameConfig *fc = new FrameConfig(FRAME_CONFIG_RECORD);
    fc->AddSurface(*surface);
    
  3. 开启和停止录像。

    stateCallback->camera_->TriggerLoopingCapture(*fc); // 开始录像
    stateCallback->camera_->StopLoopingCapture();       // 结束录像
    

四、预览开发指导

使用场景

使用Camera产生视频流并播放。

接口说明

参考拍照开发指导的“接口说明”。

约束与限制

无。

开发步骤

  1. 参考拍照开发指导中步骤1、步骤2、步骤3、步骤4。

  2. 设置预览显示的区域。

    Surface *surface = Surface::CreateSurface();
    /* 设置显示区域 */
    surface->SetUserData("region_position_x", "480"); // 矩形左上角横坐标
    surface->SetUserData("region_position_y", "270"); // 矩形左上角纵坐标
    surface->SetUserData("region_width", "960");      // 宽
    surface->SetUserData("region_height", "540");     // 高
    
    fc->AddSurface(*surface);
    
  3. 开始和结束预览。

    stateCallback->camera_->TriggerLoopingCapture(*fc); // 开始预览
    stateCallback->camera_->StopLoopingCapture();       // 停止预览
    
快速上手HarmonyOS相机开发:教你如何使用CameraKit API 可以使用 CameraKit.CameraManager.GetCameras() 方法获取设备上的摄像头列表,并使用 CameraKit.CameraManager.Open() 方法打开指定的摄像头设备。然后使用 CameraKit.Camera.SetProperty() 方法设置摄像头的参数,如分辨率、曝光等级等。调用 CameraKit.Camera.StartPreview() 方法开始预览摄像头采集的图像,并使用 CameraKit.Camera.TakePhoto() 方法采集和保存图像。 阅读详情

相关推荐

Camera相机研发介绍

1. Camera开发流程 在这里,我们先了解下相机开发的大致流程,然后再对里面的步骤进行详细的阐述。 利用open(int)获取Camera实例 利用getParameters()获取默认设置,如果需要修改参数,利用setParameters()重新设置 利用setDisplayOrientation()设置相机图像旋转角度,产生正确的预览画面 利用setPreviewDisplay(SurfaceHolder)关联相机与SurfaceView显示图层,让视频流显示在界面上 设置Preview

1721

4:鸿蒙这事儿能成吗

本节从4个主客观角度和5个技术角度出发,向大家论证了为什么鸿蒙系统一定能成,为什么行业需要并且一定会支持这样的一款AIoTOS。 本课程隶属于《跟朱老师学鸿蒙系列课程》的第1个课程。该系列课程是朱有鹏老师规划和录制的系统学习鸿蒙系统HarmonyOS的系列课程,会持续更新不断深入。前面课程主要是鸿蒙相关的科普和技术介绍、生态战略介绍、鸿蒙创新特性介绍、典型案例讲解和分析等。后面会逐步深入到纯技术学习课程,涉及到鸿蒙开发的各个方向,包括但不限于:鸿蒙北向应用开发(环境搭建、编程基础、常用API、手把手demo实战、开发者申请、签名app并上传应用市场等)、鸿蒙南向系统开发(liteos-m和liteos-a kernel源码分析、移植、调试等)、鸿蒙南向驱动开发(HDF框架解析、鸿蒙设备树、常见设备驱动模型分析和驱动编程实战,如GPIO、I2C、LCD、TP等)、鸿蒙系统创新开发(如分布式软总线解析、跨设备调用实战、安全子系统详解、鸿蒙AI子系统等)。总之,该课程会贯彻朱老师一贯做课习惯,会是一个零基础起步,长篇大论,不断更新和添加丰富完善,带大家从应用到系统到驱动,非常完整全面的学习和解析鸿蒙系统的一套课程。

鸿蒙OpenHarmony【媒体之相机开发】子系统

相机是OpenHarmony多媒体进程提供的服务之一,提供了相机的录像、预览、拍照功能,支持多用户并发取流。

asd95279527p的博客 935

鸿蒙应用开发进阶

<p><img src="https://img-bss.csdnimg.cn/202201170618595386.jpg" alt="" /></p>

鸿蒙OpenHarmony【媒体之拍照开发】子系统

使用Camera产生图片帧(拍照)。

asd95279527p的博客 990

OpenHarmony相机和媒体库-如何在ArkTS中调用相机拍照和录像。

此Demo展示如何在ArkTS中调用相机拍照和录像,以及如何使用媒体库接口进行媒体文件的增、删、改、查操作。

m0_70749039的博客 2768

OpenHarmony媒体子系统详解

图1 OpenHarmony媒体子系统架构图。OpenHarmony媒体子系统为开发者提供一套简单且易于理解的接口,使得开发者能够方便接入系统并使用系统的媒体资源。2、OpenHarmony媒体子系统常用功能。5、OpenHarmony媒体子系统构成简介。├── frameworks # 框架代码。└── test # 测试代码。3、OpenHarmony媒体子系统架构。│ └── kits # 对外接。├── interfaces # 接口。1、OpenHarmony媒体子系统。

程序猿老樊的博客 1325

【鸿蒙南向开发】OpenHarmony 源码解析之多媒体子系统(camera)

有很多小伙伴不知道该从哪里开始学习鸿蒙开发技术?也不知道鸿蒙开发的知识点重点掌握的又有哪些?自学时频繁踩坑,导致浪费大量时间。结果还是一知半解。所以有一份实用的鸿蒙(HarmonyOS NEXT)全栈开发资料用来跟着学习是非常有必要的。

HarmonyOS_001的博客 1400

【直播回顾】OpenHarmony知识赋能五期第六课——子系统相机解

5月26日晚上19点,知识赋能第五期第六节课 《OpenHarmony标准系统多媒体子系统之相机解读》 ,在OpenHarmony开发者成长计划社群内成功举行。 本期课程,由深开鸿资深技术专家郭岳峰主讲,是“OpenHarmony开源开发者成长计划项目”举办的知识赋能系列直播之一。OpenHarmony开源开发者成长计划项目自2021年10月24日上线以来,在开发者中引发高度关注。短暂的6个月时间,OpenHarmony知识赋能直播课已经走过了5期,共28节课、23名技术大咖倾囊相授、2000+学生开发者

OpenHarmony_dev的博客 297

harmonyOS之相机开发

输入事件相关类图如上,每类输入事件根据自己特点,重写 InputDevice 基类的 Read 函数,读取对应的输入数据,然后根据输入数据生成对应的事件分发给 UI 控件,如 PointerInputDevice 读取触摸的坐标点,根据坐标点,从组件树查找当前坐标对应的控件,生成对应的点击、长按、拖拽事件,分发给对应控件。如何确定应用开发所需的 API 套件?应用通过持有下面4个类,配置和使用Camera的功能,包括了Camera类和它的三个异步回调类,三类回调分别对应了不同类型的异步处理场景,详见下表。

2401_84895357的博客 2029

OpenHarmony 3.2 Beta多媒体系列——视频录制

媒体子系统为开发者提供了媒体相关的很多功能,本文针对其中的视频录制功能做个详细的介绍。首先,我将通过媒体子系统提供的视频录制Test代码作为切入点,给大家梳理一下整个录制的流程。本文主要对OpenHarmony 3.2 Beta多媒体子系统的视频录制进行介绍,首先梳理了整体的录制流程,然后对录制过程中的主要步骤进行了详细地分析。视频录制主要分为以下几个步骤:(1) 获取CameraManager实例。(2) 创建采集会话CaptureSession。

maniuT的博客 978

【直播回顾】OpenHarmony知识赋能五期第三课——多媒体整体介绍

5月5日晚上19点,知识赋能第五期第三节课《OpenHarmony标准系统多媒体子系统整体介绍》,在OpenHarmony开发者成长计划社群内成功举行。 本期课程,由深开鸿资深技术专家郭岳峰主讲,是“OpenHarmony开源开发者成长计划项目”举办的知识赋能系列直播之一。OpenHarmony开源开发者成长计划项目自2021年10月24日上线以来,在开发者中引发高度关注。短暂的6个月时间,OpenHarmony知识赋能直播课已经走过了4期,共22节课、19名技术大咖倾囊相授、2000+学生开发者观看

OpenHarmony_dev的博客 287

VLA算法总结对比——RT1 / RT2 / Pi0 / Octo/ RDT / OpenVLA

本文主要针最近比较经典的VLA算法进行对比总结,暂不涉及到代码细节和实验细节上的展开,仅仅是从大面上掌握下目前VLA的一些思路和方法。

weixin_44580210的博客 9420

OpenHarmony Camera源码分析

调用流程来到了StreamOperatorProxy的Capture接口,StreamOperatorProxy是HDI模块的client端,HDI模块的client通过IPC调用到HDI的server端进行具体的操作,这个属于底层调用模块,暂时不继续分析。在HCaptureSession的调用中,调用HStreamRepeat的Start接口,HStreamRepeat在上述的创建预览输出时创建的对象,最终调用到HStreamRepeat的StartPreview接口。以下对几个核心代码进行具体分析。

OpenHarmony_dev的博客 1527

cesium自定义指南针

项目需要一个指南针,用鼠标按住旋转指针,会让3d地图旋转,点击中心点重置方位。当然可以使用插件cesium-navigation-es6,但是样式不好修改,所以我自定义了一个指南针。

weixin_47017648的博客 747

硬件开发流程

研发流程在一个有一定规模的企业中起到了非常重要的作用,也是一个产品或者项目成功量产出货依赖的平台体系,作为工程师如果想要走的更远,就必须了解流程体系,了解如何对产品的开发质量进行更好的管控。...

weixin_44126796的博客 8363

OpenHarmony媒体子系统

媒体子系统为开发者提供一套简单且易于理解的接口,使得开发者能够方便接入系统并使用系统的媒体资源。音频播放和录制。视频播放和录制。相机拍照和录制。

__Benco的博客 789

Mac电脑用Latex论文排版3天速成5天实战de笔记

我后悔了,这五天竞赛搞得我视力都下降了...一个冲动的决定后成为数模竞赛论文写手,3天速成+5天时间=点亮攻克latex写论文技能💡关于Overleaf我是Mac,曾经按照大部分推荐的方式用TEXshop+vs code,但是把模板导入就开始报错。跟着少之又少的适配mac的教程(此时我已知道大概是走错路了)改了配置也无效。海鲜市场找佬改了半天,佬问我:一定要用VC吗?我说,那倒也不是。于是佬推荐我overleaf,三下五除二帮我挑配了环境,美汁汁收了我30块钱。

luwanjoyce的博客 2238

OpenHarmony相机系统详解

相机框架中主要包含会话管理、设备输入和数据输出,设备的输入和数据的输出配置都是在采集会话中完成,会话管理模块管理相机设备输入和数据输出。底层硬件提供了相机设备功能,比如相机的设备管理,包括相机设备枚举、相机设备能力查询、流的创建管理以及图像的捕获。相机组件支持相机业务的开发,开发者可以通过已开放的接口实现相机硬件的访问、操作和新功能开发,最常见的操作如:预览、拍照和录像等。(3).数据输出:相机的输出有拍照输出、预览输出和录像输出,分别对应三个不同的类,所以上层需要根据不同的场景创建出不同的数据输出。

程序猿老樊的博客 843

数字频率计设计中的常见误区:从VHDL代码到硬件实现的避坑指南

本文深入探讨了数字频率计从VHDL代码到FPGA硬件实现过程中的关键误区与解决方案。重点分析了闸门时间生成的精度与资源平衡、控制时序设计中的竞争冒险规避,以及如何利用EDA工具进行综合、时序约束与调试,确保设计稳定可靠。文章为开发者提供了从仿真成功到硬件可用的实战避坑指南。

spark7igniter的博客 206

KEIL MDK实战:如何用fromelf工具解析STM32的ELF文件结构(附完整命令行)

本文详细介绍了如何使用KEIL MDK中的fromelf工具解析STM32的ELF文件结构,包括内存段分析、符号表追踪和反汇编关键函数等实战技巧。通过完整的命令行示例,帮助嵌入式开发者优化内存占用、排查运行时问题,并提升STM32项目的开发效率。

weixin_42631411的博客 178

openharmony开发资料合集

19、码牛视频合集UBOOT、LED驱动、GN构建工具、子系统。15、lava论坛rk3568移植视频。18、飞凌openharmony编译手册。openharmony官方文档。1、rk3568平台移植路线。3、北向应用开发视频教程。7、移植到第三方芯片平台。8、rk3568移植案例。9、rk3399移植案例。16、树莓派移植案例视频。6、标准系统fdf框架。11、标准系统移植指南。4、多媒体子系统相机。

wwddgod的专栏 992

华为OD机试双机位C卷-魔法收积木 (C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【魔法收积木】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为od - 魔法收积木。

qq_45776114的博客 1934

Baumer工业相机堡盟工业相机如何联合OpenHarmony框架开发连接USB相机(OpenHarmony)

Baumer工业相机堡盟工业相机如何联合OpenHarmony框架开发连接USB相机(OpenHarmony)

xianzuzhicai的博客 1862

华为OD机试真题 新系统 2026-07-22 Java&Go&C 实现【最小代价完成论文评审】

某校有 n 篇论文需要分配给教师评审。 每篇论文 i 可由 files[i] 对应的教师列表中任一教师评审。 每篇论文至少需要一名教师评审。 每位教师 t 不论被分配多少篇论文,其评审费用固定为 cost[t]。 请给出参与评审教师数量最少时的总费用。 如果存在多种方案满足教师数量最少,则选择总费用最小的方案。

MISAYAONE的博客 137

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Flutter for OpenHarmony多媒体功能开发完全指南

Flutter for OpenHarmony多媒体开发指南摘要 本文全面介绍Flutter在OpenHarmony平台上开发多媒体功能的解决方案,涵盖图片处理、音频播放、视频播放和相机相册集成四大核心功能。 主要内容: 图片处理与优化:详细讲解图片缓存、懒加载、压缩等优化技巧,提供图片裁剪功能的完整实现方案 音频播放器开发:实现支持后台播放的音频播放器,解决锁屏播放问题 视频播放器开发:从基础播放到高级功能实现,处理格式兼容性问题 相机与相册集成:提供权限申请、拍照、图片选择等最佳实践 技术亮点: 性能优

2502_91523773的博客 2994

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: OpenHarmony窗口标题栏定制开发指导(ArkTs)
下一篇: OpenHarmony子系统开发 - 媒体音视频
__Benco
博客等级 码龄12年 1772粉丝 279原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__Benco

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值