国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenHarmony 3.2 Beta多媒體系列——視頻錄制

2KHh_gh_15d2f06 ? 來源:未知 ? 2023-02-10 11:20 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

ca3ce0d4-a8f1-11ed-bfe3-dac502259ad0.png

巴延興

深圳開鴻數(shù)字產(chǎn)業(yè)發(fā)展有限公司

資深OS框架開發(fā)工程師

一、簡介

媒體子系統(tǒng)為開發(fā)者提供了媒體相關(guān)的很多功能,本文針對其中的視頻錄制功能做個詳細(xì)的介紹。首先,我將通過媒體子系統(tǒng)提供的視頻錄制Test代碼作為切入點,給大家梳理一下整個錄制的流程。

二、目錄

foundation/multimedia/camera_framework

├──frameworks
│ ├── js
│ │ └── camera_napi                            #napi實現(xiàn)
│ │     └── src
│ │         ├── input                          #Camera輸入
│ │         ├── output                         #Camera輸出
│ │         └── session                        #會話管理
│ └── native                                     #native實現(xiàn)
│     └── camera
│         ├── BUILD.gn
│         ├── src
│         │ ├── input                          #Camera輸入
│         │ ├── output                         #Camera輸出
│         │ └── session                        #會話管理
├── interfaces                                     #接口定義
│ ├── inner_api                                  #內(nèi)部native實現(xiàn)
│ │ └── native
│ │     ├── camera
│ │     │ └── include
│ │     │     ├── input
│ │     │     ├── output
│ │     │     └── session
│ └── kits                                       #napi接口
│     └── js
│         └── camera_napi
│             ├── BUILD.gn
│             ├── include
│             │ ├── input
│             │ ├── output
│             │ └── session
│             └── @ohos.multimedia.camera.d.ts
└── services                                       #服務(wù)端
    └── camera_service
        ├── binder
        │ ├── base
        │ ├── client                             #IPC的客戶端
        │ │ └── src
      │ └── server                             #IPC的服務(wù)端
      │     └── src
└──src

三、錄制的總體流程

ca66cd5e-a8f1-11ed-bfe3-dac502259ad0.png ? ?

四、Native接口使用

在OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)系統(tǒng)中,多媒體子系統(tǒng)通過N-API接口提供給上層JS調(diào)用,N-API相當(dāng)于是JS和Native之間的橋梁,在OpenHarmony源碼中,提供了C++直接調(diào)用視頻錄制功能的例子,foundation/multimedia/camera_framework/interfaces/inner_api/native/test目錄中。本文章主要參考了camera_video.cpp文件中的視頻錄制流程。 首先根據(jù)camera_video.cpp的main方法,了解下視頻錄制的主要流程代碼。
int main(int argc, char **argv)
{
    ......


    // 創(chuàng)建CameraManager實例
    sptr camManagerObj = CameraManager::GetInstance();


    // 設(shè)置回調(diào)
    camManagerObj->SetCallback(std::make_shared(testName));


    // 獲取支持的相機設(shè)備列表
    std::vector> cameraObjList = camManagerObj->GetSupportedCameras();


    // 創(chuàng)建采集會話
    sptr captureSession = camManagerObj->CreateCaptureSession();


    // 開始配置采集會話
    captureSession->BeginConfig();


    // 創(chuàng)建CameraInput
    sptr captureInput = camManagerObj->CreateCameraInput(cameraObjList[0]);
    sptr cameraInput = (sptr &)captureInput;


    // 開啟CameraInput
    cameraInput->Open();


    // 設(shè)置CameraInput的Error回調(diào)
    cameraInput->SetErrorCallback(std::make_shared(testName));


    // 添加CameraInput實例到采集會話中
    ret = captureSession->AddInput(cameraInput);


    sptr videoSurface = nullptr;
    std::shared_ptr recorder = nullptr;


    // 創(chuàng)建Video的Surface
    videoSurface = Surface::CreateSurfaceAsConsumer();


    sptr videoListener = new SurfaceListener("Video", SurfaceType::VIDEO, g_videoFd, videoSurface);


    // 注冊Surface的事件監(jiān)聽
    videoSurface->RegisterConsumerListener((sptr &)videoListener);


    // 視頻的配置
    VideoProfile videoprofile = VideoProfile(static_cast(videoFormat), videosize, videoframerates);


    // 創(chuàng)建VideoOutput實例
    sptr videoOutput = camManagerObj->CreateVideoOutput(videoprofile, videoSurface);


    // 設(shè)置VideoOutput的回調(diào)
    ((sptr &)videoOutput)->SetCallback(std::make_shared(testName));


    // 添加videoOutput到采集會話中
    ret = captureSession->AddOutput(videoOutput);


    // 提交會話配置
    ret = captureSession->CommitConfig();


    // 開始錄制
    ret = ((sptr &)videoOutput)->Start();




    sleep(videoPauseDuration);
    MEDIA_DEBUG_LOG("Resume video recording");
    // 暫停錄制
    ret = ((sptr &)videoOutput)->Resume();


    MEDIA_DEBUG_LOG("Wait for 5 seconds before stop");
    sleep(videoCaptureDuration);
    MEDIA_DEBUG_LOG("Stop video recording");
    // 停止錄制
    ret = ((sptr &)videoOutput)->Stop();


    MEDIA_DEBUG_LOG("Closing the session");
    // 停止采集會話
    ret = captureSession->Stop();


    MEDIA_DEBUG_LOG("Releasing the session");
    // 釋放會話采集
    captureSession->Release();


    // Close video file
    TestUtils::SaveVideoFile(nullptr, 0, VideoSaveMode::CLOSE, g_videoFd);
    cameraInput->Release();
    camManagerObj->SetCallback(nullptr);
    return 0;
}
以上是視頻錄制的整體流程,其過程主要通過Camera模塊支持的能力來實現(xiàn),其中涉及幾個重要的類:CaptureSession、CameraInput、VideoOutput。CaptureSession是整個過程的控制者,CameraInput和VideoOutput相當(dāng)于是設(shè)備的輸入和輸出。

