当前位置: 首页 > news >正文

音视频之H.265/HEVC网络适配层

H.265/HEVC系列文章:

1、音视频之H.265/HEVC编码框架及编码视频格式

2、音视频之H.265码流分析及解析

3、音视频之H.265/HEVC预测编码

4、音视频之H.265/HEVC变换编码

5、音视频之H.265/HEVC量化

6、音视频之H.265/HEVC环路后处理

7、音视频之H.265/HEVC熵编码

8、音视频之H.265/HEVC网络适配层


        与 H.264/AVC类似,H.265/HEVC也采用了视频编码层(Video Coding Layer,VCL)和网络适配层(Network Abstract Layer,NAL)的双层架构,以适应不同的网络环境和视频应用。网络适配层的主要任务是对视频压缩后的数据进行划分和封装,并进行必要的标识,使其可以很好地适应复杂多变的网络环境。

一、分层结构:

        分层需求导向:

        当前的网络类型多种多样,不同的网络环境具有不同的特性,压缩视频在其中进行传输时必然会受到影响。例如,不同类型的网络支持的最大传输单元(Maximum Transmission Unit,MTU)可能有所不同:有线网络的 MTU 一般为1500字节,而无线网络的MTU要小得多。因此,不同网络中传输的压缩视频数据应被划分成大小不同的分组。然而,压缩视频数据与普通数据不同,高效的分组策略必须结合视频数据的内容特性,即不同的网络需要根据视频数据特性采用特定的分组策略。

        另外,不同的应用场景对视频有不同的需求,视频业务会采用不同的传输协议。目前网络上流行的点播类视频应用对时延要求较低,注重视频数据的完整性和正确性,采用可靠的传输协议--TCP/IP,传输过程不需要分析视频数据的内容特性。而视频会议对于实时性要求较高采用不可靠的传输协议(RTP/UDP/IP)会导致数据分组丢失,由于不同视频数据的重要性不同,高效的传输策略需要对视频分组的内容特性进行分析

        H.265/HEVC的分层结构:

        为了适应不同的网络环境和应用需求,NAL可以为复杂的视频数据增加友好的网络应用接口。通过NAL,视频压缩数据根据其内容特性被分成具有不同特性的NAL单元(NALUnit,NALU),并对NALU的内容特性进行标识。网络只需要根据NALU及其标识就可以优化视频传输性能,不再需要亲自分析视频数据的内容特性。图9.1给出了H.265/HEVC标准中视频编码层(VCL)和网络适配层(NAL)的两层结构,该结构使得视频编码在保证编码效率的前提下可以很好地适应各种网络环境。        

        视频数据分组的重要性:

        原始视频序列由按时间顺序排列的一幅幅图像组成,每幅图像由按空间顺序排列的像素组成。原始视频数据有非常好的结构性,易于理解、处理。然而,为了更高效地表示视频信息,视频压缩算法想方设法地去除视频的时域、空域及视觉几余,这使得压缩后的视频数据结构复杂、难以理解。如经过编码,码流中的二进制符号不再简单地对应实际数值,严重时单个符号的丢失或错误会导致后续数据无法正确解码。又如,时域和空域预测技术使得不同图像、不同CTU的压缩数据相互依赖,甚至导致压缩码流中图像的顺序与它们的原始顺序不同。复杂的依赖关系也导致不同数据的重要性不同,如被用做参考的图像比不被用做参考的图像重要,头信息比普通数据重要,运动矢量信息比变换系数重要。

        在网络上优化传输这种高度复杂的压缩视频流时,必须对码流进行深入分析或解码才能清楚不同数据的重要程度。如在实际的网络传输环境中,如果网络发生了较为严重的拥塞,网络设备将根据数据的重要性丢弃分组。然而,对码流进行深入分析甚至解码的计算复杂度太高,无法得到通用网络设备的支持。如果网络设备不对压缩数据进行分析,就无法判断视频数据分组的重要性,这些分组将会被平等对待,随机丢弃分组显然不利于视频传输的优化。另外,对网络工程师来说,了解编码原理、分析压缩视频流也有较大的难度。因此,NAL直接根据视频数据的特性对压缩视频流进行封装和标识,使其可以被网络识别并进行优化处理。

        H.265/HEVC中的NAL的作用机制:

        如图 9.2所示,原始视频由一系列的图像组成,箭头表示压缩编码时的一种时域预测关系。经过压缩编码(VCL)后,每幅图像变成一段难以理解的码流片段,每个码流片段内的数据不再具有类似像素表示的形式。时域预测技术使得这些比特流片段相互依赖,如片段2依赖于片段1和3,片段3依赖于片段1和5。显然,这些比特流片段具有不同的重要性,码流片段1是其他片段解码时的参考,它的重要性最高:片段2和4不会作为其他图像的参考,它们的重要性最低。NAL根据压缩视频比特流的内容特性将其划分成多个数据段,对每个数据段进行封装并对其内容特性进行标识,就生成了NALU,其内容特性信息存放于NALU头信息中。

        NALU可以直接作为载荷在网络上进行传输,如图9.2所示。需要注意的是,NAL的大小不一定与网络的 MTU 大小一致,因此网络分组与NALU就产生几种组合形式:

  • 一个网络分组包含一个NALU;
  • 一个网络分组包含多个NALU,即多个NALU合并到一个网络分组;
  • 多个网络分组包含一个NALU,即一个NALU被分割到多个网络分组。

        网络传输过程中,网络设备可以直接通过 NALU的头信息获取 NALU承载视频数据的内容特性,在此基础上优化视频流的传输。针对网络拥塞引起的丢弃分组问题,网络设备需要清楚各个分组的优先级,这可以直接通过NAL的头信息获得。

