在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

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

電子發(fā)燒友開源社區(qū) ? 來源:未知 ? 2023-02-15 15:55 ? 次閱讀

一、簡介

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

二、目錄

foundation/multimedia/camera_framework

├── frameworks
│ ├── js
│ │ └── camera_napi #napi實(shí)現(xiàn)
│ │ └── src
│ │ ├── input #Camera輸入
│ │ ├── output #Camera輸出
│ │ └── session #會話管理
│ └── native #native實(shí)現(xiàn)
│ └── camera
│ ├── BUILD.gn
│ ├── src
│ │ ├── input #Camera輸入
│ │ ├── output #Camera輸出
│ │ └── session #會話管理
├── interfaces #接口定義
│ ├── inner_api #內(nèi)部native實(shí)現(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

三、錄制的總體流程



四、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實(shí)例
sptr camManagerObj = CameraManager::GetInstance();


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


// 獲取支持的相機(jī)設(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實(shí)例到采集會話中
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實(shí)例
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模塊支持的能力來實(shí)現(xiàn),其中涉及幾個(gè)重要的類:CaptureSession、CameraInput、VideoOutput。CaptureSession是整個(gè)過程的控制者,CameraInput和VideoOutput相當(dāng)于是設(shè)備的輸入和輸出。

五、調(diào)用流程


后續(xù)主要針對上面的調(diào)用流程,梳理具體的調(diào)用流程,方便我們對了解視頻錄制的整理架構(gòu)有一個(gè)更加深入的了解。

  1. 創(chuàng)建CameraManager實(shí)例

通過CameraManager::GetInstance()獲取CameraManager的實(shí)例,后續(xù)的一些接口都是通過該實(shí)例進(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_;
}

  1. 獲取支持的相機(jī)設(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;
}

  1. 創(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ù)在本地的代理,通過這個(gè)代理可以調(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了一個(gè)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;
}

  1. 開始配置采集會話

調(diào)用CaptureSession的BeginConfig進(jìn)行采集會話的配置工作。這個(gè)工作最終調(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;
}

  1. 創(chuàng)建CameraInput

應(yīng)用層通過camManagerObj->CreateCameraInput(cameraObjList[0])的方式進(jìn)行CameraInput的創(chuàng)建,cameraObjList[0]就是前面獲取支持設(shè)備的第一個(gè)。根據(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;
}

  1. 開啟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);
}
}

  1. 添加CameraInput實(shí)例到采集會話中

通過調(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;
}

  1. 創(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;
}

  1. 創(chuàng)建VideoOutput實(shí)例

通過調(diào)用CameraManager的CreateVideoOutput來創(chuàng)建VideoOutput實(shí)例。

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)。

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;
}

HCameraService的CreateVideoOutput方法中主要創(chuàng)建了HStreamRepeat,并且通過參數(shù)傳遞給前面的CameraManager使用,CameraManager通過傳遞的HStreamRepeat對象,進(jìn)行封裝,創(chuàng)建出VideoOutput對象。

  1. 添加videoOutput到采集會話中,并且提交采集會話

該步驟類似添加CameraInput到采集會話的過程,可以參考前面的流程。

  1. 開始錄制

通過調(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,其中最后一個(gè)參數(shù)true,表示采集連續(xù)數(shù)據(jù)。

  1. 錄制結(jié)束,保存錄制文件


六、總結(jié)

本文主要對OpenHarmony 3.2 Beta多媒體子系統(tǒng)的視頻錄制進(jìn)行介紹,首先梳理了整體的錄制流程,然后對錄制過程中的主要步驟進(jìn)行了詳細(xì)地分析。視頻錄制主要分為以下幾個(gè)步驟:

(1) 獲取CameraManager實(shí)例。

(2) 創(chuàng)建采集會話CaptureSession。

3) 創(chuàng)建CameraInput實(shí)例,并且將輸入設(shè)備添加到CaptureSession中。

4) 創(chuàng)建Video錄制需要的Surface。

(5) 創(chuàng)建VideoOutput實(shí)例,并且將輸出添加到CaptureSession中。

6) 提交采集會話的配置。

(7) 調(diào)用VideoOutput的Start方法,進(jìn)行視頻的錄制。

(8) 錄制結(jié)束,保存錄制的文件。



更多熱點(diǎn)文章閱讀
  • 基于 OpenHarmony 的智能電磁炮
  • 【我的2022】堅(jiān)果:我和OpenHarmony的這一年
  • OpenHarmony小型系統(tǒng)兼容性測試指南
  • 玩轉(zhuǎn)OpenHarmony社交場景:即時(shí)通訊平臺
  • 龍芯 2K500 開發(fā)板 Linux環(huán)境基礎(chǔ)調(diào)教和使用


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