五、調(diào)用流程

ca7758e0-a8f1-11ed-bfe3-dac502259ad0.jpgca87d83c-a8f1-11ed-bfe3-dac502259ad0.jpgca9c452e-a8f1-11ed-bfe3-dac502259ad0.jpg ? ? ? 左右滑動查看更多 ?后續(xù)主要針對上面的調(diào)用流程,梳理具體的調(diào)用流程,方便我們對了解視頻錄制的整理架構(gòu)有一個更加深入的了解。 1. 創(chuàng)建CameraManager實例通過CameraManager::GetInstance()獲取CameraManager的實例,后續(xù)的一些接口都是通過該實例進(jìn)行調(diào)用的。GetInstance使用了單例模式,在OpenHarmony代碼中這種方式很常見。
sptr &CameraManager::GetInstance()
{
    if (CameraManager::cameraManager_ == nullptr) {
        MEDIA_INFO_LOG("Initializing camera manager for first time!");
        CameraManager::cameraManager_ = new(std::nothrow) CameraManager();
        if (CameraManager::cameraManager_ == nullptr) {
            MEDIA_ERR_LOG("CameraManager::GetInstance failed to new CameraManager");
        }
    }
    return CameraManager::cameraManager_;
}
2. 獲取支持的相機設(shè)備列表通過調(diào)用CameraManager的GetSupportedCameras()接口,獲取設(shè)備支持的CameraDevice列表。跟蹤代碼可以發(fā)現(xiàn)serviceProxy_->GetCameras最終會調(diào)用到Camera服務(wù)端的對應(yīng)接口。
std::vector> CameraManager::GetSupportedCameras()
{
    CAMERA_SYNC_TRACE;


    std::lock_guard lock(mutex_);
    std::vector cameraIds;
    std::vector> cameraAbilityList;
    int32_t retCode = -1;
    sptr cameraObj = nullptr;
    int32_t index = 0;


    if (cameraObjList.size() > 0) {
        cameraObjList.clear();
    }
    if (serviceProxy_ == nullptr) {
        MEDIA_ERR_LOG("CameraManager::GetCameras serviceProxy_ is null, returning empty list!");
        return cameraObjList;
    }
    std::vector> supportedCameras;
    retCode = serviceProxy_->GetCameras(cameraIds, cameraAbilityList);
    if (retCode == CAMERA_OK) {
        for (auto& it : cameraIds) {
            cameraObj = new(std::nothrow) CameraDevice(it, cameraAbilityList[index++]);
            if (cameraObj == nullptr) {
                MEDIA_ERR_LOG("CameraManager::GetCameras new CameraDevice failed for id={public}%s", it.c_str());
                continue;
            }
            supportedCameras.emplace_back(cameraObj);
        }
    } else {
        MEDIA_ERR_LOG("CameraManager::GetCameras failed!, retCode: %{public}d", retCode);
    }


    ChooseDeFaultCameras(supportedCameras);
    return cameraObjList;
}
3. 創(chuàng)建采集會話下面是比較重要的環(huán)節(jié),通過調(diào)用CameraManager的CreateCaptureSession接口創(chuàng)建采集會話。CameraManager創(chuàng)建采集會話,是通過serviceProxy_->CreateCaptureSession方式進(jìn)行調(diào)用,這里涉及到了OpenHarmony中的IPC的調(diào)用,serviceProxy_是遠(yuǎn)端服務(wù)在本地的代理,通過這個代理可以調(diào)用到具體的服務(wù)端,這里是HCameraService。
sptr CameraManager::CreateCaptureSession()
{
    CAMERA_SYNC_TRACE;
    sptr captureSession = nullptr;
    sptr result = nullptr;
    int32_t retCode = CAMERA_OK;


    if (serviceProxy_ == nullptr) {
        MEDIA_ERR_LOG("CameraManager::CreateCaptureSession serviceProxy_ is null");
        return nullptr;
    }
    retCode = serviceProxy_->CreateCaptureSession(captureSession);
    if (retCode == CAMERA_OK && captureSession != nullptr) {
        result = new(std::nothrow) CaptureSession(captureSession);
        if (result == nullptr) {
            MEDIA_ERR_LOG("Failed to new CaptureSession");
        }
    } else {
        MEDIA_ERR_LOG("Failed to get capture session object from hcamera service!, %{public}d", retCode);
    }
    return result;
}
代碼最終來到HCameraService::CreateCaptureSession中,該方法中new了一個HCaptureSession對象,并且將該對象傳遞給了參數(shù)session,所以前面的captureSession對象就是這里new出來的HCaptureSession,前面的CameraManager的CreateCaptureSession()方法中將captureSession封裝成CaptureSession對象返回給應(yīng)用層使用。
int32_t HCameraService::CreateCaptureSession(sptr &session)
{
    CAMERA_SYNC_TRACE;
    sptr captureSession;
    if (streamOperatorCallback_ == nullptr) {
        streamOperatorCallback_ = new(std::nothrow) StreamOperatorCallback();
        if (streamOperatorCallback_ == nullptr) {
            MEDIA_ERR_LOG("HCameraService::CreateCaptureSession streamOperatorCallback_ allocation failed");
            return CAMERA_ALLOC_ERROR;
        }
    }


    std::lock_guard lock(mutex_);
    OHOS::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
    captureSession = new(std::nothrow) HCaptureSession(cameraHostManager_, streamOperatorCallback_, callerToken);
    if (captureSession == nullptr) {
        MEDIA_ERR_LOG("HCameraService::CreateCaptureSession HCaptureSession allocation failed");
        return CAMERA_ALLOC_ERROR;
    }
    session = captureSession;
    return CAMERA_OK;
}
4. 開始配置采集會話調(diào)用CaptureSession的BeginConfig進(jìn)行采集會話的配置工作。這個工作最終調(diào)用到被封裝的HCaptureSession中。
int32_t HCaptureSession::BeginConfig()
{
    CAMERA_SYNC_TRACE;
    if (curState_ == CaptureSessionState::SESSION_CONFIG_INPROGRESS) {
        MEDIA_ERR_LOG("HCaptureSession::BeginConfig Already in config inprogress state!");
        return CAMERA_INVALID_STATE;
    }
    std::lock_guard lock(sessionLock_);
    prevState_ = curState_;
    curState_ = CaptureSessionState::SESSION_CONFIG_INPROGRESS;
    tempCameraDevices_.clear();
    tempStreams_.clear();
    deletedStreamIds_.clear();
    return CAMERA_OK;
}
5. 創(chuàng)建CameraInput應(yīng)用層通過camManagerObj->CreateCameraInput(cameraObjList[0])的方式進(jìn)行CameraInput的創(chuàng)建,cameraObjList[0]就是前面獲取支持設(shè)備的第一個。根據(jù)CameraDevice創(chuàng)建對應(yīng)的CameraInput對象。
sptr CameraManager::CreateCameraInput(sptr &camera)
{
    CAMERA_SYNC_TRACE;
    sptr cameraInput = nullptr;
    sptr deviceObj = nullptr;


    if (camera != nullptr) {
        deviceObj = CreateCameraDevice(camera->GetID());
        if (deviceObj != nullptr) {
            cameraInput = new(std::nothrow) CameraInput(deviceObj, camera);
            if (cameraInput == nullptr) {
                MEDIA_ERR_LOG("failed to new CameraInput Returning null in CreateCameraInput");
                return cameraInput;
            }
        } else {
            MEDIA_ERR_LOG("Returning null in CreateCameraInput");
        }
    } else {
        MEDIA_ERR_LOG("CameraManager: Camera object is null");
    }
    return cameraInput;
}
6. 開啟CameraInput調(diào)用了CameraInput的Open方法,進(jìn)行輸入設(shè)備的啟動打開。
void CameraInput::Open()
{
    int32_t retCode = deviceObj_->Open();
    if (retCode != CAMERA_OK) {
        MEDIA_ERR_LOG("Failed to open Camera Input, retCode: %{public}d", retCode);
    }
}
7. 添加CameraInput實例到采集會話中通過調(diào)用captureSession的AddInput方法,將創(chuàng)建的CameraInput對象添加到采集會話的輸入中,這樣采集會話就知道采集輸入的設(shè)備。
int32_t CaptureSession::AddInput(sptr &input)
{
    CAMERA_SYNC_TRACE;
    if (input == nullptr) {
        MEDIA_ERR_LOG("CaptureSession::AddInput input is null");
        return CAMERA_INVALID_ARG;
    }
    input->SetSession(this);
    inputDevice_ = input;
    return captureSession_->AddInput(((sptr &)input)->GetCameraDevice());
}
最終調(diào)用到HCaptureSession的AddInput方法,該方法中核心的代碼是tempCameraDevices_.emplace_back(localCameraDevice),將需要添加的CameraDevice插入到tempCameraDevices_容器中。
int32_t HCaptureSession::AddInput(sptr cameraDevice)
{
    CAMERA_SYNC_TRACE;
    sptr localCameraDevice = nullptr;


    if (cameraDevice == nullptr) {
        MEDIA_ERR_LOG("HCaptureSession::AddInput cameraDevice is null");
        return CAMERA_INVALID_ARG;
    }
    if (curState_ != CaptureSessionState::SESSION_CONFIG_INPROGRESS) {
        MEDIA_ERR_LOG("HCaptureSession::AddInput Need to call BeginConfig before adding input");
        return CAMERA_INVALID_STATE;
    }
    if (!tempCameraDevices_.empty() || (cameraDevice_ != nullptr && !cameraDevice_->IsReleaseCameraDevice())) {
        MEDIA_ERR_LOG("HCaptureSession::AddInput Only one input is supported");
        return CAMERA_INVALID_SESSION_CFG;
    }
    localCameraDevice = static_cast(cameraDevice.GetRefPtr());*>
    if (cameraDevice_ == localCameraDevice) {
        cameraDevice_->SetReleaseCameraDevice(false);
    } else {
        tempCameraDevices_.emplace_back(localCameraDevice);
        CAMERA_SYSEVENT_STATISTIC(CreateMsg("CaptureSession::AddInput"));
    }


    sptr streamOperator;
    int32_t rc = localCameraDevice->GetStreamOperator(streamOperatorCallback_, streamOperator);
    if (rc != CAMERA_OK) {
        MEDIA_ERR_LOG("HCaptureSession::GetCameraDevice GetStreamOperator returned %{public}d", rc);
        localCameraDevice->Close();
        return rc;
    }
    return CAMERA_OK;
}
8. 創(chuàng)建Video的Surface通過Surface::CreateSurfaceAsConsumer創(chuàng)建Surface。
sptr Surface::string name, bool isShared)
{
    sptr surf = new ConsumerSurface(name, isShared);
    GSError ret = surf->Init();
    if (ret != GSERROR_OK) {
        BLOGE("Failure, Reason: consumer surf init failed");
        return nullptr;
    }
    return surf;
}
9. 創(chuàng)建VideoOutput實例通過調(diào)用CameraManager的CreateVideoOutput來創(chuàng)建VideoOutput實例。
sptr CameraManager::CreateVideoOutput(VideoProfile &profile, sptr &surface)
{
    CAMERA_SYNC_TRACE;
    sptr streamRepeat = nullptr;
    sptr result = nullptr;
    int32_t retCode = CAMERA_OK;
    camera_format_t metaFormat;


    metaFormat = GetCameraMetadataFormat(profile.GetCameraFormat());
    retCode = serviceProxy_->CreateVideoOutput(surface->GetProducer(), metaFormat,
                                               profile.GetSize().width, profile.GetSize().height, streamRepeat);
    if (retCode == CAMERA_OK) {
        result = new(std::nothrow) VideoOutput(streamRepeat);
        if (result == nullptr) {
            MEDIA_ERR_LOG("Failed to new VideoOutput");
        } else {
            std::vector videoFrameRates = profile.GetFrameRates();
            if (videoFrameRates.size() >= 2) { // vaild frame rate range length is 2
                result->SetFrameRateRange(videoFrameRates[0], videoFrameRates[1]);
            }
            POWERMGR_SYSEVENT_CAMERA_CONFIG(VIDEO,
                                            profile.GetSize().width,
                                            profile.GetSize().height);
        }
    } else {
        MEDIA_ERR_LOG("VideoOutpout: Failed to get stream repeat object from hcamera service! %{public}d", retCode);
    }
    return result;
}
該方法中通過IPC的調(diào)用最終調(diào)用到了HCameraService的CreateVideoOutput(surface->GetProducer(), format, streamRepeat)。
int32_t HCameraService::CreateVideoOutput(const sptr &producer, int32_t format,
                                          int32_t width, int32_t height,
                                          sptr &videoOutput)
{
    CAMERA_SYNC_TRACE;
    sptr streamRepeatVideo;


    if ((producer == nullptr) || (width == 0) || (height == 0)) {
        MEDIA_ERR_LOG("HCameraService::CreateVideoOutput producer is null");
        return CAMERA_INVALID_ARG;
    }
    streamRepeatVideo = new(std::nothrow) HStreamRepeat(producer, format, width, height, true);
    if (streamRepeatVideo == nullptr) {
        MEDIA_ERR_LOG("HCameraService::CreateVideoOutput HStreamRepeat allocation failed");
        return CAMERA_ALLOC_ERROR;
    }
    POWERMGR_SYSEVENT_CAMERA_CONFIG(VIDEO, producer->GetDefaultWidth(),
                                    producer->GetDefaultHeight());
    videoOutput = streamRepeatVideo;
    return CAMERA_OK;
}
HCameraService的CreateVideoOutput方法中主要創(chuàng)建了HStreamRepeat,并且通過參數(shù)傳遞給前面的CameraManager使用,CameraManager通過傳遞的HStreamRepeat對象,進(jìn)行封裝,創(chuàng)建出VideoOutput對象。 10. 添加videoOutput到采集會話中,并且提交采集會話該步驟類似添加CameraInput到采集會話的過程,可以參考前面的流程。 11. 開始錄制通過調(diào)用VideoOutput的Start進(jìn)行錄制的操作。
int32_t VideoOutput::Start()
{
    return static_cast(GetStream().GetRefPtr())->Start();
}
該方法中會調(diào)用到HStreamRepeat的Start方法。
int32_t HStreamRepeat::Start()
{
    CAMERA_SYNC_TRACE;


    if (streamOperator_ == nullptr) {
        return CAMERA_INVALID_STATE;
    }
    if (curCaptureID_ != 0) {
        MEDIA_ERR_LOG("HStreamRepeat::Start, Already started with captureID: %{public}d", curCaptureID_);
        return CAMERA_INVALID_STATE;
    }
    int32_t ret = AllocateCaptureId(curCaptureID_);
    if (ret != CAMERA_OK) {
        MEDIA_ERR_LOG("HStreamRepeat::Start Failed to allocate a captureId");
        return ret;
    }
    std::vector ability;
    OHOS::ConvertMetadataToVec(cameraAbility_, ability);
    CaptureInfo captureInfo;
    captureInfo.streamIds_ = {streamId_};
    captureInfo.captureSetting_ = ability;
    captureInfo.enableShutterCallback_ = false;
    MEDIA_INFO_LOG("HStreamRepeat::Start Starting with capture ID: %{public}d", curCaptureID_);
    CamRetCode rc = (CamRetCode)(streamOperator_->Capture(curCaptureID_, captureInfo, true));
    if (rc != HDI::NO_ERROR) {
        ReleaseCaptureId(curCaptureID_);
        curCaptureID_ = 0;
        MEDIA_ERR_LOG("HStreamRepeat::Start Failed with error Code:%{public}d", rc);
        ret = HdiToServiceError(rc);
    }
    return ret;
}
核心的代碼是streamOperator_->Capture,其中最后一個參數(shù)true,表示采集連續(xù)數(shù)據(jù)。 12. 錄制結(jié)束,保存錄制文件

