通過多線程分別獲取高分辨率和低分辨率的H264碼流

目錄

一.RV1126 VI采集攝像頭數據并同時獲取高分辨率碼流和低分辨率碼流流程

?編輯

1.1初始化VI模塊:

1.2初始化RGA模塊:

1.3初始化高分辨率VENC編碼器、 低分辨率VENC編碼器:

1.4 VI綁定高分辨率VENC編碼器,VI綁定RGA模塊,偽代碼如下:

1.5 創建多線程獲取高分辨率編碼數據:

1.6 創建多線程獲取低分辨率數據并傳輸到編碼器:

1.7.創建多線程獲取低分辨率編碼數據:

三.運行的效果:


一.RV1126 VI采集攝像頭數據并同時獲取高分辨率碼流和低分辨率碼流流程

RV1126利用多線程同時獲取高分辨率編碼文件、低分辨率編碼文件,一般要分為上圖8個步驟:VI模塊初始化RGA圖像模塊初始化、高分辨率編碼器的初始化、低分辨率編碼器的初始化、VI綁定高分辨率VENC編碼器、創建多線程獲取高分辨率編碼數據、創建多線程獲取低分辨率數據并傳輸到編碼器、創建多線程獲取低分辨率編碼數據。

1.1初始化VI模塊:

VI模塊的初始化實際上就是對VI_CHN_ATTR_S的參數進行設置、然后調用RK_MPI_VI_SetChnAttr設置VI模塊并使能RK_MPI_VI_EnableChn,偽代碼如下:

VI_CHN_ATTR_S ?vi_chn_attr;

。。。。。。。。。。。。。。。(這里是設置VI的屬性)

ret = RK_MPI_VI_SetChnAttr(CAMERA_ID, 0, &vi_chn_attr);

ret |= RK_MPI_VI_EnableChn(CAMERA_ID, 0);

1.2初始化RGA模塊:

RGA主要的作用是縮放VI模塊的分辨率,比方說:VI模塊的分辨率1920 * 1080,經過RGA縮放后分辨率為1280 * 720,并利用RK_MPI_RGA_CreateChn創建RGA模塊,偽代碼如下:

RGA_ATTR_S rga_attr;

rga_attr.stImgIn.u32Width = 1920;

rga_attr.stImgIn.u32Height = 1080;

。。。。。。。。。

rga_attr.stImgOut.u32Width = 1280;

rga_attr.stImgOut.u32Height = 720;

。。。。。。。。。。。

RK_MPI_RGA_CreateChn(RGA_CHN_ID, &rga_attr);

這段代碼的核心是輸入圖像(輸入分辨率是原分辨率和VI模塊一致)和輸出分辨率(輸出分辨率是自己設置的分辨率)的設置。比方說輸入的分辨率是 : 1920*1080,那stImgIn.u32Width = 1920 、stImgIn.u32Height = 1080,輸出圖像成:1280 * 720,stImgOut.u32Width = 1280、stImgOut.u32Height = 720。

1.3初始化高分辨率VENC編碼器、 低分辨率VENC編碼器:

高分辨率編碼器的初始化

VENC_CHN_ATTR_S high_venc_chn_attr;

high_venc_chn_attr.stVencAttr.u32PicWidth = 1920;

high_venc_chn_attr.stVencAttr.u32PicHeight = 1080;

high_venc_chn_attr.stVencAttr.u32VirWidth = 1920;

high_venc_chn_attr.stVencAttr.u32VirHeight = 1080;

................................

RK_MPI_VENC_CreateChn(HIGH_VENC_CHN, &high_venc_chn_attr);

低分辨率編碼器的初始化

VENC_CHN_ATTR_S low_venc_chn_attr;

low_venc_chn_attr.stVencAttr.u32PicWidth = 1280;

low_venc_chn_attr.stVencAttr.u32PicHeight = 720;

low_venc_chn_attr.stVencAttr.u32VirWidth = 1280;