二、图像类型:

        不同类型的NALU:

        如前所述,NAL将压缩视频数据封装成不同类型的NALU,即所有的压缩视频数据都被封装到不同NALU的载荷部分。NALU除了承载VPS、SPS、PPS等信息,主要承载视频片(Slice)的压缩数据,承载视频片压缩数据的NALU被称为VCLU(VCL NALU),承载其他信息的NALU 被称为 non-VCLU(non-VCLNALU)。H.265/HEVC中每个 VCLU包含一个视频片段SS(Slicesegment)的压缩数据,SS是VCL的压缩数据输出单位,每个SS包含多个完整的按序排列的CTU。

        VCLU 的头信息标识 VCLU 载荷的内容特性,主要标识 SS的重要性及与其他图像的依赖关系(这个版本只标识时域重要性及时域依赖关系)。

        VCLU重要性及依赖关系分析:

        H.265/HEVC 规定同一幅图像中的 VCLU 具有相同的时域重要性及与其他图像的时域依赖关系,下面对该重要性及依赖关系进行分析。

        时域预测技术可以有效地提高视频的压缩效率。然而,时域预测也使具有参考关系的图像具有解码依赖关系,每一幅图像的正确解码依赖于其参考图像的正确解码,尤其是使用后向时域预测(包括双向预测)技术后导致图像的解码顺序与播放顺序不一致。如图9.3所示,箭头表示图像间的参考关系,标号表示图像的编/解码顺序。由于图像3编码时参考了图像2,因此,图像2先于图像3编码,也先于图像3 解码。图像的解码顺序为1、2、3、4、5、6、7、8、9,此解码顺序也为压缩码流中图像的顺序。图像应按时间顺序播放,播放顺序为1、4、3、5、2、8、7、9、6。

        随机介入点(IRAP):

        时域预测技术使得压缩视频流中图像间的关系错综复杂。为了满足压缩视频流的随机介入需求,如电视频道的切换、视频播放中的快进、拖曳等,一段视频流中通常会间隔地存在一些随机介入点(Intra Random Access Point,IRAP)。从IRAP开始,后续视频流(播放顺序在IRAP后的图像)可以独立正确解码,无须参考IRAP前面的视频信息。IRAP后的第一幅解码图像被称为IRAP图像,解码顺序在IRAP 图像后而播放顺序在其前的图像被称为该IRAP图像的前置(Leading)图像,播放顺序在IRAP图像后(解码顺序必在其后)的图像被称为该IRAP图像的后置(Trailing)图像。如图9.3所示,图像2为IRAP图像,图像5为图像2的前置图像,图像8为图像2的后置图像。IRAP图像只包含帧内编码片,不采用帧间预测技术,可以独立解码。值得注意的是,只包含内编码片的图像不一定是IRAP图像,判断是否为IRAP图像还需要考虑其后置图像能否独立正确解码。

        前置图像:

        前置图像又分为RADL(Random Access Decodable Leading)图像和RASL(Random Access Skipped Leading)图像。不依赖IRAP 前码流信息的前置图像被称为RADL图像,即从IRAP图像介入,其RADL图像可以正确解码,如图9.3中的图像5为图像2的RADL图像。依赖IRAP前码流信息的前置图像被称为RASL图像,即从IRAP图像介入,其RASL图像不能正确解码,如图9.3中的图像3为图像2的RASL图像。

        H.265/HEVC中的IRAP:

        H.265/HEVC规定了3种IRAP图像:IDR(Instantaneous Decoding Refresh)图像、CRA(Clean Random Access)图像和 BLA(Broken Link Access)图像

       IDR图像:

        IDR图像在H.264/AVC中就作为IRAP图像使用,IDR图像要求其前置图像必须是RADL图像,也就是说,IDR图像及其后续码流可以不依赖该 IDR图像前的视频流信息进行独立解码。

         CRA图像:

        CRA图像则允许其前置图像是RASL图像,允许参考CRA图像前的视频流可以使RASL图像获得更高的编码效率,当直接从CRA图像介入时,其RASL图像无法正常解码。当以CRA图像开始的码流的一部分也属于另一段码流时,

         BLA 图像:

        如图9.3中播放顺序在图像2后的图像属于另一段码流,从图像2介入视频流时,其RASL图像肯定无法正确解码。为了方便处理,这时CRA 图像就被定义为 BLA 图像,即明确其RASL图像不需要解码。

       封闭式/开发式GOP: 

        IRAP图像把视频流分成多个相对独立的区域,每个区域被称为CVS(Coded Video Sequence),CVS定义为两个相邻IRAP图像(NoRaslOutputFlag=1)之间这段视频流。如图9.3所示,图像2、图像3、图像 4、图像5属于一个 CVS,该CVS码流从图像2(IRAP 图像)开始到图像6(下一个IRAP 图像)结束(图像6属于下一个CVS)。CVS包含的编码图像组如同早期标准中的GOP,是一个相对可以独立解码的单位。编码过程中通常以CVS为单位设置固定的时域编码结构。IDR图像将视频流划分而成的 CVS具有一定的独立性,不同CVS内的视频压缩数据不会相互参考,常被称为封闭式GOP。CRA图像将视频流划分成的CVS独立性较差,不同CVS中的图像可能会相互参考,这被称为开放式GOP。

        时域层标识:

       H.264/AVC采用的分级B结构具有高效的压缩性能,且可以实现视频的时域可分级(Scalability),H.265/HEVC在此基础上允许更灵活的时域编码结构。为了有效地反映图像间的依赖关系,H.265/HEVC把图像划分到多个时域层,每幅图像都有一个标识所属时域层的时域层标识号。低层图像(时域层标识号小)不使用比其时域层高的图像做参考,也就是说,低层图像解码不依赖比其时域层高的图像。IRAP图像的时域层标识号为0,即属于第0个时域层,H.265/HEVC规定最高的时域层号为6。 

        时域子层上/下切换:

        对于满足时域层上切换条件的图像,应加以显示的标记以便进行切换。H.265/HEVC设置SPS中sps_temporal_id_nesting_flag为1时,表示该CVS中所有时域层标识大于0的图像都可以作为时域子层切换点,这里的时域子层切换点是指时域子层上切换。H.265/HEVC还定义了两个新的图像类型:TSA(Temporal Sub-layer Access)和STSA(Step-wiseTemporal Sub-layer Access),用于标识时域子层切换点,即从这些图像开始可以进行时域子层上切换。STSA图像表示从该图像可以切换到该图像所属的时域层,这就要求与该图像属于同一时域层的图像中,STSA图像及其后续图像(解码顺序)不依赖该图像之前的图像(解码顺序)。TSA图像表示从该图像可以切换到时域层标识号大于或等于该图像时域层标识号的时域层,这就要求 TSA图像及其后续图像(解码顺序)不依赖于该图像前的某些图像(解码顺序),这些图像的时域层标识号大于或等于TSA图像的时域层标识号。另外,TSA图像和STSA图像的时域层标识号必须大于 0。

        图像的分类:

        根据图像的内容特性,可以把图像分为四大类:随机介入图像、前置图像、时域子层介入图像、其他类型图像。每个大类又可以进一步划分,如随机介入图像又分为3类:IDR图像、BLA图像、CRA图像,根据是否有前置图像,IDR图像又分为拥有前置图像的IDR图像和无前置图像的IDR图像。表9.1详细地给出了图像的分类,根据图像的类别可以判断对该图像及其后续图像如何处理。如对于无前置图像的IDR 图像,从该图像开始,其后所有图像都可以正确解码,而且后续图像的播放顺序都在 IDR 图像后。