文章出處:【微信公眾號:電子發(fā)燒友開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

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

    關(guān)注

    33

    文章

    563

    瀏覽量

    33425
  • 開源社區(qū)
    +關(guān)注

    關(guān)注

    0

    文章

    95

    瀏覽量

    597

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

文章出處:【微信號:HarmonyOS_Community,微信公眾號:電子發(fā)燒友開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

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

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

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

    【北京迅為】itop-3568 開發(fā)板openharmony鴻蒙燒寫及測試-第2章OpenHarmony v3.2-Beta4版本測試

    【北京迅為】itop-3568 開發(fā)板openharmony鴻蒙燒寫及測試-第2章OpenHarmony v3.2-Beta4版本測試
    的頭像 發(fā)表于 03-05 10:53 ?376次閱讀
    【北京迅為】itop-3568 開發(fā)板<b class='flag-5'>openharmony</b>鴻蒙燒寫及測試-第2章<b class='flag-5'>OpenHarmony</b> v<b class='flag-5'>3.2-Beta</b>4版本測試

    多媒體信息發(fā)布系統(tǒng):智慧電梯的“信息樞紐”

    在數(shù)字化時(shí)代,多媒體信息發(fā)布系統(tǒng)正逐漸成為電梯智能化管理的重要組成部分。通過整合多種媒體形式,這一系統(tǒng)不僅提升了電梯的使用體驗(yàn),還為電梯的安全管理和運(yùn)營提供了有力支持。 一、多媒體信息發(fā)布系統(tǒng)的功能
    的頭像 發(fā)表于 02-21 17:34 ?370次閱讀

    RK616多媒體處理芯片特性解析

    體驗(yàn)。 在輸入接口方面,RK616支持兩個(gè)24位RGB輸入,能夠接收高質(zhì)量的視頻信號,確保圖像處理的精準(zhǔn)度和清晰度。這一特性使得RK616在圖像處理、顯示控制等多媒體應(yīng)用中表現(xiàn)出色。 在輸出接口上,RK616配備了單LVDS輸出,支持高分辨率的液晶顯示,為用戶提供清
    的頭像 發(fā)表于 02-11 17:32 ?755次閱讀

    RK618多媒體處理芯片特性概覽

    RK618是一款專為多媒體應(yīng)用設(shè)計(jì)的處理芯片,它集成了多種輸入輸出接口和嵌入式音頻編解碼器,為用戶提供了全面的多媒體處理解決方案。 在輸入接口方面,RK618支持兩個(gè)24位RGB輸入,能夠接收高質(zhì)量
    的頭像 發(fā)表于 02-11 17:26 ?1025次閱讀

    RK3326處理器:高效能多媒體處理核心

    RK3326是一款功能強(qiáng)大的處理器,專為高效能多媒體應(yīng)用而設(shè)計(jì)。其主要特性概述如下: 四核高性能CPU:搭載四核Cortex-A35處理器,主頻高達(dá)1.5GHz,提供出色的處理能力和能效比。 先進(jìn)
    的頭像 發(fā)表于 02-07 18:21 ?1726次閱讀

    OMAP5912多媒體處理器中斷參考指南

    電子發(fā)燒友網(wǎng)站提供《OMAP5912多媒體處理器中斷參考指南.pdf》資料免費(fèi)下載
    發(fā)表于 12-17 16:25 ?0次下載
    OMAP5912<b class='flag-5'>多媒體</b>處理器中斷參考指南

    OMAP5912多媒體處理器時(shí)鐘參考指南

    電子發(fā)燒友網(wǎng)站提供《OMAP5912多媒體處理器時(shí)鐘參考指南.pdf》資料免費(fèi)下載
    發(fā)表于 12-17 16:17 ?0次下載
    OMAP5912<b class='flag-5'>多媒體</b>處理器時(shí)鐘參考指南

    @視覺工程師丨15分鐘上手《AIDI3.2腳本開發(fā)教程》視頻,請查收!

    平臺軟件的實(shí)際應(yīng)用,阿丘科技針對AIDI3.2版的功能特性,推出全新系列課——《AIDI3.2腳本開發(fā)教程》視頻!該教程視頻由阿丘科技算法總
    的頭像 發(fā)表于 11-09 01:06 ?799次閱讀
    @視覺工程師丨15分鐘上手《AIDI<b class='flag-5'>3.2</b>腳本開發(fā)教程》<b class='flag-5'>視頻</b>,請查收!

    dm368錄制視頻后用vlc播放不同步是怎么回事?

    目前我們用其他的開發(fā)板 能夠錄制視頻,但是用vlc播放的時(shí)候發(fā)現(xiàn)每次都是視頻播放完成了音頻還要播放一會,隨著錄制時(shí)間加上,延后的這個(gè)時(shí)間也會變長 請問有知道怎么回事的嗎?
    發(fā)表于 10-15 06:56

    安謀科技自研“玲瓏”多媒體家族再添新軍,加速超高清顯示和端邊云視頻應(yīng)用落地

    9月19日,安謀科技在北京召開新品發(fā)布媒體溝通會,正式亮出本土自研多媒體產(chǎn)品矩陣的最新力作——首款“玲瓏”D8/D6/D2顯示處理器和新一代的“玲瓏”V510/V710視頻處理器,為當(dāng)前終端市場超高畫質(zhì)顯示、超高清
    的頭像 發(fā)表于 09-25 15:00 ?3559次閱讀
    安謀科技自研“玲瓏”<b class='flag-5'>多媒體</b>家族再添新軍,加速超高清顯示和端邊云<b class='flag-5'>視頻</b>應(yīng)用落地

    基于ArkTS語言的OpenHarmony APP應(yīng)用開發(fā):多媒體管理2

    視頻開始播放。再次點(diǎn)擊視頻進(jìn)入視頻全屏頁。首頁下滑500vp后,視頻小窗口化。4.點(diǎn)擊直播按鈕進(jìn)入直播頁,上下滑動視頻。本案例已在
    的頭像 發(fā)表于 09-21 08:06 ?760次閱讀
    基于ArkTS語言的<b class='flag-5'>OpenHarmony</b> APP應(yīng)用開發(fā):<b class='flag-5'>多媒體</b>管理2

    基于ArkTS語言的OpenHarmony APP應(yīng)用開發(fā):多媒體管理2

    播放按鈕,視頻開始播放。再次點(diǎn)擊視頻進(jìn)入視頻全屏頁。 首頁下滑500vp后,視頻小窗口化。 4.點(diǎn)擊直播按鈕進(jìn)入直播頁,上下滑動視頻。 本案
    發(fā)表于 09-20 13:47

    基于ArkTS語言的OpenHarmony APP應(yīng)用開發(fā):多媒體管理

    1、程序介紹 本示例展示了視頻組件的基本功能,以及如何控制播放狀態(tài)的相關(guān)能力,包括視頻切換、封面切換、播放、暫停等。 本案例已在OpenHarmony凌蒙派-RK3568開發(fā)板驗(yàn)證通過,具體代碼可
    發(fā)表于 09-19 15:50

    AM62A上的多媒體應(yīng)用

    電子發(fā)燒友網(wǎng)站提供《AM62A上的多媒體應(yīng)用.pdf》資料免費(fèi)下載
    發(fā)表于 08-29 11:52 ?0次下載
    AM62A上的<b class='flag-5'>多媒體</b>應(yīng)用
    主站蜘蛛池模板: 狠狠色噜噜狠狠狠狠91 | 正在播放欧美 | 亚洲成网777777国产精品 | 天天碰夜夜 | 九色精品在线 | 9984四虎永久免费网站 | 黄色免费网站在线观看 | 久久久午夜毛片免费 | 天堂电影免费在线观看 | 亚洲最色网站 | 欧美大狠狠大臿蕉香蕉大视频 | 久久精品亚瑟全部免费观看 | 波多野结衣一级特黄毛片 | 清朝荒淫牲艳史在线播放 | 久久久噜噜噜久久网 | 亚洲精品午夜久久aaa级久久久 | 天天操夜夜操夜夜操 | 国产乱辈通伦影片在线播放亚洲 | 一级aa 毛片高清免费看 | 九色综合九色综合色鬼 | 国产成人精品一区二区三区 | 日韩无| 涩涩涩综合在线亚洲第一 | 四虎影永久地址www 四虎影永久在线观看精品 四虎影永久在线观看网址 四虎影院.com | 激情文学综合网 | 五月婷婷丁香色 | 免费无码看av的网站 | 婷婷深爱五月 | 美女免费观看一区二区三区 | 国产特黄1级毛片 | 亚洲1页 | 天堂最新版中文网 | 五月天婷婷在线视频 | 97人人艹| 亚洲视频四区 | 国产成都一二三四区 | 无遮挡很爽很污很黄的网站w | 色天天躁夜夜躁天干天干 | 自拍偷拍福利视频 | 免播放器av少妇影院 | videosgratis欧美另类老太 |