low_venc_chn_attr.stVencAttr.u32VirHeight = 720;

................................

RK_MPI_VENC_CreateChn(HIGH_VENC_CHN, &low_venc_chn_attr);

高分辨率和低分辨率最核心的設置就是分辨率的設置,高分辨率u32PicWidth = 1920、u32PicHeight = 1920,低分辨率u32PicWidth = 1280、u32PicHeight = 720

1.4 VI綁定高分辨率VENC編碼器,VI綁定RGA模塊,偽代碼如下:

//VI模塊綁定RGA模塊

MPP_CHN_S vi_chn_s;

vi_chn_s.enModId = RK_ID_VI;

vi_chn_s.s32ChnId = CAMERA_CHN;

MPP_CHN_S rga_chn_s;

rga_chn_s.enModId = RK_ID_RGA;

rga_chn_s.s32ChnId = RGA_CHN_ID;

RK_MPI_SYS_Bind(&vi_chn_s, &rga_chn_s);

//VI模塊綁定高分辨率VENC模塊

MPP_CHN_S high_venc_chn_s;

high_venc_chn_s_s.enModId = RK_ID_VENC;

high_venc_chn_s_s.s32ChnId = HIGH_VENC_ID;

RK_MPI_SYS_Bind(&vi_chn_s, &high_venc_chn_s);

1.5 創建多線程獲取高分辨率編碼數據:

開啟一個線程去采集每一幀高分辨率的VENC模塊數據,使用的API是RK_MPI_SYS_GetMediaBuffer, 模塊ID是RK_ID_VENC,通道號ID是高分辨率VENC創建的ID號:

while(1)

{

??.........................

??mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VENC, HIGH_VENC_ID, -1);

??fwrite(RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb), 1,high_venc_id);

.......................

}

1.6 創建多線程獲取低分辨率數據并傳輸到編碼器:

開啟一個線程去采集每一幀RGA低分辨率的數據,使用的API是RK_MPI_SYS_GetMediaBuffer, 模塊ID是RK_ID_RGA,通道號ID是RGA的通道ID,采集完每一幀RGA數據則使用RK_MPI_SYS_SendMediaBuffer傳輸到低分辨率編碼器這個API偽代碼如下

while (1)

{

.........................................

mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_RGA, 0, -1);

????RK_MPI_SYS_SendMediaBuffer(RK_ID_VENC, LOW_VENC_ID, mb);

................................

}

下面我們來看看RK_MPI_SYS_SendMediaBuffer的具體實現

RK_S32 RK_MPI_SYS_SendMediaBuffer(MOD_ID_E enModID, RK_S32 s32ChnID, MEDIA_BUFFER?buffer);

enModID:開發者需要傳輸的目的模塊的ID號,比方說VI模塊的數據傳輸到VENC模塊,那么目的模塊就是VENC,ID號就是RK_ID_VENC;比方說VI模塊的數據傳輸到RGA模塊,那么目的模塊就是RGA,ID號就是RK_ID_RGA。

s32ChnID:目的模塊的通道號

buffer:緩沖區數據MediaBuffer

1.7.創建多線程獲取低分辨率編碼數據:

開啟一個線程去采集每一幀低分辨率的編碼數據,使用的API是RK_MPI_SYS_GetMediaBuffer, 模塊ID是RK_ID_VENC,通道號ID是低分辨率VENC創建的ID號這個API偽代碼如下

while (1)

{

.........................................

mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VENC, LOW_VENC_ID, -1);

fwrite(RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb), 1, low_venc_file);

................................

}

二.代碼實戰