三、网络适配层单元:

       所有的视频压缩数据被封装成一个个的NALU,它们具有统一的语法结构。H.265/HEVC的NALU结构如图9.4所示,每一个NALU包含两部分:NALU头(Header)和NALU载荷(Payload)。NALU头长度为固定的两字节,反映NALU的内容特征。NALU 载荷长度为整数字节,承载视频压缩后的比特流片段。

        NALU载荷:

        比特流片段(SODB):

        视频编码过程中输出包含不同内容的压缩数据比特流片段,这些比特流片段称为SODB(String Of Data Bits),SODB为最高位有效(MostSignificant)的存储形式,即字节内的比特按照从左到右、从高到低的顺序排列。在SODB后添加RBSP尾(rbsp_trailing_bits)就生成了原始字节序列载荷(Raw Byte Sequence Payload,RBSP),RBSP 尾由称为RBSP停止比特的一个比特1和其后的零个或多个比特0组成。RBSP即为整数字节化的SODB,RBSP的数据类型即为SODB的数据类型。

        SODB生成过程:

        由SODB生成RBSP的过程为:

        如果SODB是空的(长度为0字节),生成的RBSP也是空的。

        否则,RBSP由如下的方式生成。

  • RBSP的第一字节直接取SODB最左端的8比特,第二字节取SODB接下来的8比特,以此类推,直到SODB中所剩的内容不足8比特(包括 0)为止。
  • RBSP的下一字节首先包含SODB的最后几比特,然后添加比特1(RBSP停止比特)。如果该字节包含的比特数小于8,在后面添加0直到该字节包含8比特。
  • 最后可能会加入若干16比特的语法元素cabaczeroword作为填充比特,其值为 0x0000。

        

        原始字节序列荷载(RBSP):

        RBSP可以包含一个SS的压缩数据、VPS、SPS、PPS、补充增强信息等,也可以为定界、序列结束、比特流结束、填充数据等。

        RBSP 不能直接作为NALU的载荷,因为在字节流应用环境中0x000001为NALU的起始码,0x000000为结束码。因此,为了避免NALU载荷中的字节流片段与NALU的起始码、结束码冲突需要对RBSP字节流做如下冲突避免处理:

        其中,0x000002为预留码。注意,当RBSP数据的最后一字节等于0x00时(这种情况只会在RBSP的末尾是cabac_zero_word时出现),字节0x03会被加入数据的末尾。

        经过冲突避免后的RBSP可以直接作为NALU的载荷信息,在其前增加 NALU 头就生成了NALU。NALU的语法结构见表9.2,表中详细给出了RBSP的冲突避免方法。其中,NumBytesInNalUnit表示NALU的字节数,emulation_prevention_three_byte为冲突避免时插入的0x03。

                

        NALU头:

        NALU头语法:

        NALU头主要承载NALU载荷的内容特征,由定长的4部分组:forbidden_zero_bit、nal_unit_ type,nuh_layer_id 和nuh_temporal_id_plusl,见表 9.3。

        forbidden_zero_bit:

        forbidden_zero_bit为1比特,其值应设置为0,防止与MPEG-2系统的起始码冲突。

        nal_unit_ type:

       nal_unit_ type 为6比特,取值范围是[0,63],标识当前NALU 载荷信息的内容特性,称为NALU类型。表9.4给出了NALU类型与载荷RBSP内容信息的关系。其中,未被参考是指该编码片没有被处于相同时域层的其他图像用做参考,被参考是指该编码片被处于相同时域层的其他图像用做参考。

                NALU类型约束:

                对于 NALU 的类型有以下约束:

  • 如果NALU 的 nal_unit_type 取值为UNSPEC48 到UNSPEC63 之间,其语义尚未明确,不会影响解码过程。
  • 如果不是为了确定比特流解码单元的数据量,解码器应该忽略掉所有 nal_unit_type使用预留值的 NALU。
  • 同一个接入单元的 NALU 应当具有相同的 nal_unit_type值。
  • 第一幅图像(按解码顺序)外的其他图像都被认为是其前IRAP图像的前置图像。

        nuh_layer_id:

        nuh_layer_id为6比特,当前版本取值应为0,如果不是为了确定比特流解码单元中的数据量,解码器应该丢弃nuh_layer_id取值不为0的NALU。除0值外的其余值被保留使用,将来可能会被用于可分级(Scalable)视频或3D视频,用来标识CVS中出现的增强层,如空域增强层、质量增强层、纹理视图或深度视图等。

       nuh_layer_id_plus1:

        nuh_layer_id_plus1为3比特,该值减1表示NALU所在时域层的标识号Temporalld不能为0。Temporalld= nuh_layer_id_plus1-1 ,Temporalld表示该NALU的时域层级。根据图像的时域层标识号就可以确定其重要性,如时域层标识号小的图像肯定不会参考时域层标识号大的图像。因此,只需要获取NALU头中的nuh_layer_id_plus1就可以获得该NALU的重要性,配合NALU的类型(nal_unit_type)就可以实现视频流的时域分级。

        NALU的Temporalld约束:

        另外,NALU 的Temporalld 有以下约束:

  • IRAP 图像的 Temporalld为0。否则,如当 nal_unit _type 取值为TSA_R、TSA_N、STSA_R或STSA_N时,Temporalld 不能取值为 0。
  • 一个接入单元的所有VCL NALU 具有相同的Temporalld 值,为该接入单元的 Temporalld 值。
  • 如果nal_unit_type取值为VPS_NUT或SPS_NUT,那么Temporalld 取值为 0。
  • 如果nal_unit_type取值为EOS_NUT或EOB_NUT,那么Temporalld 取值为 0。
  • 如果nal_unit_type取值为AUD_NUT或FD_NUT,那么该NALU的 Temporalld 值应当等于该介入单元的 Temporalld 值。
  • 否则,该NALU的Temporalld 值应当大于等于介入单元的Temporalld 值。

