H266/VVC 帧内预测中 ISP 技术
帧内子划分 ISP
- ISP 技术是在 JVET-2002-v3 提案中详细介绍其原理,在 VTM8 中完整展示算法。ISP是线基内预测(LIP)模式的更新版本,它改善了原始方法在编码增益和复杂度之间的权衡,ISP 算法的核心原理就是利用较近的像素点作为参考像素。
- 帧内子分区(ISP)根据块的大小,将亮度帧内预测块垂直或水平分割成2或4个子分区。例如,ISP的最小块大小是4x8(或8x4)。如果块大小大于4x8(或8x4),那么相应的块被4个子分区分割。
- 值得注意的是,M × 128(M ≤ 64)和128 × N(N ≤ 64)的 ISP 块可能会与64 × 64的 VDPU 产生潜在问题。例如,在单树情况下,一个M × 128的CU 包含一个 M x128 的亮度块 TB 和两个M/2 × 64的色度TB。如果CU 使用 ISP,那么亮度TB将被分割成四个M × 32的TB(只有水平分割是可能的),每个块都小于64 × 64。然而,在ISP色度块的当前设计中并没有被分割。因此,两个色度分量的尺寸都会大于32 × 32的块。类似地,使用ISP的128 × N的CU也可能会遇到类似的情况。因此,这两种情况对于64 × 64的 VDPU 来说是个问题。出于这个原因,能够使用ISP的 CU 尺寸被限制在最大64 × 64。图19展示了这两种可能性的例子。所有的子分区都满足至少有16个样本的条件。
- 在ISP中,不允许 1xN/2xN 子块预测依赖于之前解码的编码块的 1xN/2xN子 块的重建值,这样子块的最小预测宽度就变成了四个样本。例如,一个8xN(N > 4)的编码块,如果使用ISP进行垂直分割编码,将被分割成两个预测区域,每个区域的大小为4xN,并且有四个2xN的变换。此外,一个使用ISP进行垂直分割编码的4xN编码块,将使用完整的4xN块进行预测;四个1xN的变换被使用。尽管允许1xN和2xN的变换尺寸,但断言这些块在4xN区域内的变换可以并行执行。例如,当一个4xN预测区域包含四个1xN变换时,水平方向没有变换;垂直方向的变换可以作为单个4xN变换在垂直方向执行。同样地,当一个4xN预测区域包含两个2xN变换块时,两个2xN块在每个方向(水平和垂直)上的变换操作可以并行进行。因此,处理这些较小的块与处理4x4常规编码的帧内块相比,不会增加延迟。
- 对于每个子分区,通过将残差信号加到预测信号上来获得重建样本。这里,残差信号是通过熵解码、逆量化和逆变换等过程生成的。因此,重建样本值可用于生成下一个子分区的预测,每个子分区都会重复处理。此外,要处理的第一个子分区是包含CU左上角样本的子分区,然后继续向下(水平分割)或向右(垂直分割)。因此,用于生成子分区预测信号的参考样本仅位于行的左侧和上方。所有子分区共享相同的帧内模式。
- ISP 技术与其他编码工具的交互:
- 多重参考线(MRL):如果一个块的MRL索引不是0,那么ISP编码模式将被推断为0,因此ISP模式信息不会发送到解码器。
- 熵编码系数组大小:熵编码子块的大小已经被修改,以便在所有可能的情况下它们都有16个样本,如表3-6所示。请注意,新的大小只影响由ISP产生的块,其中一个维度小于4个样本。在所有其他情况下,系数组保持4x4的尺寸。
- CBF编码:假设至少有一个子分区具有非零的CBF。因此,如果n是子分区的数量,前n-1个子分区产生了零CBF,那么第n个子分区的CBF被推断为1。
- MPM使用:在ISP模式编码的块中,MPM标志将被推断为1,MPM列表被修改以排除DC模式,并优先考虑ISP水平分割的水平内模式和垂直分割的垂直内模式。
- 变换大小限制:所有ISP变换,如果长度大于16点,使用DCT-II。
- PDPC:当CU使用ISP编码模式时,PDPC滤波器不会应用于生成的子分区。
- MTS标志:如果CU使用ISP编码模式,MTS CU标志将被设置为0,并且不会发送到解码器。因此,编码器不会对每个生成的子分区执行不同可用变换的RD测试。ISP模式的变换选择将根据内模式、处理顺序和使用的块大小固定和选择。因此,不需要信号。例如,让tH和tV分别是为 w×h 子分区选择的水平和垂直变换,其中w是宽度,h是高度。然后根据以下规则选择变换:
- 如果 w=1或 h=1,则没有水平或垂直变换。
- 如果 w=2 或 w>32,tH=DCT−II。
- 如果 h=2 或 h>32,tV=DCT−II。
- 否则,变换如表3-7所示选择。
- 在ISP模式下,允许所有67种内模式。如果相应的宽度和高度至少为4个样本,则应用PDPC。此外,内插滤波器选择的条件不再存在,并且在ISP模式下,对于分数位置插值,总是应用Cubic(DCT-IF)滤波器。
- 在论文 [ AN INTRA SUBPARTITION CODING MODE FOR VVC ] 中使用 VTM-3.0 官方参考代码中测试 ISP 技术的性能收益如下表:
- 在 VVenC 编码器中 UnitTools.cpp 文件中canUseISP 函数来判断是否可以使用 ISP 技术。
bool CU::canUseISP( const CodingUnit &cu, const ComponentID compID )
{const int width = cu.blocks[compID].width;const int height = cu.blocks[compID].height;const int maxTrSize = cu.cs->sps->getMaxTbSize();return CU::canUseISP( width, height, maxTrSize );
}bool CU::canUseISP( const int width, const int height, const int maxTrSize )
{bool notEnoughSamplesToSplit = ( Log2(width) + Log2(height) <= ( MIN_TB_LOG2_SIZEY << 1 ) );bool cuSizeLargerThanMaxTrSize = width > maxTrSize || height > maxTrSize;if ( notEnoughSamplesToSplit || cuSizeLargerThanMaxTrSize ){return false;}return true;
}
- 在 VVenC 编码器中 IntraSearch.cpp 文件中estIntraPredLumaQT 函数中进行 ISP 初始化和遍历模式计算开启 ISP 和不开启 ISP 的代价,选择代价最小预测方式。
bool IntraSearch::estIntraPredLumaQT(CodingUnit &cu, Partitioner &partitioner, double bestCost)
{CodingStructure &cs = *cu.cs;const int width = partitioner.currArea().lwidth();const int height = partitioner.currArea().lheight();//===== loop over partitions =====const TempCtx ctxStart ( m_CtxCache, m_CABACEstimator->getCtx() );// variables for saving fast intra modes scan results across multiple LFNST passesdouble costInterCU = xFindInterCUCost( cu );bool validReturn = false;//===== determine set of modes to be tested (using prediction signal only) =====int numModesAvailable = NUM_LUMA_MODE; // total number of Intra modesstatic_vector<ModeInfo, FAST_UDI_MAX_RDMODE_NUM> RdModeList;static_vector<ModeInfo, FAST_UDI_MAX_RDMODE_NUM> HadModeList;static_vector<double, FAST_UDI_MAX_RDMODE_NUM> CandCostList;static_vector<double, FAST_UDI_MAX_RDMODE_NUM> CandHadList;int numModesForFullRD = g_aucIntraModeNumFast_UseMPM_2D[Log2(width) - MIN_CU_LOG2][Log2(height) - MIN_CU_LOG2];if (m_pcEncCfg->m_numIntraModesFullRD > 0)numModesForFullRD=m_pcEncCfg->m_numIntraModesFullRD;#if INTRA_FULL_SEARCHnumModesForFullRD = numModesAvailable;
#endifconst SPS& sps = *cu.cs->sps;const bool mipAllowed = sps.MIP && cu.lwidth() <= sps.getMaxTbSize() && cu.lheight() <= sps.getMaxTbSize() && ((cu.lfnstIdx == 0) || allowLfnstWithMip(cu.lumaSize()));const int SizeThr = 8 >> std::max( 0, m_pcEncCfg->m_useFastMIP - 1 );const bool testMip = mipAllowed && ( cu.lwidth() <= ( SizeThr * cu.lheight() ) && cu.lheight() <= ( SizeThr * cu.lwidth() ) ) && ( cu.lwidth() <= MIP_MAX_WIDTH && cu.lheight() <= MIP_MAX_HEIGHT );bool testISP = sps.ISP && CU::canUseISP(width, height, cu.cs->sps->getMaxTbSize());if (testISP){int numTotalPartsHor = (int)width >> floorLog2(CU::getISPSplitDim(width, height, TU_1D_VERT_SPLIT));int numTotalPartsVer = (int)height >> floorLog2(CU::getISPSplitDim(width, height, TU_1D_HORZ_SPLIT));m_ispTestedModes[0].init(numTotalPartsHor, numTotalPartsVer, 0);// the total number of subpartitions is modified to take into account the cases where LFNST cannot be combined with// ISP due to size restrictionsnumTotalPartsHor = sps.LFNST && CU::canUseLfnstWithISP(cu.Y(), HOR_INTRA_SUBPARTITIONS) ? numTotalPartsHor : 0;numTotalPartsVer = sps.LFNST && CU::canUseLfnstWithISP(cu.Y(), VER_INTRA_SUBPARTITIONS) ? numTotalPartsVer : 0;for (int j = 1; j < NUM_LFNST_NUM_PER_SET; j++){m_ispTestedModes[j].init(numTotalPartsHor, numTotalPartsVer, 0);}testISP = m_ispTestedModes[0].numTotalParts[0];}else{m_ispTestedModes[0].init(0, 0, 0);}xEstimateLumaRdModeList(numModesForFullRD, RdModeList, HadModeList, CandCostList, CandHadList, cu, testMip);CHECK( (size_t)numModesForFullRD != RdModeList.size(), "Inconsistent state!" );// after this point, don't use numModesForFullRDif( m_pcEncCfg->m_usePbIntraFast && !cs.slice->isIntra() && RdModeList.size() < numModesAvailable ){double pbintraRatio = m_pcEncCfg->m_usePbIntraFast == 1 && ( cs.area.lwidth() >= 16 && cs.area.lheight() >= 16 ) ? 1.2 : PBINTRA_RATIO;int maxSize = -1;ModeInfo bestMipMode;int bestMipIdx = -1;for( int idx = 0; idx < RdModeList.size(); idx++ ){if( RdModeList[idx].mipFlg ){bestMipMode = RdModeList[idx];bestMipIdx = idx;break;}}const int numHadCand = 3;for (int k = numHadCand - 1; k >= 0; k--){if (CandHadList.size() < (k + 1) || CandHadList[k] > cs.interHad * pbintraRatio) { maxSize = k; }}if (maxSize > 0){RdModeList.resize(std::min<size_t>(RdModeList.size(), maxSize));if( bestMipIdx >= 0 ){if( RdModeList.size() <= bestMipIdx ){RdModeList.push_back(bestMipMode);m_SortedPelUnitBufs->swap( maxSize, bestMipIdx );}}}if (maxSize == 0){cs.dist = MAX_DISTORTION;cs.interHad = 0;return false;}}//===== check modes (using r-d costs) =====ModeInfo bestPUMode;CodingStructure *csTemp = m_pTempCS;CodingStructure *csBest = m_pBestCS;csTemp->slice = csBest->slice = cs.slice;csTemp->picture = csBest->picture = cs.picture;csTemp->compactResize( cu );csBest->compactResize( cu );csTemp->initStructData();csBest->initStructData();int bestLfnstIdx = 0;const bool useBDPCM = cs.picture->useBDPCM;int NumBDPCMCand = (useBDPCM && sps.BDPCM && CU::bdpcmAllowed(cu, ComponentID(partitioner.chType))) ? 2 : 0;int bestbdpcmMode = 0;int bestISP = 0;int bestMrl = 0;bool bestMip = 0;int EndMode = (int)RdModeList.size();bool useISPlfnst = testISP && sps.LFNST;bool noLFNST_ts = false;double bestCostIsp[2] = { MAX_DOUBLE, MAX_DOUBLE };bool disableMTS = false;bool disableLFNST = false;bool disableDCT2test = false;if (m_pcEncCfg->m_FastIntraTools){int speedIntra = 0;xSpeedUpIntra(bestCost, EndMode, speedIntra, cu);disableMTS = (speedIntra >> 2 ) & 0x1;disableLFNST = (speedIntra >> 1) & 0x1;disableDCT2test = speedIntra>>3;if (disableLFNST){noLFNST_ts = true;useISPlfnst = false;}if (speedIntra & 0x1){testISP = false;}}for (int mode_cur = 0; mode_cur < EndMode + NumBDPCMCand; mode_cur++){int mode = mode_cur;if (mode_cur >= EndMode){mode = mode_cur - EndMode ? -1 : -2;testISP = false;}// set CU/PU to luma prediction modeModeInfo testMode;int noISP = 0;int endISP = testISP ? 2 : 0;bool noLFNST = false || noLFNST_ts;if (mode && useISPlfnst){noLFNST |= (bestCostIsp[0] > (bestCostIsp[1] * 1.4));if (mode > 2){endISP = 0;testISP = false;}}if (testISP){xSpeedUpISP(1, testISP, mode, noISP, endISP, cu, RdModeList, bestPUMode, bestISP, bestLfnstIdx);}int startISP = 0;if (disableDCT2test && mode && bestISP){startISP = endISP ? 1 : 0;}for (int ispM = startISP; ispM <= endISP; ispM++){if (ispM && (ispM == noISP)){continue;}if (mode < 0){cu.bdpcmM[CH_L] = -mode;testMode = ModeInfo(false, false, 0, NOT_INTRA_SUBPARTITIONS, cu.bdpcmM[CH_L] == 2 ? VER_IDX : HOR_IDX);}else{testMode = RdModeList[mode];cu.bdpcmM[CH_L] = 0;}cu.ispMode = ispM;cu.mipFlag = testMode.mipFlg;cu.mipTransposedFlag = testMode.mipTrFlg;cu.multiRefIdx = testMode.mRefId;cu.intraDir[CH_L] = testMode.modeId;if (cu.ispMode && xSpeedUpISP(0, testISP, mode, noISP, endISP, cu, RdModeList, bestPUMode, bestISP, 0) ){continue;}if (m_pcEncCfg->m_FastIntraTools && (cu.ispMode || sps.LFNST || sps.MTS)){m_ispTestedModes[0].intraWasTested = true;}CHECK(cu.mipFlag && cu.multiRefIdx, "Error: combination of MIP and MRL not supported");CHECK(cu.multiRefIdx && (cu.intraDir[0] == PLANAR_IDX), "Error: combination of MRL and Planar mode not supported");CHECK(cu.ispMode && cu.mipFlag, "Error: combination of ISP and MIP not supported");CHECK(cu.ispMode && cu.multiRefIdx, "Error: combination of ISP and MRL not supported");// determine residual for partitioncs.initSubStructure(*csTemp, partitioner.chType, cs.area, true);int doISP = (((cu.ispMode == 0) && noLFNST) || (useISPlfnst && mode && cu.ispMode && (bestLfnstIdx == 0)) || disableLFNST) ? -mode : mode;xIntraCodingLumaQT(*csTemp, partitioner, m_SortedPelUnitBufs->getBufFromSortedList(mode), bestCost, doISP, disableMTS);DTRACE(g_trace_ctx, D_INTRA_COST, "IntraCost T [x=%d,y=%d,w=%d,h=%d] %f (%d,%d,%d,%d,%d,%d) \n", cu.blocks[0].x,cu.blocks[0].y, width, height, csTemp->cost, testMode.modeId, testMode.ispMod,cu.multiRefIdx, cu.mipFlag, cu.lfnstIdx, cu.mtsFlag);if (cu.ispMode && !csTemp->cus[0]->firstTU->cbf[COMP_Y]){csTemp->cost = MAX_DOUBLE;csTemp->costDbOffset = 0;}if (useISPlfnst){int n = (cu.ispMode == 0) ? 0 : 1;bestCostIsp[n] = csTemp->cost < bestCostIsp[n] ? csTemp->cost : bestCostIsp[n];}// check r-d costif (csTemp->cost < csBest->cost){validReturn = true;std::swap(csTemp, csBest);bestPUMode = testMode;bestLfnstIdx = csBest->cus[0]->lfnstIdx;bestISP = csBest->cus[0]->ispMode;bestMip = csBest->cus[0]->mipFlag;bestMrl = csBest->cus[0]->multiRefIdx;bestbdpcmMode = cu.bdpcmM[CH_L];m_ispTestedModes[bestLfnstIdx].bestSplitSoFar = ISPType(bestISP);if (csBest->cost < bestCost){bestCost = csBest->cost;}if ((csBest->getTU(partitioner.chType)->mtsIdx[COMP_Y] == MTS_SKIP) && ( floorLog2(csBest->getTU(partitioner.chType)->blocks[COMP_Y].area()) >= 6 )){noLFNST_ts = 1;}}// reset context modelsm_CABACEstimator->getCtx() = ctxStart;csTemp->releaseIntermediateData();if (m_pcEncCfg->m_fastLocalDualTreeMode && CU::isConsIntra(cu) && !cu.slice->isIntra() && csBest->cost != MAX_DOUBLE && costInterCU != COST_UNKNOWN && mode >= 0){if( (m_pcEncCfg->m_fastLocalDualTreeMode == 2) || (csBest->cost > costInterCU * 1.5)){//Note: only try one intra mode, which is especially useful to reduce EncT for LDB case (around 4%)EndMode = 0;break;}}}} // Mode loopif (m_pcEncCfg->m_FastIntraTools && (sps.ISP|| sps.LFNST || sps.MTS)){int bestMode = csBest->getTU(partitioner.chType)->mtsIdx[COMP_Y] ? 4 : 0;bestMode |= bestLfnstIdx ? 2 : 0;bestMode |= bestISP ? 1 : 0;m_ispTestedModes[0].bestIntraMode = bestMode;}cu.ispMode = bestISP;if( validReturn ){cs.useSubStructure( *csBest, partitioner.chType, TREE_D, cu.singleChan( CH_L ), true );const ReshapeData& reshapeData = cs.picture->reshapeData;if (cs.picHeader->lmcsEnabled && reshapeData.getCTUFlag()){cs.getRspRecoBuf().copyFrom(csBest->getRspRecoBuf());}//=== update PU data ====cu.lfnstIdx = bestLfnstIdx;cu.mipTransposedFlag = bestPUMode.mipTrFlg;cu.intraDir[CH_L] = bestPUMode.modeId;cu.bdpcmM[CH_L] = bestbdpcmMode;cu.mipFlag = bestMip;cu.multiRefIdx = bestMrl;}else{THROW("fix this");}csBest->releaseIntermediateData();return validReturn;
}
相关文章:

H266/VVC 帧内预测中 ISP 技术
帧内子划分 ISP ISP 技术是在 JVET-2002-v3 提案中详细介绍其原理,在 VTM8 中完整展示算法。ISP是线基内预测(LIP)模式的更新版本,它改善了原始方法在编码增益和复杂度之间的权衡,ISP 算法的核心原理就是利用较近的像…...
PyTorch 中的 Dropout 解析
文章目录 一、Dropout 的核心作用数值示例:置零与缩放**训练阶段****推理阶段** 二、Dropout 的最佳使用位置与具体实例解析1. 放在全连接层后2. 卷积层后的使用考量3. BatchNorm 层与 Dropout 的关系4. Transformer 中的 Dropout 应用 三、如何确定 Dropout 的位置…...
集中式架构vs分布式架构
一、集中式架构 如何准确理解集中式架构 1. 集中式架构的定义 集中式架构是一种将系统的所有计算、存储、数据处理和控制逻辑集中在一个或少数几个节点上运行的架构模式。这些中央节点(服务器或主机)作为系统的核心,负责处理所有用户请求和…...

微服务主流框架和基础设施介绍
概述 微服务架构的落地需要解决服务治理问题,而服务治理依赖良好的底层方案。当前,微服务的底层方案总的来说可以分为两 种:微服务SDK (微服务框架)和服务网格。 微服务框架运行原理: 应用程序通过接入 SD…...