#include <assert.h>
#include <fcntl.h>
#include <getopt.h>
#include <pthread.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>// #include "common/sample_common.h"
#include "rkmedia_api.h"#define PIPE_ID 0
#define VI_CHN_ID 0#define RGA_CHN_ID 0#define HIGH_VENC_CHN 0
#define LOW_VENC_CHN 1//創建多線程獲取高分辨率的編碼碼流
void *get_high_venc_thread(void *args)
{pthread_detach(pthread_self());FILE *high_venc_file = fopen("test_high_venc.h264", "w+");MEDIA_BUFFER mb;while (1){//獲取每一幀高分辨率編碼碼流數據mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VENC, HIGH_VENC_CHN, -1);if (!mb){printf("Get High Venc break.....\n");}printf("Get High Venc Success.....\n");fwrite(RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb), 1, high_venc_file);RK_MPI_MB_ReleaseBuffer(mb);}return NULL;
}//創建多線程獲取RGA碼流并發送到低分辨率編碼器
void *rga_handle_thread(void *args)
{pthread_detach(pthread_self());MEDIA_BUFFER mb;while (1){//獲取每一幀RGA碼流數據mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_RGA, RGA_CHN_ID, -1);if (!mb){printf("Get RGA break.....\n");}printf("Get RGA Success.....\n");//發送每一幀RGA數據到低分辨率編碼器RK_MPI_SYS_SendMediaBuffer(RK_ID_VENC, LOW_VENC_CHN, mb);RK_MPI_MB_ReleaseBuffer(mb);}return NULL;
}//創建多線程獲取低分辨率編碼碼流
void *get_low_venc_thread(void *args)
{pthread_detach(pthread_self());MEDIA_BUFFER mb;FILE * low_venc_file = fopen("test_low_venc.h264", "w+");while (1){//獲取每一幀低分辨率編碼碼流mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VENC, LOW_VENC_CHN, -1);if (!mb){printf("Get LOW VENC break.....\n");}printf("Get LOW VENC Success.....\n");fwrite(RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb), 1, low_venc_file);RK_MPI_MB_ReleaseBuffer(mb);}return NULL;
}int main(int argc, char *argv[])
{int ret;RK_MPI_SYS_Init();// VI Init......VI_CHN_ATTR_S vi_chn_attr;vi_chn_attr.pcVideoNode = "rkispp_scale0";//設置視頻設備節點路徑vi_chn_attr.u32Width = 1920;//設置分辨率的寬度vi_chn_attr.u32Height = 1080;//設置分辨率的高度vi_chn_attr.enPixFmt = IMAGE_TYPE_NV12;//設置圖像類型vi_chn_attr.enBufType = VI_CHN_BUF_TYPE_MMAP;//設置VI獲取類型vi_chn_attr.u32BufCnt = 3;//設置緩沖數量vi_chn_attr.enWorkMode = VI_WORK_MODE_NORMAL;//設置VI工作類型ret = RK_MPI_VI_SetChnAttr(PIPE_ID, VI_CHN_ID, &vi_chn_attr);if (ret){printf("VI_CHN_ATTR Set Failed.....\n");return -1;}else{printf("VI_CHN_ATTR Set Success.....\n");}ret = RK_MPI_VI_EnableChn(PIPE_ID, VI_CHN_ID);if (ret){printf("VI_CHN_ATTR Enable Failed.....\n");return -1;}else{printf("VI_CHN_ATTR Enable Success.....\n");}// RGARGA_ATTR_S rga_info;/**Image Input ..............*/rga_info.stImgIn.u32Width = 1920;//設置RGA輸入分辨率寬度rga_info.stImgIn.u32Height = 1080;//設置RGA輸入分辨率高度rga_info.stImgIn.u32HorStride = 1920;//設置RGA輸入分辨率虛寬rga_info.stImgIn.u32VirStride = 1080;//設置RGA輸入分辨率虛高rga_info.stImgIn.imgType = IMAGE_TYPE_NV12;//設置ImageType圖像類型rga_info.stImgIn.u32X = 0;//設置X坐標rga_info.stImgIn.u32Y = 0;//設置Y坐標/**Image Output......................*/rga_info.stImgOut.u32Width = 1280;//設置RGA輸出分辨率寬度rga_info.stImgOut.u32Height = 720;//設置RGA輸出分辨率高度rga_info.stImgOut.u32HorStride = 1280;//設置RGA輸出分辨率虛寬rga_info.stImgOut.u32VirStride = 720;//設置RGA輸出分辨率虛高rga_info.stImgOut.imgType = IMAGE_TYPE_NV12;//設置輸出ImageType圖像類型rga_info.stImgOut.u32X = 0;//設置X坐標rga_info.stImgOut.u32Y = 0;//設置Y坐標// RGA Public Parameterrga_info.u16BufPoolCnt = 3;//緩沖池計數rga_info.u16Rotaion = 0;//rga_info.enFlip = RGA_FLIP_H;//水平翻轉rga_info.bEnBufPool = RK_TRUE;ret = RK_MPI_RGA_CreateChn(RGA_CHN_ID, &rga_info);if (ret){printf("RGA Set Failed.....\n");}else{printf("RGA Set Success.....\n");}// High Venc ParameterVENC_CHN_ATTR_S high_venc_attr;high_venc_attr.stVencAttr.enType = RK_CODEC_TYPE_H264;//設置編碼器類型high_venc_attr.stVencAttr.imageType = IMAGE_TYPE_NV12;//設置編碼圖像類型high_venc_attr.stVencAttr.u32PicWidth = 1920;//設置編碼分辨率寬度high_venc_attr.stVencAttr.u32PicHeight = 1080;//設置編碼分辨率高度high_venc_attr.stVencAttr.u32VirWidth = 1920;//設置編碼分辨率虛寬high_venc_attr.stVencAttr.u32VirHeight = 1080;//設置編碼分辨率虛高high_venc_attr.stVencAttr.u32Profile = 66;//設置編碼等級high_venc_attr.stVencAttr.enRotation = VENC_ROTATION_0;//設置編碼的旋轉角度//********* 設置碼率控制屬性 ?*******************//high_venc_attr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;//設置H264的CBR碼率控制模式high_venc_attr.stRcAttr.stH264Cbr.u32Gop = 25;//設置GOP關鍵幀間隔high_venc_attr.stRcAttr.stH264Cbr.u32SrcFrameRateNum = 25;//設置源幀率分子high_venc_attr.stRcAttr.stH264Cbr.u32SrcFrameRateDen = 1;//設置源幀率分母high_venc_attr.stRcAttr.stH264Cbr.fr32DstFrameRateNum = 25;//設置目標幀率分子high_venc_attr.stRcAttr.stH264Cbr.fr32DstFrameRateDen = 1;//設置目標幀率分母high_venc_attr.stRcAttr.stH264Cbr.u32BitRate = 8388608;//設置碼率大小ret = RK_MPI_VENC_CreateChn(HIGH_VENC_CHN, &high_venc_attr);if (ret){printf("Set High Venc Attr Failed.....\n");}else{printf("Set High Venc Attr Success.....\n");}// Low Venc ParameterVENC_CHN_ATTR_S low_venc_attr;low_venc_attr.stVencAttr.enType = RK_CODEC_TYPE_H264;//設置編碼器類型low_venc_attr.stVencAttr.imageType = IMAGE_TYPE_NV12;//設置編碼圖像類型low_venc_attr.stVencAttr.u32PicWidth = 1280;//設置編碼分辨率寬度low_venc_attr.stVencAttr.u32PicHeight = 720;//設置編碼分辨率高度low_venc_attr.stVencAttr.u32VirWidth = 1280;//設置編碼分辨率虛寬low_venc_attr.stVencAttr.u32VirHeight = 720;//設置編碼分辨率虛高low_venc_attr.stVencAttr.u32Profile = 66;//設置編碼等級low_venc_attr.stVencAttr.enRotation = VENC_ROTATION_0;//設置編碼的旋轉角度//********* 設置碼率控制屬性 ?*******************//low_venc_attr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;//設置H264的CBR碼率控制模式low_venc_attr.stRcAttr.stH264Cbr.u32Gop = 25;//設置GOP關鍵幀間隔low_venc_attr.stRcAttr.stH264Cbr.u32SrcFrameRateNum = 25;//設置源幀率分子low_venc_attr.stRcAttr.stH264Cbr.u32SrcFrameRateDen = 1;//設置源幀率分母low_venc_attr.stRcAttr.stH264Cbr.fr32DstFrameRateNum = 25;//設置目標幀率分子low_venc_attr.stRcAttr.stH264Cbr.fr32DstFrameRateDen = 1;//設置目標幀率分母low_venc_attr.stRcAttr.stH264Cbr.u32BitRate = 8388608;//設置碼率大小ret = RK_MPI_VENC_CreateChn(LOW_VENC_CHN, &low_venc_attr);if (ret){printf("Set Low Venc Attr Failed.....\n");}else{printf("Set Low Venc Attr Success.....\n");}MPP_CHN_S vi_chn_s;vi_chn_s.enModId = RK_ID_VI;vi_chn_s.s32ChnId = VI_CHN_ID;MPP_CHN_S high_chn_s;high_chn_s.enModId = RK_ID_VENC;high_chn_s.s32ChnId = HIGH_VENC_CHN;//VI綁定高分辨率VENC模塊ret = RK_MPI_SYS_Bind(&vi_chn_s, &high_chn_s);if (ret){printf("VI Bind High Venc Failed.....\n");return -1;}else{printf("VI Bind High Venc Success.....\n");}MPP_CHN_S rga_chn_s;rga_chn_s.enModId = RK_ID_RGA;rga_chn_s.s32ChnId = RGA_CHN_ID;//VI綁定RGA模塊ret = RK_MPI_SYS_Bind(&vi_chn_s, &rga_chn_s);if (ret){printf("VI Bind RGA Failed.....\n");return -1;}else{printf("VI Bind RGA Success.....\n");}pthread_t high_venc_pid;pthread_t rga_pid;pthread_t low_venc_pid;pthread_create(&high_venc_pid, NULL, get_high_venc_thread, NULL); //創建多線程獲取高分辨率的編碼碼流?pthread_create(&rga_pid, NULL, rga_handle_thread, NULL);//創建多線程獲取RGA碼流并發送到低分辨率編碼器pthread_create(&low_venc_pid, NULL, get_low_venc_thread, NULL);//創建多線程獲取低分辨率編碼碼流while (1){sleep(1);}RK_MPI_SYS_UnBind(&vi_chn_s, &high_chn_s);RK_MPI_SYS_UnBind(&vi_chn_s, &rga_chn_s);RK_MPI_RGA_DestroyChn(RGA_CHN_ID);RK_MPI_VENC_DestroyChn(HIGH_VENC_CHN);RK_MPI_VENC_DestroyChn(LOW_VENC_CHN);RK_MPI_VI_DisableChn(PIPE_ID, VI_CHN_ID);return 0;
}

三.運行的效果:

分別用ffplay播放器分別播出高分辨率H264文件(test_high_venc.h264),低分辨率(test_rga_venc.h264)

ffplay test_high_venc.h264

ffplay test_rga_venc.h264

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72636.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72636.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72636.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

部署RabbitMQ集群詳細教程

部署RabbitMQ集群詳細教程 下面是一份在 Ubuntu 環境下部署 RabbitMQ 集群的詳細步驟說明&#xff0c;涉及主機名設置、Erlang & RabbitMQ 安裝、管理插件啟用、集群通信 Cookie 配置、節點加入集群、鏡像隊列策略設置以及集群驗證等。為了演示方便&#xff0c;以下示例假…

【Linux】之【Bug】VMware 虛擬機開機 一直卡在黑屏左上角下劃線閃爍界面

解決 參考&#xff1a; 解決Ubuntu20.04 開機黑屏光標閃爍進不去系統 Centos根目錄100%解決思路 當前界面 ctrlaltf3-f6 暫時進入終端界面 df -h 查看發現根目錄 磁盤空間已滿 執行命令 查看當前目錄占用內存明細 sudo du -h -x --max-depth1清理無用的大內存文件 或者安裝…

webflux集成langchain4j基礎版

伴隨著大模型應用的興起&#xff0c;webflux逐漸引起關注。為了以java的方式運行AI應用&#xff0c;讓我們一起學習webflux集成langchain4j吧。 1. 項目依賴 首先&#xff0c;你需要在 pom.xml 中添加必要的依賴&#xff1a; <dependencies><!-- Spring WebFlux --…

使用GitLink個人建站服務部署Allure在線測試報告

更多技術文章&#xff0c;訪問軟件測試社區 文章目錄 &#x1f680;前言&#x1f511;開通GitLink個人建站服務1. 前提條件2. 登錄GitLink平臺&#xff08;https://www.gitlink.org.cn/login&#xff09;3. 進入設置>個人建站>我的站點4. 新建站點5. 去倉部進行部署6. 安…

go數組的聲明和初始化

1.數組簡介 數組是可以存放多個同一類型的數據。數組也是一種數據類型&#xff0c;在go中&#xff0c;數組是值類型。數組的長度也是數組類型的一部分&#xff0c;所以[2]int和[3]int屬于不同的數據類型。 2.數組的長度也是類型的一部分 var arr1 [2]intvar arr2 [3]intfmt.P…

四款GIS工具箱軟件解析:滿足企業多樣化空間數據需求

概述 隨著地理信息系統&#xff08;GIS&#xff09;在城市規劃、環境監測、資源管理等領域的廣泛應用&#xff0c;各種GIS工具箱軟件不斷涌現&#xff0c;為用戶提供了強大的數據處理、空間分析和地圖制圖功能。本文將為大家介紹4款GIS工具箱軟件&#xff0c;這些軟件各具特色…

VirtualBox虛擬機安裝Mac OS啟動后的系統設置

VirtualBox虛擬機安裝Mac OS一直沒裝成功&#xff0c;本來想要放棄的&#xff0c;后來想著再試一次&#xff0c;于是在關機的情況&#xff0c;執行那幾句設置&#xff1a; cd "E:\Program Files\Oracle\VirtualBox\" VBoxManage.exe modifyvm "MacOS" --c…

[力扣每日一練]關于所有不同域名的查找

一、題目要求&#xff1a; 表&#xff1a;Emails---------------------- | Column Name | Type | ---------------------- | id | int | | email | varchar | ---------------------- id 是這張表的主鍵&#xff08;有不同值的列&#xff09;。 這張表的…

blender看不到導入的模型

參考&#xff1a;blender 快捷鍵 常見問題_blender材質預覽快捷鍵-CSDN博客 方法一&#xff1a;視圖-裁剪起點&#xff0c;設置一個很大的值 方法二&#xff1a;選中所有對象&#xff0c;對齊視圖-視圖對齊活動項-選擇一個視圖

HarmonyOS Next~鴻蒙系統ArkCompiler跨平臺編譯技術的革新實踐

HarmonyOS Next~鴻蒙系統ArkCompiler跨平臺編譯技術的革新實踐 引言 在萬物互聯時代&#xff0c;操作系統對編譯技術的需求已從單純的代碼轉換演變為跨設備協同、高效資源調度與極致性能優化的綜合挑戰。華為鴻蒙系統&#xff08;HarmonyOS&#xff09;自主研發的ArkCompiler…

Kanna 與 Swift:結合使用提升網絡請求效率

Kanna 是一個基于 Swift 的輕量級、高性能的 XML/HTML 解析庫&#xff0c;它能夠幫助開發者快速解析和處理網絡返回的 HTML 或 XML 數據。通過結合 Kanna 和 Swift 的網絡請求功能&#xff0c;我們可以構建更加高效、靈活的網絡交互模塊。本文將詳細介紹如何在 Swift 中使用 Ka…

《大語言模型的原理發展與應用》:此文為AI自動生成

《大語言模型的原理發展與應用》&#xff1a;此文為AI自動生成 一、引言&#xff1a;大語言模型&#xff0c;AI 時代的 “新引擎” 在當今數字化浪潮中&#xff0c;大語言模型宛如一顆璀璨的明星&#xff0c;照亮了人工智能發展的道路&#xff0c;成為推動各領域變革的核心驅…

RabbitMQ消息隊列 面試專題

RabbitMQ消息隊列 面試專題 RabbitMQ的實現原理為什么需要消息隊列常見消息隊列比較如何保證消息不丟失如何防止消息重復消費如何保證消息的有序性如何處理消息堆積 RabbitMQ的實現原理 RabbitMQ 是一個基于 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09; 協…

【Hudi-SQL DDL創建表語法】

CREATE TABLE 命令功能 CREATE TABLE命令通過指定帶有表屬性的字段列表來創建Hudi Table。 命令格式 CREATE TABLE [ IF NOT EXISTS] [database_name.]table_name[ (columnTypeList)]USING hudi[ COMMENT table_comment ][ LOCATION location_path ][ OPTIONS (options_lis…

藍橋杯備考:動態規劃路徑類DP之矩陣的最小路徑和

如題&#xff0c;要求左上角到右下角的最短路徑&#xff0c;我們還是老樣子按順序做 step1:確定狀態表示 f[i][j]表示(1,1)到(i,j)的最短距離 step2 :推導狀態表達方程 step3:確定填表順序&#xff0c;應該是從上到下&#xff0c;從左到右 step4:初始化 step5 找結果&#…

【Maven】基于IDEA學習 Maven依賴 與 工程繼承、聚合關系

文章目錄 一、基于IDEA 進行Maven依賴管理1. 依賴管理概念2. Maven工程核心信息配置和解讀&#xff08;GAVP&#xff09;3. Maven工程依賴管理配置依賴管理和依賴添加依賴版本統一提取和維護 4. 依賴范圍5. Maven工程依賴下載失敗錯誤解決6. Maven工程Build構建配置指定打包命名…

微信小程序注冊組件

在微信小程序中注冊組件分為自定義組件的創建和全局/局部注冊&#xff0c;下面為你詳細介紹具體步驟和示例。 自定義組件的創建 自定義組件由四個文件組成&#xff0c;分別是 .js&#xff08;腳本文件&#xff09;、.json&#xff08;配置文件&#xff09;、.wxml&#xff08…

貪心算法二

> 作者&#xff1a;?舊言~ > 座右銘&#xff1a;松樹千年終是朽&#xff0c;槿花一日自為榮。 > 目標&#xff1a;了解什么是貪心算法&#xff0c;并且掌握貪心算法。 > 毒雞湯&#xff1a;有些事情&#xff0c;總是不明白&#xff0c;所以我不會堅持。早安! >…

react中的fiber和初次渲染

源碼中定義了不同類型節點的枚舉值 組件類型 文本節點HTML標簽節點函數組件類組件等等 src/react/packages/react-reconciler/src/ReactWorkTags.js export const FunctionComponent 0; export const ClassComponent 1; export const IndeterminateComponent 2; // Befo…

Wireshark的OSPF報文抓包和分析(單區域ospf實驗)

一、OSPF的5種數據包和7種狀態機制 數據包 Hello&#xff1a;發現、建立鄰居&#xff08;鄰接&#xff09;關系、維持、周期保活&#xff1b;存在全網唯一的RID&#xff0c;使用IP地址表示 DBD&#xff1a;本地的數據庫的目錄&#xff08;摘要&#xff09;&#xff0c;LSDB的…