四、视频比特流中的NALU:

        压缩视频比特流由一个个连续排列的NALU组成,其顺序应与解码顺序一致。在H.265/HEVC中引入了接入单元(Access Unit,AU)的概念,它定义为多个按解码顺序排列的NALU,这些NALU解码正好生成一个图像。AU 可以看成压缩视频比特流的基本单位,压缩视频流由多个按顺序排列的AU组成。每个NALU都会属于某个AU单元,压缩视频流的第一个 NALU 则为第一个 AU 的第一个 NALU。

        

        介入单元:

        一个 AU 应包含一幅图像的所有 VCLU,还可以包含 non-VCLU。一个基本的 AU 结构如图 9.5所示,一个AU 可以从定界 NALU、SEI NALU或第一个SS的NALU开始,可以用最后一个SS的NALU、序列结束NALU或比特流结束NALU结束:

        一般情况下,基本 AU不包含以下类型的NALU:参数集、保留 VCL、填充、保留non-VCLU、未明确等。

        新 AU 的开始:

        如果包含这些类型的NALU,那么,以下任意一种 NALU 首次出现时都意味着一个新 AU 的开始。

  • 定界NALU(可能存在)。
  • 视频参数集 NALU(可能存在)。
  • 序列参数集 NALU(可能存在)。
  • 图像参数集 NALU(可能存在)。
  • 前置 SEI NALU(可能存在)。
  • nal_unit_type 取值为RSV_NVCL41 到RSV_NVCL44 之间的NALU(可能存在)。
  • nal _unit_type 取值为 UNSPEC48 到 UNSPEC55 之间的 NALU(可能存在)。
  • 编码图像的第一个 VCLU(肯定存在)。
       non-VCLU的顺序约束:

         编码图像和 AU中non-VCLU的顺序有以下约束:

  • 当定界 NALU 存在时,该定界 NALU 应为 AU 的第一个 NALU,且每个 AU 至多有一个定界 NALU。
  • 前置 SEINALU 不应出现在最后一个VCLU 之后。
  • 如果NALU的nal_unit_type取值为FD_NUT或SUFFIX_SEI_NUT,或者在RSV_NVCL45到RSV_NVCL47之间,又或者在UNSPEC56UNSPEC63 之间,该NALU不能出现在第一个VCLU之前。
  • 当序列结束NALU存在时,其应当为AU中除比特流结束NALU外的最后一个 NALU。
  • 当比特流结束 NALU存在时,其应当是AU的最后一个NALU。
        VCLU解码顺序排列:

        一个AU 包含一幅图像的所有 VCLU,每个 VCLU 包含一个 SS 的编码数据。VCLU应按解码顺序排列,遵循以下规律:

  • 编码图像的第一个VCL NALU的first_slice_segment_in_pic_flag值为1。
  • 设 sliceSegAddrA和sliceSegAddrB分别是同一幅图像中的两个编码片段NALUA和B的slice_segment_address。当满足下面任一条件时,NALUA 位于B之前:

        Tileld[CtbAddrRsToTs[sliceSegAddrA]] 小于 Tileld[CtbAddrRsToTs[sliceSegAddrB]]:Tileld[CtbAddrRsToTs[sliceSegAddrA]]等于 Tileld[CtbAddrRsToTs[sliceSegAddrA]],并且CtbAddrRsToTs[sliceSegAddrA]小于 CtbAddrRsToTs[sliceSegAddrA]。

        如前所述,CVS为一组按解码顺序排列的AU,从NoRaslOutputFlag设置为1的IRAP图像的AU开始到下一个NoRaslOutputFlag设置为1的IRAP图像的AU(不包含该IRAP单元)。因此,一个CVS的第一个AU应该为NoRaslOutputFlag设置为1的IRAP图像的AU,包含序列结束标识或比特率结束标识的AU应为VS的最后一个AU。

        参数集:

        参数集机制把图像、序列的一些共有参数与视频片段的压缩数据分离开来,H.265/HEVC规定了VPS、SPS和PPS参数集。参数集为独立的数据单位,可以采用特殊的传输或保护方式,甚至可以采用带外(Out-of-Band)传输的方式。这使得作为重要信息的参数集可以获得更好的保护方式,提高了压缩视频流传输的鲁棒性。

        参数集 VPS、SPS和PPS都作为独立的数据单元生成相应的NALU,不同的参数集应遵循不同的使用方式。VPS和SPS包含了一个CVS的共有参数信息,一个CVS只能使用同一个VPS和SPS。PPS包含了一幅图像的共有参数信息,一幅图像只能使用同一个PPS。

        PPS:

        PPS包含的参数信息可以被属于一幅图像或多幅图像的NALU调用。每个PPS在解码过程刚开始的时候不会被启动,同一时刻最多只能有一个PPS在解码过程中被启动,而每个PPS的启动会使得之前的PPS失效。在一个PPS未被启动时,如果它被一个SS的NALU参考,那么该PPS将被启动,有效期直到另外一个PPS被启用。一个PPS被启动前必须已经在解码过程中获取到,它可以被包含在至少一个接入单元当中,该接入单元的 Temporalld 值应小于等于 PPS NALU 的 Temporalld 值。

        SPS:

       SPS 包含一个 CVS 共用的参数信息,可以被一个或多个PPS使用,或者被一个或多个SEINALU使用。每个SPS在解码过程刚开始的时候不会被启动,同一时刻最多只能有一个SPS在解码过程中被启动,而每个SPS的启动会使得之前的SPS失效。在一个SPS未被启动时,如果它被一个PPS或者一个SEINALU调用,那么该SPS将被启动,有效期直到另一个SPS被启动。一个SPS被启动前必须已经在解码过程中获取到,它可以被包含在至少一个Temporalld值为0的AU中。

        VPS:       

        VPS包含一个CVS共有的参数信息,可以被一个或多个SPS使用,或者一个或多个SEINALU使用。每个VPS 在解码过程刚开始的时候不会被启动,同一时刻最多只能有一个SPS在解码过程中被启动,而每个VPS的启动会使得之前的VPS失效。在一个VPS未被启动时,如果它被一个SPS或者一个SEINALU调用,那么该VPS将被启动,有效期直到另一个 VPS 被启动。一个 VPS 被启动前必须已经在解码过程中获取到,它可以被包含在至少一个Temporalld值为0的 AU中。