六、總結(jié)

本文主要對OpenHarmony 3.2 Beta多媒體子系統(tǒng)的視頻錄制進(jìn)行介紹,首先梳理了整體的錄制流程,然后對錄制過程中的主要步驟進(jìn)行了詳細(xì)地分析。視頻錄制主要分為以下幾個步驟:(1) 獲取CameraManager實例。(2) 創(chuàng)建采集會話CaptureSession。(3) 創(chuàng)建CameraInput實例,并且將輸入設(shè)備添加到CaptureSession中。(4) 創(chuàng)建Video錄制需要的Surface。(5) 創(chuàng)建VideoOutput實例,并且將輸出添加到CaptureSession中。(6) 提交采集會話的配置。(7) 調(diào)用VideoOutput的Start方法,進(jìn)行視頻的錄制。(8) 錄制結(jié)束,保存錄制的文件。 關(guān)于OpenHarmony 3.2 Beta多媒體系列開發(fā),我之前還分享過《OpenHarmony 3.2 Beta源碼分析之MediaLibrary》《OpenHarmony 3.2 Beta多媒體系列——音視頻播放框架》《OpenHarmony 3.2 Beta多媒體系列——音視頻播放gstreamer》這幾篇文章,歡迎感興趣的開發(fā)者進(jìn)行閱讀。