4.5.1 顺序查找、折半查找(二分查找)
文章目录 基本概念顺序查找折半查找(二分查找)索引顺序查找 基本概念 查找表:由同类元素构成的集合。 查找表按照是否可以修改数据表,可分为静态查找表、动态查找表。 静态查找表:不能修改数据表,可进行查询…...

DDD - 微服务设计与领域驱动设计实战(上)_统一建模语言及事件风暴会议
文章目录 Pre概述业务流程需求分析的困境统一语言建模事件风暴会议什么是事件风暴(Event Storming)事件风暴会议 总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服务、实体与值对…...

基于Piquasso的光量子计算机的模拟与编程
一、引言 在科技飞速发展的当下,量子计算作为前沿领域,正以前所未有的态势蓬勃崛起。它凭借独特的量子力学原理,为解决诸多经典计算难以攻克的复杂问题提供了全新路径。从优化物流配送网络,以实现资源高效调配,到药物分子结构的精准模拟,加速新药研发进程;从金融风险的…...
44_Lua迭代器
在Lua中,迭代器是一种用于遍历集合元素的重要工具。掌握迭代器的使用方法,对于提高Lua编程的效率和代码的可读性具有重要意义。 1.迭代器概述 1.1 迭代器介绍 迭代器是一种设计模式,它提供了一种访问集合元素的方法,而不需要暴露其底层结构。在Lua中,迭代器通常以一个函…...