五、网络适配层单元的应用:

        NALU 是压缩视频数据的基本单位,也是后续视频传输的基本单位,它能够适应不同的传输方式和应用环境。不同应用需求采用不同的传输机制,压缩视频业务可以分成两种应用场景:分组流和字节流。

        分组流应用是指直接将编码器输出的NALU作为网络分组的有效载荷,接收端的解码器可以从网络分组中直接以NALU的形式获取压缩视频数据,如基于 RTP/UDP/IP 的实时视频通信。

        字节流应用是指NALU 按照解码顺序组织成有序的连续字节或比特流进行传输、处理。为了保证解码器以NALU 的形式获得视频数据,须在NALU边界插入同步标识。基于流的传输系统有H.320、MPEG-2等。

        字节流应用:

        字节流应用将NALU流作为有序的字节流或比特流进行传输、处理,这就要求对 NALU的边界进行标识以保证解码端可以对NALU 进行识别。

        NALU 流生成字节流的过程如下:

  • 在每个NALU前面插入3字节的起始码start_code_prefix_one_3bytes,其对应的值为0x000001;
  • 如果NALU的类型为VPS_NUT、SPS_NUT、PPS_NUT,或者解码顺序为一个 AU的第一个NALU,则在其起始码前再插入 zero_byte,其对应的值为0x00。
  • 在视频流的首个NALU的起始码(可能包含zero_byte)前插入leading_zero_8bits,其对应的值为 0x00。
  • 根据需要可在每个 NALU 后增加 trailing_zero_8bits,其对应的值为0x00,作为填充数据。

        字节流格式的NALU语法见表9.5,通过该语法格式可以从字节流格式的视频数据获取 NALU。可以看到:通过查找起始码0x000001可以确定 NALU的前边界,通过查找起始码0x00000001可以确定AU的前边界,通过查找第一个起始码 0x00000001可以确定视频数据的前边界。

        在二进制视频数据的字节边界未知的情形下,字节流应用允许视频数据以比特流的形式出现。处理以比特流形式存在的字节流时,首先需要定位字节的边界,使视频数据保持字节对齐。确定字节边界的方法为:在比特流中从头搜索二进制比特串'00000000 00000000 00000000 00000001'(31个连续比特0随后一个比特1),该比特串之后的第一比特即为一字节的第一比特,这样便可得到字节对齐的字节流。

        分组流应用:

        视频分组流是网络视频传输的一种有效方式,当视频NALU作为网络分组的载荷在网络中传输时,不同的网络分组因承载不同特性的NALU 而具有不同的重要性,网络可以根据分组重要性优化视频流的服务质量。基于 RTP/UDP/IP的实时视频业务采用典型的分组流传输方式。

        RTP分组由RTP头(Header)和RTP载荷(Payload)前后两部分组成。RTP可以承载不同类型的载荷,如采用不同压缩标准生成的视频数据,RTP 头的结构如图9.6所示,每个信息域的语义见RFC3550。当RTP分组承载H.265/HEVC的NALU时,其RTP头中的信息域在遵循RFC3550的前提下有特定的语义。

  •  Markerbit(M):1比特,M位为1表示该分组为AU的最后一个分组,当根据 NALU内容无法确定其是一个AU的最后一个NALU时,这个标识位可以有效地传递这一信息。
  • Payloadtype(PT):7比特,该信息域表示载荷的类型,承载H.265/HEVC 数据时该域应标识为H.265/HEVC,新载荷类型的语义值可以通过 profile 或动态方式指定。
  • Timestamp:32比特,它是内容的采样时间戳,必须使用90kHz的时钟频率。如果承载的NALU 没有时间属性(如参数集),RTP头的时间戳应设置为所属AU中图像的时间戳。接收端在显示图像时应使用RTP头中的时间戳,忽略掉时间SEI中的时间信息。

        RTP分组:

        根据承载的NALU的数量,RTP分组分为3类:

  • 单NALU分组:一个分组只承载一个NALU。
  • 聚合分组(Aggregation Packet,AP):一个分组承载多个NALU。
  • 分片分组(Fragmentation Packet,FP):一个分组只承载一个NALU的一部分。

        RTP载荷的结构与RTP分组的类型相关,前两字节称为载荷头,载荷头的结构与NALU头的结构相同,其每个域的值根据承载NALU的头确定。

        下面简单介绍3类RTP分组的载荷结构,这里只介绍一个H.265/HEVC视频流只在一个RTP会话中传输的情况(Single-SessionTransmission,SST),一个H.265/HEVC 视频流在多个 RTP 会话中传输的情况(Multi-Session Transmission,MST)请参见 RFC6190。

        单个NALU分组:

        单NALU分组的载荷结构如图9.7所示。两字节的载荷头为RTP分组承载的 NALU 的头的复制,但当期望 CRA 图像作为 BLA 图像使用时,载荷头中的类型域须做相应的修改。在SST传输模式下,可选的两字节DONL域(Decoding Order Number)不存在,如果存在(在MST 传输模式时),DONL用来标明承载的NALU的解码号。NALU载荷为RTP分组承载NALU的载荷。

        聚合分组:

      聚合分组是将多个小的NALU放在同一个RTP分组中,这样可以减少传输小分组的分组头开销,如参数集等non-VCLU 通常只包含较少的数据。聚合分组承载的所有NALU必须属于同一个AU,并且按解码顺序排列。图9.8给出了在SST传输模式下包含两个NALU时聚合分组的
载荷结构,在MST传输模式下,其载荷结构更复杂。  

        载荷头中:forbidden_zero_bit应设置为所有NALU中forbidden_zero_bit 的和;nal_unit_type 应设定为48,表明这是聚合分组;nuh_layer_id应设置为所有NALU中nuh_layer_id 的最小值;nuh_ temporalid_plusl应设置为所有NALU中nuh_temporal_id_plusl 的最小值。载荷头后,多个NALU按顺序排放,每个NALU前添加两字节标明该NALU的字节数,最后是可选填充信息。

        分片分组:

        为了让大分组适应MTU小的网络,一个NALU可以分割成多段每段形成一个RTP分片分组。每个分片分组应包含NALU中连续的整字节数据,同一个NALU形成的多个分片分组的序列号应按顺序并连续排列。分片分组的载荷结构如图9.9所示。载荷头中的nal_unit_type应设定为49,表明这是分片分组,forbidden_zero_bit、nuh_layer_id、nuh_layer_id的值与 NALU 头中的对应域相同。在SST传输模式时,可选的DONL域不存在。FU载荷为NALU载荷分段后的数据。

        FU头含有8比特,结构如图9.10所示。S标明该FU是否为ALU的首个F,当该FU是NALU的首个FU时,S为1,否则为0。E标明该FU是否为NALU的最后一个FU,当该FU是NALU的最后一个FU时,S为1,否则为0。FU类型为 NALU的nal_unit_type 域的复制。

参考资料:

                《新一代高效视频编码 H.265/HEVC 原理、标准与实现》——万帅 杨付正 编著

相关文章:

音视频之H.265/HEVC网络适配层

H.265/HEVC系列文章: 1、音视频之H.265/HEVC编码框架及编码视频格式 2、音视频之H.265码流分析及解析 3、音视频之H.265/HEVC预测编码 4、音视频之H.265/HEVC变换编码 5、音视频之H.265/HEVC量化 6、音视频之H.265/HEVC环路后处理 7、音视频之H.265/HEVC熵编…...