THE END

推薦閱讀

點擊圖片即可閱讀

caaae64c-a8f1-11ed-bfe3-dac502259ad0.png

關(guān)注深開鴻

了解更多資訊

cae54468-a8f1-11ed-bfe3-dac502259ad0.jpg

深開鴻公眾號

cb10541e-a8f1-11ed-bfe3-dac502259ad0.jpg

深開鴻視頻號

深圳開鴻數(shù)字產(chǎn)業(yè)發(fā)展有限公司(簡稱“深開鴻”)于2021年成立于中國深圳,以數(shù)字化、智慧化改變?nèi)祟惖纳a(chǎn)和生活方式為愿景,專注于自主軟件根技術(shù)的研發(fā)與持續(xù)創(chuàng)新,致力于打造萬物智聯(lián)核心技術(shù)、定義萬物智聯(lián)標(biāo)準(zhǔn)、引領(lǐng)萬物智聯(lián)時代發(fā)展。

深開鴻基于OpenHarmony,創(chuàng)新打造互通互聯(lián)互享的KaihongOS數(shù)字底座,上承可視可管可控的超級設(shè)備管理平臺,靈活擴展,柔性組合,聚合成全場景超級設(shè)備解決方案,實現(xiàn)更大范圍的以軟件定義硬件,引領(lǐng)智慧基建、智慧康養(yǎng)、智慧能源、智慧交通、智慧制造、智慧政務(wù)、智慧金融、智慧教育等多個行業(yè)變革,賦能、賦智、賦值千行百業(yè)的數(shù)智化轉(zhuǎn)型。