相机SD卡照片数据不小心全部删除了怎么办?有什么方法恢复吗?
前几天,小编在后台友收到网友反馈说他在整理相机里的SD卡,原本是想把那些记录着美好瞬间的照片导出来慢慢欣赏。结果手一抖,不小心点了“删除所有照片”,等他反应过来,屏幕上已经显示“删除成功”。那一刻,…...
RAG 测评基线
RAG (Retrieval-Augmented Generation) 概述 RAG 是一种大模型的技术,旨在通过将信息检索与生成模型(如 GPT)结合,增强模型的生成能力。传统的生成模型通常依赖于内部的训练数据来生成答案,但这种方式往往存在回答准确…...
麒麟系统设置tomcat开机自启动
本文针对的麒麟操作系统使用的是SystemD,那么配置Tomcat开机自启动的最佳方式是创建一个SystemD服务单元文件。以下是具体步骤: 确保Tomcat已正确安装: 确认Tomcat已经正确安装,并且可以手动启动和停止。 创建SystemD服务文件&am…...
java 学习笔记 第二阶段:Java进阶
目录 多线程编程 线程的概念与生命周期 创建线程的两种方式(继承Thread类、实现Runnable接口) 线程同步与锁机制(synchronized、Lock) 线程池(ExecutorService) 线程间通信(wait、notify、notifyAll) 实践建议:编写多线程程序,模拟生产者-消费者问题。 反射机…...