01_微服务常见问题

文章目录 微服务常见问题一、常见问题概要一、问题详解1.1 服务拆分1.2 服务通信1.3 服务注册与发现1.4 服务治理1.5 数据一致性1.6 故障隔离与容错处理1.7 数据库设计1.8 性能测试与调优 微服务常见问题 一、常见问题概要 ‌服务拆分‌:如何合理地拆分服务&#…...

Python在自动驾驶仿真环境中的应用:构建智能驾驶的虚拟世界

Python在自动驾驶仿真环境中的应用:构建智能驾驶的虚拟世界 引言 随着自动驾驶技术的迅速发展,仿真环境的构建变得愈发重要。传统的测试方法依赖物理车辆和道路进行验证,但这种方式不仅成本高昂,还存在一定的风险。为了加速自动驾驶技术的研发,仿真环境成为了一个必不可…...

【统计方法】交叉验证:Resampling, nested 交叉验证等策略 【含R语言】

Resampling (重采样方法) 重采样方法是从训练数据中反复抽取样本,并在每个(重新)样本上重新调整模型,以获得关于拟合模型的附加信息的技术。 两种主要的重采样方法 Cross-Validation (CV) 交叉验证 : 用于估计测试误…...

海外App数据隐私架构实战:构建GDPR、CCPA合规的全栈解决方案

一、隐私合规的架构范式转变 从“数据收集”到“数据最小化”传统模式:尽可能收集数据 → 导致合规风险隐私原生模式:默认不收集 → 按需申请 → 自动过期kotlin// Android权限动态申请示例(GDPR兼容) val request PermissionRe…...

Prometheus监控

1、docker - prometheusgrafana监控与集成到spring boot 服务_grafana spring boot-CSDN博客 2、【IT运维】普罗米修斯基本介绍及监控平台部署(PrometheusGrafana)-CSDN博客 3、Prometheus监控SpringBoot-CSDN博客 4、springboot集成普罗米修斯-CSDN博客…...

Vue3 Echarts 3D圆形柱状图实现教程以及封装一个可复用的组件

文章目录 前言一、实现原理二、series ——type: "pictorialBar" 简介2.1 常用属性 三、代码实战3.1 封装一个echarts通用组件 echarts.vue3.2 首先实现一个基础柱状图3.3 添加上下2个椭圆面3.4 进阶封装一个可复用的3D圆形柱状图组件 总结 前言 在前端开发的数据可视…...

洛谷P12238 [蓝桥杯 2023 国 Java A] 单词分类

[Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] Copy from luogu. [Analysis] \color{blue}{\texttt{[Analysis]}} [Analysis] 既然都是字符串前缀的问题了,那当然首先就应该想到 Trie \text{Trie} Trie 树。 我们可…...

【3D基础】顶点法线与平面法线在光照与PBR中的区别与影响

顶点法线与平面法线在光照与PBR中的区别与影响 在3D图形学中,法线(Normal)是影响光照计算、表面细节表现和渲染质量的核心参数之一。法线用于描述一个表面或顶点的朝向,直接关系到光的反射与分布,从而影响最终像素的颜…...

jmeter-Beashell获取http请求体json

在JMeter中,使用BeanShell处理器或BeanShell Sampler来获取HTTP请求体中的JSON数据是很常见的需求。这通常用于在测试计划中处理和修改请求体,或者在响应后进行验证。以下是一些步骤和示例代码,帮助你使用BeanShell来获取HTTP请求体中的JSON数…...

为网页LOGO视频增加电影质感表现

为网页LOGO视频增加电影质感表现 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 为网页LOGO视频增加电影质感表现前几天,一个朋友开了一家烤肉店,给我发来了烤肉店的宣传视频,我…...

精益数据分析(32/126):电商指标优化与搜索策略解析

精益数据分析(32/126):电商指标优化与搜索策略解析 在创业和数据分析的探索之旅中,每一次深入学习都能为我们带来新的启发和成长。今天,我们继续秉持共同进步的理念,深入研读《精益数据分析》,…...

​【空间数据分析】缓冲区分析--泰森多边形(Voronoi Diagram)-arcgis操作

泰森多边形(Voronoi Diagram):根据一组输入点生成多边形,使得每个多边形内的任意位置到其关联点的距离最近。 多边形之间无重叠,全覆盖研究区域。 边界是相邻两点连线的垂直平分线。 实验操作: 使用 Cre…...

JavaScript高级进阶(五)

操作节点属性 设置属性&#xff08;先找属性再操作&#xff09; setAttribute()方法添加指定的属性&#xff0c;并为其赋指定的值 语法&#xff1a; element.setAttribute(attributename/属性名,attributevalue/属性值) 例: <style> .box{ width: 200px; height: 200p…...

WPF之TextBlock控件详解

文章目录 1. TextBlock控件介绍2. TextBlock的基本用法2.1 基本语法2.2 在代码中创建TextBlock 3. TextBlock的常用属性3.1 文本内容相关属性3.2 字体相关属性3.3 外观相关属性3.4 布局相关属性 4. TextBlock文本格式化4.1 使用Run元素进行内联格式化4.2 其他内联元素 5. 处理长…...

串口通信协议

什么是串口通信&#xff1f; 串口通信是将数据在一条数据线上传输。 串口通信的特点是传输线少&#xff08;相对于并行通信&#xff09;&#xff0c;长距离传输的成本低&#xff0c;但数据的传送控制比并行通信复杂。 常见的串行通信接口包括&#xff1a;USB&#xff0c;RS-…...

9.idea中创建springboot项目

9. idea中创建springboot项目 步骤 1&#xff1a;打开 IntelliJ IDEA 并创建新项目 启动 IntelliJ IDEA。在欢迎界面&#xff0c;点击 New Project&#xff08;或通过菜单栏 File > New > Project&#xff09;。 步骤 2&#xff1a;选择 Maven 项目类型 在左侧菜单中…...

详解大语言模型生态系统概念:lama,llama.cpp,HuggingFace 模型 ,GGUF,MLX,lm-studio,ollama这都是什么?

llama&#xff0c;llama.cpp&#xff0c;HuggingFace 模型 &#xff0c;GGUF&#xff0c;MLX&#xff0c;lm-studio&#xff0c;ollama这些名词的概念给个详细的解释&#xff0c;彼此什么关系&#xff1f;是不是头很晕&#xff1f; 详解大语言模型生态系统概念 基础模型与架构…...

如何系统学习音视频