從開源中來,到行業(yè)中去,深開鴻以構(gòu)筑行業(yè)數(shù)字化生態(tài)、培養(yǎng)生態(tài)人才為己任,持續(xù)突破行業(yè)邊界,立志成為萬物智聯(lián)時代的“國之重器”。

以數(shù)字化、智慧化改變?nèi)祟惖纳a(chǎn)和生活方式

點擊在看和點贊,與更多的美好相遇 ↓


原文標(biāo)題:OpenHarmony 3.2 Beta多媒體系列——視頻錄制

文章出處:【微信公眾號:深開鴻】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 深開鴻
    +關(guān)注

    關(guān)注

    1

    文章

    409

    瀏覽量

    3350

原文標(biāo)題:OpenHarmony 3.2 Beta多媒體系列——視頻錄制

文章出處:【微信號:gh_15d2f062a168,微信公眾號:深開鴻】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    探索TMDS261B:高清多媒體接口開關(guān)的卓越之選

    探索TMDS261B:高清多媒體接口開關(guān)的卓越之選 在當(dāng)今數(shù)字化的時代,高清視頻多媒體應(yīng)用無處不在,對于高質(zhì)量數(shù)字視頻接口開關(guān)的需求也日益增長。TI(德州儀器)推出的TMDS261B
    的頭像 發(fā)表于 01-14 14:30 ?216次閱讀

    華陽多媒體榮獲2025汽車工業(yè)扶輪獎之汽車行業(yè)智能制造標(biāo)桿獎

    12月5日,“汽車工業(yè)扶輪獎”頒獎典禮在上海舉行。經(jīng)機械工業(yè)信息研究院《汽車制造業(yè)》2025“汽車工業(yè)扶輪獎”評委會最終評定,ADAYO華陽集團旗下全資子公司華陽多媒體打造的“ADAYO智能制造體系”,成功斬獲“汽車行業(yè)智能制造標(biāo)桿獎”榮譽稱號。
    的頭像 發(fā)表于 12-12 17:42 ?1406次閱讀

    基于兆易創(chuàng)新GD32F527系列MCU的多媒體門禁系統(tǒng)解決方案

    基于GD32F527系列MCU的多媒體門禁系統(tǒng),主控GD32F527系列MCU,具備攝像頭采集圖像(DMA直接到SDRAM),保存照片,查看照片。DCI數(shù)字圖像接口、TLI接口驅(qū)動TFT-LCD屏幕
    的頭像 發(fā)表于 10-29 11:37 ?7131次閱讀
    基于兆易創(chuàng)新GD32F527<b class='flag-5'>系列</b>MCU的<b class='flag-5'>多媒體</b>門禁系統(tǒng)解決方案

    一款面向便攜式多媒體應(yīng)用的高品質(zhì)立體聲數(shù)模轉(zhuǎn)換器 (DAC) 芯片

    便攜式多媒體播放器(Portable Media Player),簡稱PMP,是集音視頻播放、圖片瀏覽與數(shù)據(jù)存儲功能于一體的手持設(shè)備。
    的頭像 發(fā)表于 09-04 10:00 ?968次閱讀
    一款面向便攜式<b class='flag-5'>多媒體</b>應(yīng)用的高品質(zhì)立體聲數(shù)模轉(zhuǎn)換器 (DAC) 芯片

    花椒直播首次開源推流器組件 為鴻蒙開發(fā)者提供高性能推流解決方案

    器。該工具基于花椒直播自主通用多媒體框架HJMedia打造而來,采用創(chuàng)新的通用多媒體框架設(shè)計,以高度模塊化、可擴展的插件化架構(gòu),極大提升了音視頻功能開發(fā)效率與整體的資源利用率,為開發(fā)者提供高性能、低耦合的推流解決方案。 在直播、
    的頭像 發(fā)表于 09-04 09:52 ?684次閱讀
    花椒直播首次開源推流器組件 為鴻蒙開發(fā)者提供高性能推流解決方案

    基于開源鴻蒙的AVPlayer視頻播控開發(fā)樣例

    在開源鴻蒙生態(tài)建設(shè)中,多媒體能力是構(gòu)建豐富用戶體驗的核心要素。本開發(fā)樣例基于AVPlayer實現(xiàn),AvPlayer支持流媒體和本地資源解析、媒體資源解封裝、視頻解碼和渲染功能,適用于對
    的頭像 發(fā)表于 08-21 10:22 ?2817次閱讀
    基于開源鴻蒙的AVPlayer<b class='flag-5'>視頻</b>播控開發(fā)樣例

    深蕾半導(dǎo)體喜獲多媒體內(nèi)容分析與控制輸出相關(guān)的技術(shù)發(fā)明專利!

    我們自主研發(fā)的多媒體內(nèi)容分析與控制輸出技術(shù)獲得國家發(fā)明專利授權(quán)。該技術(shù)融合深度學(xué)習(xí)和芯片優(yōu)化,通過雙分支(文字+圖像)智能分析,實現(xiàn)毫秒級視頻內(nèi)容識別與管控,大幅提升審核準(zhǔn)確率。技術(shù)適用于直播、安防監(jiān)控、內(nèi)容平臺等實時視頻場景,
    的頭像 發(fā)表于 08-07 09:37 ?607次閱讀
    深蕾半導(dǎo)體喜獲<b class='flag-5'>多媒體</b>內(nèi)容分析與控制輸出相關(guān)的技術(shù)發(fā)明專利!

    【潤開鴻HH-SCDAYU800A開發(fā)板試用體驗】開箱評測報告

    hdc連接和調(diào)試。 **** 開發(fā)板 簡介:作為國產(chǎn)RISC-V+OpenHarmony+星閃技術(shù)的融合之作,支持DeepSeek,填補了高性能邊緣計算開發(fā)板的市場空白。其4TOPs算力、4K多媒體
    發(fā)表于 07-23 09:21

    青少年法治教育中心多媒體展廳建設(shè)方案

    在全面依法治國的時代背景下,青少年法治教育已成為國家治理體系現(xiàn)代化的重要環(huán)節(jié)。然而,傳統(tǒng)法治教育模式存在內(nèi)容抽象、互動性不足等問題,難以激發(fā)青少年學(xué)習(xí)興趣。米禾數(shù)字依托多年在數(shù)字展示與多媒體互動領(lǐng)域
    的頭像 發(fā)表于 07-09 17:01 ?602次閱讀
    青少年法治教育中心<b class='flag-5'>多媒體</b>展廳建設(shè)方案

    【嘉楠堪智K230開發(fā)板試用體驗】+ 視頻錄制測試

    本次視頻錄制測試,使用板載的攝像頭進(jìn)行視頻錄制,使用板載的按鍵進(jìn)行視頻錄制的開始和停止。 fro
    發(fā)表于 07-06 15:21

    傳音多媒體團隊攬獲CVPR NTIRE 2025兩項挑戰(zhàn)賽冠亞軍,推動視頻畫質(zhì)升級

    近日,在計算機視覺領(lǐng)域最具影響力的國際競賽CVPRNTIRE2025中,傳音多媒體團隊與上海交通大學(xué)圖像所MediaLab聯(lián)合團隊分別斬獲高效超分辨率挑戰(zhàn)賽
    的頭像 發(fā)表于 06-24 17:03 ?914次閱讀
    傳音<b class='flag-5'>多媒體</b>團隊攬獲CVPR NTIRE 2025兩項挑戰(zhàn)賽冠亞軍,推動<b class='flag-5'>視頻</b>畫質(zhì)升級

    MAX9249多媒體串行鏈路串行器,帶有LVDS系統(tǒng)接口技術(shù)手冊

    MAX9249串行器帶有LVDS系統(tǒng)接口,采用Maxim吉比特多媒體串行鏈路(GMSL)技術(shù)。MAX9249串行器與GMSL解串器配合使用,構(gòu)成完整的數(shù)字串行鏈路,實現(xiàn)高速視頻、音頻和控制數(shù)據(jù)的傳輸。
    的頭像 發(fā)表于 05-28 16:43 ?1059次閱讀
    MAX9249<b class='flag-5'>多媒體</b>串行鏈路串行器,帶有LVDS系統(tǒng)接口技術(shù)手冊

    MAX9268多媒體串行鏈路解串器,具有LVDS系統(tǒng)接口技術(shù)手冊

    MAX9268解串器采用Maxim吉比特多媒體串行鏈路(GMSL)技術(shù),具有LVDS系統(tǒng)接口,可有效減少引腳數(shù)、縮小封裝面積,器件可以與任意一款GMSL串行器配合使用,構(gòu)成完整的數(shù)字串行鏈路,實現(xiàn)高速視頻、音頻和雙向控制數(shù)據(jù)的傳輸。
    的頭像 發(fā)表于 05-28 16:38 ?1113次閱讀
    MAX9268<b class='flag-5'>多媒體</b>串行鏈路解串器,具有LVDS系統(tǒng)接口技術(shù)手冊

    MAX9266 HDCP多媒體串行鏈路解串器,帶有LVDS系統(tǒng)接口技術(shù)手冊

    MAX9266多媒體串行鏈路(GMSL)解串器帶有LVDS系統(tǒng)接口和寬帶數(shù)字內(nèi)容保護(hù)(HDCP)加密,用于DVD和Blu-ray?視頻及音頻數(shù)據(jù)保護(hù)。該款解串器配合任何HDCP-GMSL串行器,構(gòu)成
    的頭像 發(fā)表于 05-28 16:05 ?1301次閱讀
    MAX9266 HDCP<b class='flag-5'>多媒體</b>串行鏈路解串器,帶有LVDS系統(tǒng)接口技術(shù)手冊

    高校智慧教室多媒體教學(xué)設(shè)備介紹

    在當(dāng)今的教育環(huán)境中,隨著信息技術(shù)的快速發(fā)展和應(yīng)用,智慧教室已成為高校教育改革的重要標(biāo)志。廣凌科技(廣凌股份)深知在智慧教室建設(shè)方案中,多媒體教學(xué)設(shè)備的重要性,這不僅關(guān)系到教學(xué)質(zhì)量的提升,也直接影響
    的頭像 發(fā)表于 05-06 09:20 ?1597次閱讀
    高校智慧教室<b class='flag-5'>多媒體</b>教學(xué)設(shè)備介紹