机组存储系统
局部性 理论 程序执行,会不均匀访问主存,有些被频繁访问,有些很少被访问 时间局部性 被用到指令,不久可能又被用到 产生原因是大量循环操作 空间局部性 某个数据和指令被使用,附近数据也可能使用 主要原因是顺序存…...
【基础工程搭建】内存访问异常问题分析
前言 汽车电子嵌入式开始更新全新的AUTOSAR项目实战专栏内容,从0到1搭建一个AUTOSAR工程,内容会覆盖AUTOSAR通信协议栈、存储协议栈、诊断协议栈、MCAL、系统服务、标定、Bootloader、复杂驱动、功能安全等所有常见功能和模块,全网同步更新开发设计文档(后期也会更新视频内…...

Mysql 和 navicat 的使用
初识navicat 点开navicat,然后点击连接选择mysql连接,输入密码(一般都是123456)即可进行连接mysql 可以看见mysql中有如下已经建立好的数据库,是我之前已经建立过的数据库,其中test就是我之前建立的数据库…...

计算机网络(五)运输层
5.1、运输层概述 概念 进程之间的通信 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。 当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时…...
托宾效应和托宾q理论。简单解释
托宾效应和托宾q理论 托宾效应(Tobin Effect)和托宾q理论(Tobins q Theory)都是由美国经济学家詹姆斯托宾(James Tobin)提出的,它们在宏观经济学和金融经济学中占有重要地位。 托宾效应 托宾…...
大数据原生集群 (Hadoop3.X为核心) 本地测试环境搭建二
本篇安装软件版本 mysql5.6 spark3.2.1-hadoop3.2 presto0.272 zeppelin0.11.2 kafka_2.13_3.7.2 mysql 安装步骤见-》 https://blog.csdn.net/dudadudadd/article/details/110874570 spark 安装步骤见-》https://blog.csdn.net/dudadudadd/article/details/109719624 安装…...

ClickHouse vs StarRocks 选型对比
一、面向列存的 DBMS 新的选择 Hadoop 从诞生已经十三年了,Hadoop 的供应商争先恐后的为 Hadoop 贡献各种开源插件,发明各种的解决方案技术栈,一方面确实帮助很多用户解决了问题,但另一方面因为繁杂的技术栈与高昂的维护成本&…...
04.计算机体系三层结构与优化(操作系统、计算机网络、)
3.计算机体系三层结构与优化(day04) 3.1 操作系统 内容概要: 操作系统的发展史:批处理系统》分时操作系统》unix>linux多道技术》(进程、线程)并发进程与线程相关概念任务运行的三种状态:…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...