学习音视频技术涉及多个领域&#xff0c;包括音频处理、视频处理、编码解码、流媒体传输等。 第一阶段&#xff1a;基础知识准备 目标&#xff1a;掌握音视频学习所需的计算机科学和数学基础。 计算机基础 学习计算机网络基础&#xff08;TCP/IP、UDP、HTTP、RTSP等协议&#…...

elementui里的el-tabs的内置样式修改失效?

1.问题图 红框里的是组件的内置样式&#xff0c;红框下的是自定义样式 2.分析 2.1scoped vue模板编译器在编译有scoped的stye标签时&#xff0c;会生成对应的postCSS插件&#xff0c;该插件会给每个scoped标记的style标签模块&#xff0c;生成唯一一个对应的 data-v-xxxhash…...

Webshell管理工具的流量特征

目录 一、常见Webshell工具流量特征 1. ​​中国菜刀&#xff08;Chopper&#xff09;​​ 2. ​​冰蝎&#xff08;Behinder&#xff09;​​ 3. ​​哥斯拉&#xff08;Godzilla&#xff09;​​ 4. ​​蚁剑&#xff08;AntSword&#xff09;​​ 5. ​​C99 Shell​​…...

61.微服务保姆教程 (四) Gateway---SpringCloud微服务网关组件

Gateway—SpringCloud微服务网关组件 一、Spring Cloud Gateway简介 1.为什么要用Gateway? 在微服务架构中,通常一个系统会被拆分为多个微服务,微服务之间的调用可以用OpenFeign,但面对这么多微服务客户端调用会遇到哪些问题呢? 每个服务都需要鉴权、限流、跨域访问、权…...

问答:C++如何通过自定义实现移动构造函数和移动赋值运算符来实现rust的唯一所有权?

今天,我就带你深入C++的移动语义,用自定义的移动构造函数和移动赋值运算符,硬核模拟Rust的唯一所有权。不仅有干货代码,还会手把手讲明白,保证你看完就能上手。准备好了吗?咱们这就开干! 先搞懂Rust的“独家秘籍” Rust的唯一所有权,简单来说,就是一个资源只能有一个…...

MODSIM选型指南:汽车与航空航天企业如何选择仿真平台

1. 引言 在竞争激烈的汽车与航空航天领域&#xff0c;仿真技术已成为产品研发不可或缺的环节。通过在设计阶段验证概念并优化性能&#xff0c;仿真平台能有效缩短开发周期并降低物理样机制作成本。 MODSIM&#xff08;建模与仿真&#xff09;作为达索系统3DEXPERIENCE平台的核…...

扣子流程图批量导入飞书多维表格

文章目录 整体结构分步骤进行处理1. 程序代码处理2. 多维表格配置 整体结构 整个代码块结构如下&#xff1a; 首先&#xff0c;我们从其他流程中拿到一个数据列表&#xff0c;通过一个循环体&#xff0c;将每一个部分的内容都通过python代码整理后&#xff0c;使用【插件】的…...

Profinet 转 Modbus_4 网关

一、功能概述 1.1 设备简介 本产品是 Profinet 和 Modbus RTU 网关&#xff0c;使用数据映射方式工作。 本产品在 Profinet 侧作为 Profinet 从站&#xff0c;接西门子 PLC 如 1200 、 1500 、 200Smart 等&#xff1b;在 Modbus RTU 侧做为 RTU 主站或从站&#…...

Webug4.0通关笔记03- 第4关POST注入和第5关过滤注入

目录 第04关 POST型注入 1.源码分析 2.sqlmap注入 &#xff08;1&#xff09;bp保存报文 &#xff08;2&#xff09;sqlmap渗透 &#xff08;3&#xff09;获取flag 第05关 过滤型注入 1.源码分析 2.sqlmap渗透 &#xff08;1&#xff09;bp抓包保存报文 &#xff0…...

虹科新品 | 汽车通信新突破!PCAN-XL首发上线!

​​汽车智能化浪潮汹涌 通信技术如何跟上&#xff1f; 虹科带着支持最新CAN XL标准的 PCAN-XL套件 重磅来袭&#xff01; 助力行业快速开启 全新CAN XL标准的测试验证&#xff01; 新品登场&#xff1a;不止是升级 虹科PCAN-XL套件 随着汽车智能化进程加速&#xff0c;传…...

GitHub Actions 自动化部署 Azure Container App 全流程指南

一、前言 本文将详细介绍如何通过 GitHub Actions 实现 Azure Container App 的自动化部署流程。当代码推送到 master 分支时,系统将自动完成镜像构建、推送至 ACR 以及应用部署的全过程。以下是完整的配置方案: 二、GitHub Actions 工作流配置 完整 YAML 文件(.github/wo…...

华为L420Qml在wayland环境下崩溃问题

开发环境 操作系统 : kylin v10sp1qt版本 : qt5.15硬件信息 : 华为L420型号 背景 这个问题是在指定机型才出现的,应用同事帮忙将问题与业务抽离出来形成了一个demo //main.cpp#include #include int main(int argc, char *argv[]){qputenv("QT_QPA_PLATFORM", &quo…...

UniApp 小程序嵌套 H5 页面显示隐藏监听实践

UniApp 小程序嵌套 H5 页面显示隐藏监听实践 一、背景介绍 在小程序嵌套 H5 页面的场景中&#xff0c;经常需要监听页面的显示和隐藏状态&#xff0c;以便于处理一些特定的业务逻辑&#xff0c;如暂停/继续定时器、暂停/继续视频播放等。 二、实现方案 1. 页面可见性 API …...

CentOS上搭建 Python 运行环境并使用第三方库

CentOS上搭建 Python 运行环境并使用第三方库 更新 YUM 配置为阿里云镜像安装依赖包下载 Python 源码解压源码包配置和编译安装验证安装创建虚拟环境安装python第三方库编写并执行 Python 脚本 centos7.9上安装python环境 更新 YUM 配置为阿里云镜像 # 备份原有的 yum 配置文…...

黑马Redis(四)

一、发布探店笔记 案例--实现查看发布探店笔记的接口&#xff1a; 映射到对应数据库 BLOG类中存在和对应数据库表不相关的属性&#xff0c;使用TableField注解表示该字段并不在表中&#xff0c;需要在后续进行手动维护 GetMapping("/{id}")public Result queryBlog…...

绿色版的notepad++怎么加入到右键菜单里

复制以下代码保存为 Notepad.reg&#xff0c;修改自己的“Notepad.exe路径”后&#xff0c;双击运行Notepad.reg。 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\NotePad] "Notepad 打开" "Icon""C:\\Program Files (x86)\\Note…...

C++23 std::byteswap:反转字节 (P1272R4)

文章目录 C23 std::byteswap&#xff1a;反转字节 (P1272R4)引言字节序的基本概念大端字节序小端字节序 C23 std::byteswap的基本概念和功能基本概念功能实现示例代码可能的输出 P1272R4提案相关内容提案背景和动机设计考虑函数规范提案修订历史 std::byteswap的使用场景跨平台…...

DevExpressWinForms-TreeList-设置不可编辑

DevExpress TreeList 编辑权限控制&#xff1a;从全局到细粒度设置 在使用 DevExpress TreeList 控件开发数据展示界面时&#xff0c;根据业务需求限制用户编辑行为是常见需求。本文将从全局禁用编辑、列级权限控制、行级动态限制到单元格精准管控&#xff0c;系统讲解 TreeLi…...

ESP32通过MQTT协议上传数据至onenet物联网平台(新版)

文章目录 一、onenet物联网平台操作 二、esp32端代码 三、测试 一、onenet物联网平台操作 首先创建产品&#xff1a; 接着创建设备&#xff1a; 创建物模型&#xff1a; 接着便是计算接入的token&#xff1a; 在自己的产品详情以及设备详情中找到下面的信息&#xff1a; 接着…...

ppt箭头素材图片大全

ppt箭头怎么打出来&#xff0c;ppt箭头设计&#xff0c;ppt箭头制作&#xff0c;ppt箭头图标素材下载: 箭头_模板素材_PPT模板_ppt素材_免抠图片_AiPPTer...

第十六届蓝桥杯 2025 C/C++组 旗帜

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 思路详解&#xff1a; 代码&#xff1a; 代码详解&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; P12340 [蓝桥杯 2025 省 AB/Python B 第二场] 旗帜 -…...

Docker容器资源控制--CGroup

目录 一、CGroups的含义 二、CGroup的功能和特点 1、CGroups的主要功能 2、CGroups的特点 三、实训 1、利用CGroups实现CPU资源控制 2、利用CGroups实现内存资源控制 3、利用CGroups实现磁盘I/O控制 一、CGroups的含义 CGroups是Linux内核提供的一 种可以限制单个进程或…...

【开源项目】基于sherpa-onnx的实时语音识别系统 - LiveASR

你是否曾经为语音识别系统的部署和配置而烦恼&#xff1f;今天给大家介绍一个基于sherpa-onnx的实时语音识别系统 - LiveASR&#xff0c;让语音识别变得简单易用&#xff01; 项目简介 LiveASR是一个基于sherpa-onnx开发的实时语音识别系统&#xff0c;提供了简单易用的图形界…...

免费超好用的电脑操控局域网内的手机(多台,无线)

使用 第一步 解压QtScrcpy压缩包&#xff0c;并运行QtScrcpy.exe 第二步 2.1 手机开启开发者模式&#xff08;设置>关于本机>版本信息>连点10下“版本号”&#xff09; 2.2 开启 USB调试 和 无线调试&#xff08;设置>开发者选项> USB调试 无线调试&#xf…...

vue 优化策略,大白话版本

1. 避免过度使用响应式数据&#xff08;如冻结大对象&#xff09; 问题&#xff1a;Vue 默认会给所有数据加上“监控”&#xff08;响应式&#xff09;&#xff0c;数据变化时会自动更新页面。但如果是超大的对象&#xff08;比如几万行的表格数据&#xff09;&#xff0c;这个…...

《数学物理方程》——第一章 引入与基本概念

1.1 基本概念和定义 偏微分方程的分类 线性 齐次 非齐次 非线性 拟线性 —— 半线性 完全非线性 1.2 典型方程 1.2.1 波动方程 一维弦自由振动方程&#xff1a; &#xff08;不考虑弦的重量&#xff09;&#xff0c;即&#xff1a; 一维弦强迫振动方程&#xff1a;&a…...

C++入侵检测与网络攻防之TFTP和NTP报文的识别

目录 1.tftp客户端的使用 2.tftp协议分析以及特征提取 3.tftp报文识别1 4.tftp报文识别2 5.复习 6.ntp协议原理 7.ntpdate同步时间和抓包 8.ntp协议解析 9.ntp报文识别实现 10.bug追踪系统 1.tftp客户端的使用 2.tftp协议分析以及特征提取 1 tftp的安装 sudo apt…...

技术赋能与模式重构:开源AI大模型驱动下的“一盘货”渠道革命——基于美的案例与S2B2C生态融合的实证研究

摘要&#xff1a;在全渠道零售时代&#xff0c;渠道效率与库存成本矛盾成为制约企业增长的核心痛点。本文以美的集团“一盘货”模式为实践样本&#xff0c;结合开源AI大模型、AI智能名片、S2B2C商城小程序源码三大技术要素&#xff0c;构建“技术中台供应链协同渠道赋能”的三维…...

如何利用Rust提升Linux服务器效率(详细操作指南)

Rust是一个专注于性能、安全和并发的系统编程语言&#xff0c;非常适合用来优化和提升Linux服务器的运行效率。下面是一些具体方法和建议&#xff0c;告诉你如何利用Rust来提升Linux服务器的效率&#xff1a; 一、替换或重写性能瓶颈模块 重写Bash/Python脚本为Rust Rust编译…...

【工具】Elasticsearch:强大的开源搜索与分析引擎

什么是Elasticsearch&#xff1f; Elasticsearch是一个开源的分布式搜索和分析引擎&#xff0c;基于Apache Lucene构建。它能够近乎实时地存储、搜索和分析大量数据。最初由Shay Banon开发并于2010年发布&#xff0c;Elasticsearch如今已成为最受欢迎的企业搜索引擎之一。 核…...

neo4j基础操作:命令行增删改查

目录 一&#xff0c;Neo4j的增 1.1.新增节点 1.2.新增关系 1.2.1创建节点时&#xff0c;创建关系 1.2.2在已有的节点上&#xff0c;创建关系 二&#xff0c;Neo4j的删除 2.1删除节点 2.1.1无关系的节点删除 2.1.2 有关系的节点删除 三&#xff0c;节点修改 3.1 给节点…...

技术白皮书:Oracle GoldenGate 优势

本文为技术白皮书Oracle GoldenGate 优势的翻译及阅读笔记。以下注释中GoldenGate为OGG。 副标题为&#xff1a;Oracle 数据库的变更数据捕获 (CDC) 技术比较。版本为July, 2021, Version 2.1。 Oracle GoldenGate 被客户和分析师公认为功能最齐全、性能最高、最值得信赖的数…...