FFMPEG之海康实时回调出来的PS流格式

参考博客:PS流格式解析
PES包码流分析提供

前言:

我们知道,利用海康的实时预览接口可以实时监控,并且可以设置回调函数取出码流数据。而根据海康的参考文档中,回调函数的数据类型有三种,一个是系统头;一个是码流数据;另一个是其它数据,这三个值分别对应宏值为0,1,2。但是我们需要注意,当值=1时,该码流数据并不是h264类型(好像有部分设备是支持直接输出H264,我不太记得了),而是被封装成PS流格式的类型。所以我们在推流或者保存的过程中,需要将PS流转成H264码流。

海康针对H264 做如下PS 封装:
每个IDR NALU 前一般都会包含SPS、PPS 等NALU,因此将SPS、PPS、IDR 的NALU 封装为一个PS 包。但该PS包不是完整的PS包,需要再包括ps 头,然后加上PS system header,PS system map,PES header+h264 raw data。
所以一个IDR NALU PS 包由外到内顺序是:PSheader | PS system header | PS system Map | PES header | h264 raw data。对于其它非关键帧的PS 包,就简单多了,直接加上PS头和PES 头就可以了。因为非I帧是不包括系统映射字段的,且系统头是当切仅当为PS流的第一个包才有。所以顺序为:PS header | PES header | h264raw data。以上是对只有视频video 的情况,如果要把音频Audio也打包进PS 封装,也可以。当有音频数据时,将音频数据加上PES header 放到视频PES 后就可以了。顺序如下:PS 包 = PS 头 | PES (video) | PES(audio),再用RTP 封装发送就可以了。

GB28181对RTP传输的数据负载类型有规定(参考GB28181 附录B),负载类型中96-127
== RFC2250 建议96 表示PS 封装,建议97 为MPEG-4,建议98为H264==
即我们接收到的RTP 包首先需要判断负载类型,若负载类型为96,则采用PS 解复用,将音视频分开解码。若负载类型为98,直接按照H264 的解码类型解码。

注:此方法不一定准确,取决于打包格式是否标准。

还有就是,PS 包中的流类型(stream type)只在映射字段出现,所以想分析该流类型,必须再I帧中寻找判断。

下面分析PS流格式每一部分的字段

1 首先是PSheader部分:(来自MPEG2标准中文文档)

在这里插入图片描述
上面可以看到4B的起始码和共42bit的SRC,还有22bit的节目复用速率program_Mux_Rate。但实际上42bit的SRC是由6B组成,其中有2bit是固定01的位,4bit是标记码用于分割。22bit的PMR也一样,由3B组成,最后2bit是标记码。所以我们看下面的实际存储情况。分别给出MPEG2标准中文文档的图和内存的存储情况。前者可以参考作为建立结构体。

MPEG2标准中文文档图:指出比较重要的字段。
在这里插入图片描述
PS包头在内存的存储情况:
起始码:
在这里插入图片描述
系统时钟基准两部分:
在这里插入图片描述
PS复用速率:
在这里插入图片描述

PS包头各字段解析
1)包起始码字段 pack_start_code

值为'0000 0000 0000 0000 0000 0001 1011 1010' (即0x000001BA)的位串,用来标志一个PS包的开始。

2)系统时钟参考字段 system_clock_reference_base、system_clock_reference_extenstion 。
系统时钟参考(SCR)是一个分两部分编码的42位字段。
第一部分system_clock_reference_base是一个长度为33位的字段,其值SCR_base(i)由式2-19给出(查看MPEG2文档);
第二部分system_clock_reference_extenstion是一个长度为9位的字段,其值SCR_ext(i)由式2-20给出。SCR字段指出了基本流中包含ESCR_base最后一位的字节到达节目目标解码器输入端的期望时间。SCR字段的编码频率要求见2.7.1。该字段具体使用时可自行查看文档。

3)标记位字段 marker_bit
1bit字段,取值'1'。

4)节目复合速率字段 program_mux_rate
一个22位整数,规定P-STD在含有该字段的包,期间接收节目流的速率。其值以50字节/秒为单位。不允许取0值。该字段所表示的值用于在2.5.2中定义P-STD输入端的字节到达时间。该字段值在本标准中的节目多路复合流的不同包中取值可能不同。

5)包保留字段 reserved
5位整数。

6)包填充长度字段 pack_stuffing_length
3位整数,规定该字段后填充字节的个数。

以上为固定12字节

7)填充字节字段 stuffing_byte
8位字段,取值恒为'1111 1111'。该字段能由编码器插入,例如为了满足通道的要求。它由解码器丢弃。在每个包标题中最多只允许有7个填充字节。
以上忽略标记码字节总数为13B,但是7)填充字节总共1B可以不要,所以PS头最少为12B。但我们分析时必须带上标记码分析,所以实际分析4+6+3+1=14个字节。

PS头码流分析:

00 00 01 ba 7e ff 3e fb 44 01 00 5f 6b f8 00 00 01 e0 14

1)起始码4B
00 00 01 ba;

2)42bit共6字节SCR及扩展
7e ff 3e fb 44 01//大家可以自己分析具体位数

3)22bit的PS复用速率,单位为50B/s
00 5f 6b//列出二进制码后,右移两位舍弃掉标记码,求出该数的大小,为0x17DA。所以速率rate=0x17DA*50。
额外小提示,因为我在做项目时在VLC拉流播放是黑屏的,所以当我获取PS流分析时,结果速率为0,即这三字节为00 00 03;//3=011为标记码
这是不允许的,所以这应该是在解析PS流时出错,导致无法发送数据,所以速率为0,这也给大家提供一个解决黑屏的思路。

2 接下来看看PS system header(即PS系统头:节目流系统标题)部分的定义:(来自MPEG-2标准文档)

注:Systemheader当且仅当pack是第一个数据包时才存在,即PS包头之后就是系统标题。取值0x000001BB的位串,指出系统标题的开始,暂时不需要处理,读取Header Length直接跳过即可。

语 法 位数 助记符
system_header() {
system_header_start_code 32 bslbf
header_length 16 uimsbf
marker_bit 1 bslbf
rate_bound 22 uimsbf
marker_bit 1 bslbf
audio_bound 6 uimsbf
fixed_flag 1 bslbf
CSPS_flag 1 bslbf
system_audio_lock_flag 1 bslbf
system_video_lock_flag 1 bslbf
marker_bit 1 bslbf
vedio_bound 5 uimsbf
packet_rate_restriction_flag 1 bslbf
reserved_bits 7 bslbf
while (nextbits()==‘1’) {
stream_id 8 uimsbf
‘11’ 2 bslbf
P-STD_buffer_bound_scale 1 bslbf
P-STD_buffer_size_bound 13 uimsbf
}
}

1)系统标题起始码字段
取值'0000 0000 0000 0000 0000 0001 1011 1011' (0x000001BB)的位串,指出系统标题的开始。

2)标题长度字段 header_length
16位字段。指出该字段后的系统标题的字节长度。在本规范将来的扩充中可能扩展该字段。可利用该字段跳出系统头。

3)速率界限字段 rate_bound
22位字段,取值不小于编码在节目流的任何包中的program_mux_rate字段的最大值。即在编码时,值要大于等于PS流包中的PMR字段的最大值。该字段可被解码器用于估计是否有能力对整个流解码。

4)音频界限字段 audio_bound
6位字段,取值是在从0到32的闭区间中的整数,且不小于节目流中解码过程同时活动的GB/T XXXX.3和GB/T AAAA.3音频流的最大数目。在本小节中,若STD缓冲区非空或展现单元正在P-STD模型中展现,则GB/T XXXX.3和GB/T AAAA.3音频流的解码过程是活动的。

5)固定标志字段 fixed_flag
1位标志位。置'1'时表示比特率恒定的操作;置'0'时,表示操作的比特率可变。在恒定比特率的操作期间,复合的GB/T XXXX.1流中的system_clock_reference字段值应遵从下面的线性公式:
SCR_base(i)=((c1×i+c2) DIV 300) % 233 (2-22)
SCR_ext(i)=((c1×i+c2) DIV 300) % 300 (2-23)
其中:
c1 对所有i均有效的实型常数;
c2 对所有i均有效的实型常数;
i在GB/T XXXX.1复合流中包含任何system_clock_reference字段的最后一位的字节索引。

6)CSPS标志字段 CSPS_flag
1位字段。置'1'时,节目流符合2.7.9中定义的限制。

7)系统音频锁定标志字段 system_audio_lock_flag
1位字段。表示在系统目标解码器的音频采样率和system_clock_frequency之间存在规定的比率。system_clock_frequency在2.5.2.1中定义而音频采样率由GB/T XXXX.3规定。如果对节目流中所有音频基本流的所有展现单元进行展现,那么system_clock_frequency和实际音频采样率的比例SCASR是恒定的;若再满足音频流中所指出的标准采样率和下表中数值相等,则该字段只能为'1'。
SCASR=(system_clock_frequency) / audio_sample_rate_in_the_P-STD (2-24)
记号X/Y表示实数除法。

标准音频采样频率(kHz) 16 32 22.05 44.1 24 48
SCASR 27 000 000 /16 000 27 000 000 /32 000 27 000 000 /22 050 27 000 000 /44 100 27 000 000 /24 000 27 000 000 /48 000

8)系统视频锁定标志字段 system_video_lock_flag
1位字段。表示在系统目标解码器的视频帧速率和system_clock_frequency之间存在规定的比率。system_clock_frequency在2.5.2.1中定义而视频帧速率由GB/T XXXX.2规定。如果对GB/T XXXX.1中所有视频基本流的所有展现单元进行展现,那么system_clock_frequency和实际视频帧速率的比例SCFR是恒定的;若再满足视频流中所指出的标准帧速率和下表中数值相等,则该字段只能为'1'。
SCFR=system_clock_frequency / frame_rate_in_the_P-STD (2-25)

标准帧速率(Hz) 23.976 24 25 29.97 30 50 59.94 60
SCFR 1126125 1125000 1080000 900900 900000 540000 450450 450000

比率SCFR的值是精确的。对于23.976,29.97或59.94帧/秒的标准速率,实际的帧速率与标准速率略有不同。

9)视频界限字段 video_bound
5位字段,取值是在从0到16的闭区间中的整数且不小于节目流中解码过程同时活动的GB/T XXXX.2和GB/T AAAA.2流的最大数目。在本小节中,若P-STD缓冲区非空或展现单元正在P-STD模型中展现,则GB/T XXXX.2和GB/T AAAA.2视频流的解码过程是活动的。

10)分组速率限制标志字段packet_rate_restriction_flag
1位标志位。若CSPS标识为'1',则该字段表示2.7.9中规定的哪个限制适用于分组速率。若CSPS标识为'0',则该字段的含义未定义。

11)保留位字段 reserved_bits
7位字段。被保留供ISO/IEC将来使用。它的值应为'111 1111',除非ISO/IEC对它作出其它规定。

12)流标识字段 stream_id
8位字段。指示其后的P-STD_buffer_bound_scale和P-STD_buffer_size_bound字段所涉及的流的编码和基本流号码。 若取值'1011 1000',则其后的P-STD_buffer_bound_scale和P-STD_buffer_size_bound字段指节目流中所有的音频流。
若取值'1011 1001',则其后的P-STD_buffer_bound_scale和P-STD_buffer_size_bound字段指节目流中所有的视频流。
若stream_id取其它值,则应该是大于或等于'1011 1100'的一字节值且应根据表2-18解释为流的编码和基本流号码。
节目流中的每个基本流应在每个系统标题中通过这种机制精确地规定一次它的P-STD_buffer_bound_scale和P-STD_buffer_size_bound。

13)P-STD缓冲区界限比例字段 P-STD_buffer_bound_scale
1位字段。表示用于解释后续P-STD_buffer_size_bound字段的比例系数。若前面的stream_id表示一个音频流,则该字段值为'0'。若表示一个视频流,则该字段值为'1'。对于所有其它的流类型,该字段值可以为'0'也可以为'1'。

14)P-STD缓冲区大小界限字段 P-STD_buffer_size_bound
13位无符号整数,取值不小于节目流中流n的所有分组的P-STD缓冲区大小BSn的最大值。即BSn≤P-STD_buffer_size_bound,实际STD_buffer_size_bound还会以一定单位度量。
若P-STD_buffer_bound_scale的值为'0',则该字段以128字节为单位来度量缓冲区大小的边界。
若P-STD_buffer_bound_scale的值为'1',则该字段以1024字节为单位来度量缓冲区大小的边界。
因此:

if (P-STD_buffer_bound_scale = = 0)

BSn≤P-STD_buffer_size_bound×128

else

BSn≤P-STD_buffer_size_bound×1024

所以对于系统头部的解析,我们一般只要先首先判断是否存在系统头(根据系统头的起始码0x000001BB),然后我们读取系统头的头部长度,即PS SYSTEM HEADER LENGTH部分,然后根据头部的长度,跳过PS系统头。进入下一个部分,即PS 节目流映射头。注:PS映射头只有I帧时才有。

3 接着看看PS流的节目映射流部分(节目流映射)定义:(来自MPEG-2标准文档)

只有I帧才存在的PS包字段。

表2-35 节目流映射

语 法 位数 助记符
program_stream_map() {
packet_start_code_prefix 24 bslbf
map_stream_id 8 uimsbf
program_stream_map_length 16 uimsbf
current_next_indicator 1 bslbf
reserved 2 bslbf
program_stream_map_version 5 uimsbf
reserved 7 bslbf
marker_bit 1 bslbf
program_stream_info_length 16 uimsbf
for (i=0;i<N;i++){
descriptor()
}
elementary_stream_map_length 16 uimsbf
for (i=0;i<N1;i++){
stream_type 8 uimsbf
elementary_stream_id 8 uimsbf
elementary_stream_info_length 16 uimsbf
for (i=0;i<N2;i++) {
descriptor()
}
}
CRC_32 32 rpchof
}

节目流映射中各字段的语义定义:

1)分组起始码前缀字段 packet_start_code_prefix
24位码。它和跟随其后的map_stream_id共同组成一个分组起始码以标志分组的开始。该字段是值为'0000 0000 0000 0000 0000 0001' (0x000001)的位串。

2)映射流标识字段 map_stream_id
8位字段,值为0xBC。

3)节目流映射长度字段 program_stream_map_length
16位字段。指示紧跟在该字段后的program_stream_map中的字节数。该字段的最大值为1018(0x3FA)。

4)当前下一个指示符字段 current_next_indicator
1位字段。置'1'时表示传送的节目流映射当前是可用的。置'0'时表示传送的节目流映射还不可用,但它将是下一个生效的表。

5)节目流映射版本字段 program_stream_map_version
5位字段,表示整个节目流映射的版本号。一旦节目流映射的定义发生变化,该字段将递增1,并对32取模。在current_next_indicator为'1'时,该字段应该是当前适用的节目流映射的版本号;在current_next_indicator为'0'时,该字段应该是下一个适用的节目流映射的版本号。

6)节目流信息长度字段 program_stream_info_length
16位字段,指出紧跟在该字段后的描述符的总长度。

7)标记位字段 marker_bit
1位字段,取值为'1'。

8)基本流映射长度字段 elementary_stream_map_length
16位字段,指出在该节目流映射中的所有基本流信息的字节长度。它只包括stream_type、elementary_stream_id和elementary_stream_info_length字段。(这里注意一下,这里的基本流映射长度,他只包括他后面的指定的那几个定义字段的总和,即从这个长度,我们可以知道后面他根了几种类型的流定义,因为一种流的这个定义字段:
stream_type(1BYTE)、elementary_stream_id(1byte)和elementary_stream_info_length(2byte)字段总和为4个字节,所以用elementary_stream_map_length/4可以得到后面定义了几个流类型信息。)

9)流类型字段 stream_type
8位字段,根据表2-29规定了流的类型。该字段只能标志包含在PES分组中的基本流且取值不能为0x05。
(这里我们暂时根据国标GB28181中的定义可以知道
1、MPEG-4 视频流: 0x10;

2、H.264 视频流: 0x1B;

3、SVAC 视频流: 0x80;

4、G.711 音频流: 0x90;

5、G.722.1 音频流: 0x92;

6、G.723.1 音频流: 0x93;

7、G.729 音频流: 0x99;

8、SVAC音频流: 0x9B。

因为节目映射流字段只有在关键帧打包的时候,才会存在,所以如果要判断PS打包的流编码类型,就根据这个字段来判断。)这个是比较关键的字段

10)基本流标识字段 elementary_stream_id
8位字段,指出该基本流所在PES分组的PES分组标题中stream_id字段的值。
(这个字段的定义,其中0x(C0~DF)指音频,0x(E0 ~ EF)为视频)

11)基本流信息长度字段 elmentary_stream_info_length
16位字段,指出紧跟在该字段后的描述符的字节长度。(即这个类型的流描述长度。这个字段后面的长度不在elementary_stream_map_length指定的范围类。)

12)CRC 32字段 CRC_32
32位字段,循环冗余校验,它包含CRC值以在处理完整个节目流映射后在附录A中定义的解码器寄存器产生0输出值。

这里长度比较多,列出来,大家自己分析一下各自的意义:
1)program_stream_map_length:
map的长度;

2)program_stream_info_length:
该字段后的描述符的总长度。

3)elementary_stream_map_length:
16位字段,指出在该节目流映射中的所有基本流信息的字节长度。它只包括stream_type、elementary_stream_id和elementary_stream_info_length字段。

4)elmentary_stream_info_length:
16位字段,指出紧跟在该字段后的描述符的字节长度。

对于这个字段的解析,我们需要取值0x000001BC的位串(前两个字段),指出节目流映射的开始,暂时不需要处理,读取program_stream_map_length直接跳过即可,如果需要解析流编码类型,必须详细解析这个字段。

例子,取一段码流分析系统标题和节目映射流:

00 00 01 ba 45 a9 d4 5c 34 01 00 5f 6b f8 00 00 …?E??\4…_k?..

01 bb 00 0c 80 cc f5 04 e1 7f e0 e0 e8 c0 c0 20 .?..€??.?.???
以下开始是映射流部分
00 00 01 bc 00 1e e1 ff 00 00 00 18 1b e0 00 0c …?..?..?..

2a 0a 7f ff 00 00 07 08 1f fe a0 5a 90 c0 00 00 *…??Z??..

00 00 00 00 00 00 01 e0 7f e0 80 80 0521 6a 75 …?.?€€.!ju

前14个字节是PS包头(注意,没有扩展);
//1)系统头开始码
00 00 01 bb是系统标题起始码;

//2)系统头后面的数据长度header_length,2B
00 0c说明了系统标题的长度(不包括起始码和长度字节本身);

//3)系统标题内容长度
接下来的12个字节是系统标题的具体内容,这里不做解析;
至此,PS头和PS系统头分析完毕。

4)节目映射流起始码
00 00 01 bc,这是节目映射流起始码;

//5)program_stream_map_length,2B
紧接着的00 1e同样代表该映射流的数据长度,共30字节,即去到00 00 01 e0之前 ;

//6)
e1 ff,包含current_next_indicator、reserved、program_stream_map_version、reserved、marker_bit共两字节。基本没用;

//7)
后面的00 00代表program_stream_info_length流信息长度,这里为0代表没有该流信息。
若存在的话,上面表格可以看到我们需要用循环跳过该长度信息,N=program_stream_info_length。或者用文件指针移动。

//8)
接下来是00 18,代表elementary_stream_map_length基本流长度,说明了后面还有24个字节;即同样去到00 00 01 e0之前 ;
来到这里同样需要循环判断多个基本流(视频流和音频流)
N1=elementary_stream_map_length。

//9)
接下来的1b是stream_type大小一个字节,意思是H264编码格式;

//10)
下一个字节为elementary_stream_id,e0意思是视频流;

//11)
接下来00 0c,是elementary_stream_info_length基本流信息的长度,同样需要循环跳过该信息12个字节。
该字段需要循环跳过。

这里总结一下,上面的是两字节的映射流总长度30,再加上两字节的映射流信息长度0;以上是针对映射流的。
然后是两字节的基本流数据长度24,这里是两字节的基本流信息长度,基本流的长度都需要循环判断或者跳过。

4 接下来我们来分析下PES包的内容:PES包=PES header+code raw data;

在这里插入图片描述
上面给出了总体框架图,部分字段可能不是特别详细。下面我们再对着图来加强记忆。下图比上图更详细的列出PES包的各个字段。需要你自己认真的静下心来看。看时可以对照上图,例如
1)先看6B的包头;
2)再看基本流特有信息;其中PES包头识别标志为2B;PES包头长为1B;PES信息区为46B;填充字节stuffing bytes最多为256B。
3)最后就是可变包数据,最大长度为65526。
在这里插入图片描述
接着我们来看看解析步骤图:(来自MPEG-2标准文档)

表2-17 PES分组:略。
其中:
表2-18 Stream_id赋值:略。
因为这两个表格太长了,没必要再弄。如若用到可参考上面博客链接的图。

PES分组中各字段的语义定义

1)分组起始码前缀字段 packet_start_code_prefix
24位代码,它和后面的stream_id构成了标识分组开始的分组起始码。它是一个值为'0000 0000 0000 0000 0000 0001' (0x000001)的位串。

2)流标识字段 stream_id
在节目流中,它规定了基本流的号码和类型。0x(C0~DF)指音频,0x(E0~EF)为视频。定义参见表2-18。在传输流中,它可以被设定为正确描述表2-18中定义的基本流类型的任何有效值。在传输流中,基本流类型在2.4.4的节目特定信息中作了规定。

3)PES分组长度字段 PES_packet_length
16位字段,指出了PES分组中跟在该字段后的字节数目。值为0表示PES分组长度要么没有规定要么没有限制。这种情况只允许出现在有效负载包含来源于传输流分组中某个视频基本流的字节的PES分组中。

4)PES加扰控制字段 PES_scrambling_control
2位字段,表示PES分组有效负载的加扰方式。当加扰发生在PES层,PES分组标题,如果有可选字段的话也包括在内,不应被加扰(参见2-19)。

5)PES优先级字段 PES_priority
1位字段,指示PES分组中有效负载的优先级。'1'表示PES分组中有效负载的优先级高于该字段为'0'的PES分组有效负载。多路复合器能使用该字段来区分安排基本流中数据的优先级。传输机制不应改动该字段。

6)数据对齐指示符字段 data_alignment_indicator
1位标志。置'1'时表示PES分组标题后紧跟着在2.6.10中的data_alignment_indicator所指出的视频起始码或音频同步字,如果有data_alignment_indicator描述符的话。若其值为'1'且无该描述符,则需要在表2-47和2-48中alignment_type '01'所表示的对齐。当值为'0'时,没有定义是否有任何此种的对齐。

7)版权字段 copyright
1位字段。置'1'时表示相关PES分组有效负载的材料受到版权保护。当值为'0'时,没有定义该材料是否受到版权保护。2.6.24中描述的版权描述符与包含PES分组的基本流相关。若描述符作用于包含PES分组的材料,则版权标志被置为'1'。

8)原始或拷贝字段 original_or_copy
1位字段。置'1'时表示相关PES分组有效负载的内容是原始的;值为'0'表示相关PES分组有效负载的内容是一份拷贝。

9)PTS DTS标志字段 PTS_DTS_flags
2位字段。当值为'10'时,PTS字段应出现在PES分组标题中;当值为'11'时,PTS字段和DTS字段都应出现在PES分组标题中;当值为'00'时,PTS字段和DTS字段都不出现在PES分组标题中。值'01'是不允许的。

10)ESCR标志字段 ESCR_flag
1位标志。置'1'时表示ESCR基础和扩展字段出现在PES分组标题中;值为'0'表示没有ESCR字段。

11)ES速率标志字段 ES_rate_flag
1位标志。置'1'时表示ES_rate字段出现在PES分组标题中;值为'0'表示没有ES_rate字段。

12)DSM特技方式标志字段 DSM_trick_mode_flag
1位标志。置'1'时表示有8位特技方式字段;值为'0'表示没有该字段。

13)附加版权信息标志字段 additional_copy_info_flag
1位标志。置'1'时表示有附加拷贝信息字段;值为'0'表示没有该字段。

14)PES CRC标志字段 PES_CRC_flag
1位标志。置'1'时表示CRC字段出现在PES分组标题中;值为'0'表示没有该字段。

15)PES扩展标志字段 PES_extension_flag
1位标志。置'1'时表示PES分组标题中有扩展字段;值为'0'表示没有该字段。

16)PES标题数据长度字段 PES_header_data_length
8位字段。指出包含在PES分组标题中的可选字段和任何填充字节所占用的总字节数。该字段之前的字节指出了有无可选字段。

17)标记位字段 marker_bit
值为'1'的1位字段。

18)展现时间戳字段 PTS
展现时间与解码时间的关系如下:PTS是一个编码在三个分离字段中的33位数字。它指出了基本流n的第k个展现单元在系统目标解码器中的展现时间tpn(k)。PTS的值以系统时钟频率的1/300(即90 kHz)为单位。展现时间由PTS根据式2-11计算而来。对编码展现时间戳频率的约束参见2.7.4。
PTS(k)=((system_clock_frequency×tpn(k)) DIV 300) % 233 (2-11)
其中,tpn(k)是展现单元Pn(k)的展现时间。

对音频而言,若PES分组标题中有PTS,则它是指PES分组中开始的第一个存取单元。若PES分组中有音频存取单元的首字节,则有一个音频存取单元开始于该PES分组中。
对视频而言,若PES分组标题中有PTS,则它是指包含PES分组中开始的第一个画面起始码的存取单元。若PES分组中有画面起始码的首字节,则有一个画面起始码开始于该PES分组中。
对音频展现单元(PU),low_delay序列中的视频PU以及B画面,展现时间tpn(k)应等于tdn(k)。

对于非low_delay中的I画面和P画面,在存取单元(AU) k和k'之间无解码不连续时,展现时间tpn(k)应等于下一个传输的I画面或P画面的解码时间tdn(k) (参见2.7.5)。若有解码不连续或流终止,则tpn(k)和tdn(k)之间的差别应与初始流一直延续,没有不连续也没有终止时完全相同。
注1: low_delay序列是low_delay标志被设置的视频序列(参见GB/T XXXX.2中的6.2.2.3)。
若音频中有滤波,则系统模型假定滤波不会导致延迟。因此,编码时PTS所涉及的采样与解码时PTS所涉及的采样是相同的。对于可伸缩编码,参见2.7.6。

19)解码时间戳字段 DTS
DTS是一个编码在三个分离字段中的33位数字。它指出了基本流n的第j个展现单元在系统目标解码器中的解码时间tdn(j)。DTS的值以系统时钟频率的1/300 (即90 kHz)为单位。解码时间由DTS根据式2-12计算而来:
DTS(j)=((system_clock_frequency×tdn(j)) DIV 300) % 233 (2-12)
其中,tdn(j)是存取单元An(j)的解码时间。
对视频而言,若PES分组标题中有DTS,则它是指包含PES分组中开始的第一个画面起始码的存取单元。若PES分组中有画面起始码的首字节,则该画面起始码开始于该PES分组中。
对于可伸缩编码,参见2.7.6。

20)ESCR字段 ESCR_base,ESCR_extension

42位字段,分两部分编码。第一部分是一个长度为33位的字段,其值ESCR_base(i)由式2-14给出;第二部分是一个长度为9位的字段,其值ESCR_ext(i)由式2-15给出。ESCR字段指出了基本流中包含ESCR_base最后一个比特的字节到达PES-STD输出端的期望时间(参见2.5.2.4)。

特别地:
ESCR(i)=ESCR_base(i)×300+ESCR_ext(i) (2-13)

其中:
ESCR_base(i)=((system_clock_frequency×t(i)) DIV 300) % 233 (2-14)

ESCR _ext(i)=((system_clock_frequency×t(i)) DIV 1) % 300 (2-15)
ESCR和ES_rate字段(参见下面紧接的语义)包含与PES流序列相关的时间信息。这些字段应满足2.7.3中定义的约束。

21)基本流速率字段 ES_rate
22位无符号整数。对于PES流而言,它指出了系统目标解码器接收PES分组的速率。该字段在它所属的PES分组以及同一个PES流的后续PES分组中一直有效,直到遇到一个新的ES_rate字段。该字段的值以50字节/秒为单位,且不能为0。该字段用于定义PES流的字节到达P-STD输入端的时间(参见2.5.2.4中的定义)。在各个PES分组中,编码在该字段中的值可能不同。

22)特技方式控制字段 trick_mode_control
3位字段。它表示作用于相关视频流的特技方式。对其它类型的基本流,该字段及其后5位的含义没有定义。trick_mode状态的定义参见2.4.2.3的特技模式部分。

当trick_mode状态为假时,对GB/T XXXX.2视频而言,解码过程输出渐进序列中每幅画面的次数N由repeat_first_field和top_field_first字段来规定。对GB/T AAAA.2视频而言,由序列标题决定。

对于隔行序列,当trick_mode状态为假时,对GB/T XXXX.2视频而言,次数N由repeat_first_field和progressive_frame字段来规定。

当trick_mode状态为真时,画面的播放次数依赖于值N。
表2-20 特技方式控制值

描 述
‘000’ 快进
‘001’ 慢动作
‘010’ 冻结帧
‘011’ 快倒
‘100’ 慢倒
‘101-111’ 保留

当该字段值发生变化或特技模式操作停止时,可能会出现下列情况的任意组合:
l 时基不连续;

l 解码不连续;

l 连续性计数器不连续;

在特技模式的情况下,解码和展现的非标准速度可能会导致视频基本流数据中定义的某些字段值不正确。同样,片段结构的语义约束也可能无效。这些例外所涉及的视频语法元素为:
l bit_rate;

l vbv_delay;

l repeat_first_field;

l v_axis_positive;

l field_sequence;

l subcarrier;

l burst_amplitude;

l subcarrier_phase;

在特技模式中,解码器不应该依赖于编码在这些字段中的值。
标准并不要求解码器能解码trick_mode_control字段。但是,能解码该字段的解码器应能满足以下标准要求。
快进fast forword
trick_mode_control字段中的值'000'。当该值出现时,它表示一个快进视频流并定义了PES分组标题中后续5位的含义。intra_slice_refresh位可以被设定为'1'以指出可能有丢失的宏块。解码器可以用前一个解码画面中相同位置的宏块来代替。表2-21中定义的field_id字段,表示应该显示哪个或哪些字段。frequency_truncation字段指出了可能包括的一个系数受限集合。该字段值的含义如表2-22所示。

慢动作 slow motion
trick_mode_control字段中的值'001'。当该值出现时,它表示一个慢动作视频流,并定义了PES分组标题中后续5个比特的含义。对渐进序列而言,该画面应被显示N×rep_cntrl时间,其中N定义如上。
对GB/T AAAA.2视频和GB/T XXXX.2视频渐进序列而言,该画面应被显示N×rep_cntrl时间,其中N定义如上。
对GB/T XXXX.2隔行序列而言,该画面应被显示N×rep_cntrl时间。若该画面是一个帧画面,则待显示的第一个字段在top_field_first为1时应该是顶字段,在top_field_first为0时,应该是底字段(参见GB/T XXXX.2)。该字段被显示N×rep_cntrl / 2时间。该画面的其它字段被显示N-N×rep_cntrl / 2时间。

冻结帧 freeze frame
trick_mode_control字段中的值'010'。当该值出现时,它表示冻结帧视频流,并定义了PES分组标题中后续5位的含义。表2-21中定义的field_id字段,表示应该显示哪个(些)字段。field_id字段指出了包含该字段的PES分组中开始的第一个视频存取单元,除非该PES分组包含0个有效负载字节。在后一种情况下,field_id字段指出了最近的前一个视频存取单元。

快倒 fast reverse
trick_mode_control字段中的值'011'。当该值出现时,它表示一个快倒视频流并定义了PES分组标题中后续5位的含义。intra_slice_refresh位可以被设定为'1'以指出可能有丢失的宏块。解码器可以用前一个解码画面中相同位置的宏块来代替。表2-21中定义的field_id字段,表示应该显示哪个或哪些字段。frequency_truncation字段指出了可能包括的一个系数受限集合。该字段值的含义如表2-22“系数选择值”所示。

慢倒 slow reverse
trick_mode_control字段中的值'100'。当该值出现时,它表示一个慢倒视频流并定义了PES分组标题中后续5位的含义。对GB/T AAAA.2视频和GB/T XXXX.2视频渐进序列而言,该画面应被显示N×rep_cntrl时间,其中N定义如上。
对GB/T XXXX.2隔行序列而言,该画面应被显示N×rep_cntrl时间。若该画面是一个帧画面,则待显示的第一个字段在top_field_first为1时应该是底字段,在top_field_first为'0'时,应该是顶字段(参见GB/T XXXX.2)。该字段被显示N×rep_cntrl/2时间。该画面的其它字段被显示N-N×rep_cntrl / 2时间。

23)字段标识字段 field_id
2位字段,表示应该显示哪个(些)字段。根据表2-21对其进行编码。
表2-21 field_id字段控制值

描 述
‘00’ 仅自顶向下播放
‘01’ 仅自底向上播放
‘10’ 播放所有帧
‘11’ 保留

24)片内参考字段 intra_slice_refresh
1位标志。置'1'时表示PES分组的视频数据编码片中可能有丢失的宏块;置'0'时,表示上述情况可能不出现。更多的信息可参见GB/T XXXX.2。解码器可以用前一个解码画面中同一个位置的宏块来代替丢失的宏块。

25)频率截断字段 frequency_truncation
2位字段。指出在对PES分组中数据进行编码时可能用到受限系数集合。其值定义于表2-22。
表2-22 系数选择值

描 述
‘00’ 仅DC系数非0
‘01’ 仅前三个系数非0
‘10’ 仅前六个系数非0
‘11’ 所有系数均可能非0

26)显示次数控制字段 rep_cntrl
5位字段,指出隔行画面中每一字段的显示次数或渐进画面显示次数。对隔行画面而言,顶字段或底字段是否应首先显示是视频序列标题中trick_mode_control字段和top_field_first字段的功能。该字段值不能为'0'。

27)附加版权信息字段 additional_copy_info
7位字段,包含与版权信息有关的专用数据。

28)前PES分组CRC字段 previous_PES_packet_CRC
16位字段。在对前一个PES分组(不包括该PES分组的标题)进行处理后,该字段包含一个在解码器的16个寄存器中生成0输出的CRC值。该CRC值与附录A中所定义的相类似,但具有以下多项式:
x16+x12+x5+1
注2: 该CRC值是为了用于网络维护,例如将有间隙性错误的源隔离开来,而不是为了供基本流解码器使用。它仅用于计算数据字节,因为在传输过程中PES分组标题数据可能被修改。

29)PES专用数据标志字段 PES_private_data_flag
1位标志。置'1'时表示PES分组标题中包含专用数据;置'0'时表示PES分组标题中无专用数据。

30)包标题字段标志字段 pack_header_field_flag
1位标志。置'1'时表示PES分组标题中有GB/T AAAA.2包标题或节目流包标题。若该字段在包含于节目流中的PES分组中,其值应为'0'。在传输流中,当值为'0'时表示PES标题中无包标题。

31)节目分组序列计数标志字段 program_packet_sequence_counter_flag
1位标志。值为'1'时表示PES分组有program_packet_sequence_counter,MPEG1_MPEG2_identifier和original_stuff_length字段。值为'0'时表示PES分组标题中无这些字段。

32)P-STD缓冲区标志字段 P-STD_buffer_flag
1位标志。置'1'时表示PES分组标题中有P-STD_buffer_scale和P-STD_buffer_size字段。值为'0'时表示PES标题中无这些字段。

33)PES扩展标志字段 PES_extension_flag_2
1位标志,置'1'时表示有PES_extension_field_length及相关字段。

34)PES专用数据字段 PES_private_data
16位字段。包含专用数据。这些数据与其前后的字段组合在一起时,不能与packet_start_code_prefix (0x000001)冲突。

35)包字段长度字段 pack_field_length
8位字段。表示pack_header_field()以字节为单位时的长度。

36)节目分组序列计数字段 program_packet_sequence_counter
7位字段。它是一个可选的计数器,随着来自于节目流或GB/T AAAA.1流的每一个后续的PES分组或传输流中具有单个节目定义的PES分组而递增,以提供与连续性计数器(参见2.4.3.2)相似的功能。它能用于检索节目流或原始GB/T AAAA.1流中的初始PES分组序列。该计数器在达到最大值后回卷为0。PES分组不能出现重复。因此,复合节目中任何两个连续的PES分组不应具有相同的program_packet_sequence_counter值。

37)MPEG1 MPEG2标识符字段 MPEG1_MPEG2_identifier
1位标志。置'1'时表示PES分组携带的信息来自于GB/T AAAA.1流;置'0'时表示PES分组携带的信息来自于节目流。

38)初始填充长度字段 original_stuff_length
6位字段。指定用于初始GB/T XXXX.1分组标题或初始GB/T AAAA.1分组标题中的填充字节数。

39)P-STD缓冲区比例字段 P-STD_ buffer_scale
1位字段。仅当该PES分组包含于节目流中时才有意义。它指出了用来解释后续P-STD_buffer_size字段的比例因子。若前面的stream_id表示一个音频流,该字段值应为'0';若前面的stream_id表示一个视频流,该字段值应为'1'。对于所有的其它流类型,其值可以为'0'或'1'。

40)P-STD缓冲区大小字段 P-STD_buffer_size
13位无符号整数。仅当该PES分组包含于节目流中时才有意义。它定义了P-STD输入缓冲区的大小BSn。若P-STD_ buffer_scale的值为'0',那么P-STD_buffer_size以128字节为单位来度量缓冲区的大小。若P-STD_buffer_scale的值为'1',那么P-STD_buffer_size以1024字节为单位来度量缓冲区的大小。因此:

if ( P-STD_buffer_scale == 0)

BSn=P-STD_buffer_size×128 (式2-16)

else

BSn=P-STD_buffer_size×1024 (式2-17)

当该字段被GB/T XXXX.1系统目标解码器收到后,其编码值立即生效。

41)PES扩展字段长度字段 PES_extension_field_length
7位字段。指出了跟在该字段之后在PES扩展字段中直到且包括任何保留字节的数据的字节长度。

42)填充字节字段 stuffing_byte
8位字段,其值恒定为'1111 1111'。可以由编码器插入以满足通道的需求等。解码器丢弃该字段。一个PES分组标题中只能出现32个填充字节。

43)PES分组数据字节字段 PES_packet_data_byte
该字段应该是来自于由分组的stream_id或PID所指定的基本流的连续数据字节。当基本流数据符合GB/T XXXX.2或GB/T XXXX.3时,该字段应该是与本标准的字节相对齐的字节。基本流的字节序应得到保持。该字段的字节数N由PES_packet_length字段规定。N应等于PES_packet_length减去在PES_packet_length字段的最后一个字节与第一个 PES_packet_data_byte间的字节数。

44)填料字节字段 padding_byte
8位字段,其值恒定为'1111 1111'。该字段被解码器丢弃。

5 例题

例1,PES包码流:

00 00 01 e0 21 33 80 80 05 2b 5f df 5c 95 71 84 …?!3€€.+_??q?

aa e4 e9 e9 ec 40 cc17 e0 68 7b 23 f6 89 df 90 ???@?.?h{#???

a9d4 be 74 b9 67 ad 34 6d f0 92 0d 5a 48 dd 13 ???t?g?4m??.ZH?.

1)前6字节分析:
00 00 01是起始码;//3B

e0是视频流;//1B,stream_id

21 33 是帧长度;//2B,PES包长度,与下面1B的包头长度不一样

2)PES包头识别标志两个字节的分析,它由多位组成:
接下来的两个80 80见下面的二进制解析;
第7、8字节的二进制如下:

1000 0000 1000 0000

按顺序解析:

第7个字节:

10 是标志位,必须是10;

00 是加扰控制字段,‘00’表示没有加密,剩下的01,10,11由用户自定义;

0 是优先级,1为高,0为低;

0 是数据对齐指示字段;

0 是版权字段;

0 是原始或拷贝字段。置’1’时表示相关PES分组有效负载的内容是原始的;'0’表示内容是一份拷贝;

第8个字节:

10 是PTS_DTS字段,这里是10,表示有PTS,没有DTS;

0 是ESCR标志字段,这里为0,表示没有该段;

0 是ES速率标志字段,,这里为0,表示没有该段;

0 是DSM特技方式标志字段,,这里为0,表示没有该段;

0 是附加版权信息标志字段,,这里为0,表示没有该段;

0 是PESCRC标志字段,,这里为0,表示没有该段;

0 是PES扩展标志字段,,这里为0,表示没有该段;

3)包头的长度(1B)分析:
05指出了可选字段的长度,前一字节指出了有无可选字段;

4)5B的PTS分析:
接下来的5字节是PTS;即
2b 5f df 5c 95,对应上图的PTS的五个矩形。具体对应数字查看文档即可,或者上面的图。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 快乐项目:基于阿里云服务器的JAVA发送短信验证码服务

    目录前言:准备条件1、登录阿里云2、添加用户组  (1)创建用户组,分配权限  (2)创建用户组注意细节:3、给用户组添加权限  (1)点击新建的用户组  (2)添加权限:  (3)搜索以下三个权限,其中DysmsFullAccess就是短信验证服务:  (4)添加成功后显示4、添…...

    2024/4/28 14:08:07
  2. 实验室学习笔记(含作业)

    python的初步学习 1.操作系统/虚拟机 2.初度了解 3.注释、变量,认识bug,Debug工具 4.数据类型,输出,拓展 5.输出的转义字符,输出的结束字符,输入的语法 6.交互式开发,运算符 7.条件语句if,多重判断,if嵌套,三目运算符 8.循环语句:while语句,break,continue,while嵌…...

    2024/4/28 12:36:50
  3. 学习笔记(17):零基础掌握 Python 入门到实战-循环语句,周而复始(三)

    立即学习:https://edu.csdn.net/course/play/26676/338787?utm_source=blogtoedubreak 从这个位置开始中断循环 >>> a=0 >>> while a<3:s=input(input your lang:)if s=="python":pring("your lang is{0}".format(s))breakelse:a+=1…...

    2024/4/28 2:36:30
  4. Cocos2d-x中的BMFont(Fnt)字体改名

    客户端如果需要使用特殊字体时,美术一般会给程序BMFont字体。但是美术一般都是随意命名的,按照下图就能将BMFont字体改成我们想要的名字了。以下4处改为同样名字即可。关注公众号:《码之有道》,一起聊游戏全栈开发!1、公众号回复:【教程】获取零基础游戏开发客户端+服务端…...

    2024/4/27 15:12:49
  5. 第二章--Java泛型 第一节--泛型入门

    问题:集合:用于存放多个(不同类型)的对象---- 容易出现转型错误 ClassCastException上面的ArrayList对象没有限定放什么类型的数据,所以我们就往里面放东西了(int型和字符串)解决方法: 集合:存放多个对象(限定为一种类型)---- 不需要转型,没有转型错误泛型(1):泛…...

    2024/4/22 4:35:23
  6. Sonar扫描java项目

    使用sonar完成对例子maven项目的扫描 示例代码下载 https://github.com/SonarSource/sonar-scanning-examples/tree/master/sonarqube-scanner-mavenclone到本地之后,进入项目目录 以本代码为例 cd /software/example_02/sonar/sonarqube-scanner-maven/maven-basic首先需要获…...

    2024/4/26 5:13:06
  7. squid代理介绍----传统代理 和 透明代理 (配置案例)

    文章目录一、suqid的介绍二、squid的代理类型三、squid传统代理的部署3.1、 案例介绍3.2 具体参数配置1、解压squid的安装包2、修改配置文件,编写脚本优化服务启动项3、配置squid传统模式4、配置web服务器5. 在客户端浏览器,设置代理,并访问测试6.查看日志确认访问来源IP四.…...

    2024/3/27 1:02:03
  8. 【信息安全】编码、加密和摘要

    一、概述 在平时生活中或者开发工作中只要遇到涉及信息安全的话题永远也离不开这几个术语“编码”,“加密”和“摘要”。我在刚接触的时候会很迷惑这几个名词究竟有什么区别呢?它们的内涵又是什么?下面就来梳理一下。 二、编码(Encoding) 关于编码维基百科给出了如下的定义…...

    2024/4/25 11:34:28
  9. Kubernetes集群搭建

    前言kubernetes简称K8S,是由Google在2014年开源的生产级别的容器编排系统,虽说14年才开源,但目前已成为业界主流的容器编排标准。如果说Docker是驮着集装箱的鲸鱼,那么K8S就是一个船舵,引领着Docker(或者说容器技术)走向远方。学习K8S已成为一个趋势,俗话说得好,纸上得…...

    2024/4/16 5:09:32
  10. 从大一到大三的编程之路,我所知道的网站和软件,全都是宝藏!

    今天我就将我珍藏已久的宝贝网站分享给大家,希望大家能在学习编程的道路上越走越远!视频学习篇1.B站B站用的好,就像获得宝从前,我以为B站只是个看番,追剧,看鬼畜的网站,直到我发现了它上面的学习资料,B站上面真的有好多好多学习的视频资料,比如想入门,又不想看文档,…...

    2024/3/16 6:01:42
  11. 学习笔记(5):IDEA开发工具+Maven使用详解视频课程(适合初学者的教程)-Maven简介及安装

    立即学习:https://edu.csdn.net/course/play/7907/162049?utm_source=blogtoedumaven作用:①管理项目之间的依赖关系②jar包管理。管理jar包依赖关系,解决jar包冲突自动下载jar包③自动化构建工具术语:中央仓库:网络仓库,存储jar包和插件。地址:repo.maven.apache.org/m…...

    2024/3/19 1:06:51
  12. 学习笔记(4):IDEA开发工具+Maven使用详解视频课程(适合初学者的教程)-Maven简介及安装...

    立即学习:https://edu.csdn.net/course/play/7907/162049?utm_source=blogtoedumaven作用:①管理项目之间的依赖关系②jar包管理。管理jar包依赖关系,解决jar包冲突自动下载jar包...

    2024/3/29 1:55:45
  13. 学习笔记(3):MySQL数据库从入门到实战课-DDL之数据表

    立即学习:https://edu.csdn.net/course/play/27328/362519?utm_source=blogtoedushow engines;create table contacts(id int not null AUTO_INCREMENT primary key; name)show tables;...

    2024/3/16 3:30:05
  14. 【CV-Paper 13】图像分割 02:U-Net-2015

    论文原文:点击此处 论文下载:点击此处 论文被引:12052(08/03/2020) 论文年份:2015文章目录U-Net: Convolutional Networks for Biomedical Image SegmentationAbstract1 Introduction2 Network Architecture3 Training3.1 Data Augmentation4 Experiments5 ConclusionU-Ne…...

    2024/4/25 10:40:00
  15. python读取数据可能出现的故障

    这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是…...

    2024/4/23 13:56:29
  16. Springboot集成EasyExcel实现导入导出

    前言: 之前写过一篇springboot集成poi导出表格的文章,但是当数据量变大后发现,有jvm内存溢出的现象,导致服务宕机;就此现象,必定要做出相应的解决方案才行,这时发现了阿里巴巴提供的easyexcel工具类,github地址:https://github.com/alibaba/easyexcel 本篇文章只讲解e…...

    2024/4/28 1:44:16
  17. 7909:统计数字——map

    描述某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。输入包含n+1行: 第一行是整数n,表示自然数的个数; 第2~n+1每行一个自然数。 40%的…...

    2024/3/16 2:19:02
  18. webgl动画纹理

    动画纹理 绘制动画纹理和图片纹理的基本过程是一致的,只是以视频作为纹理数据来源; 视频的本质是由一系列的图片序列构成,因此本质上动画纹理和图片纹理并没有区别 使用图片纹理时,我们需要等待图片加载完成然后将图形信息绘制到纹理;同理,绘制动画纹理时,我们需要获取到…...

    2024/4/22 23:28:00
  19. Leetcode--107. 二叉树的层次遍历 II

    Leetcode–107. 二叉树的层次遍历 II [9/6/2020] 前言这是我做leetcode的第一题,其实比较简单,主要也是为了熟悉leetcode这个平台,以及相关的答题规范。 本题是hot 100 的第一题,是一个二叉树层次遍历问题,可以运用BFS的手段进行逐行遍历,获取隔行向量,然后自底向上的输…...

    2024/4/25 16:34:06
  20. corejava-笔记——方法的重载&重写

    方法的重载和重写1. 方法的重载(同一个类中)2. 方法的重写(子父类中) 1. 方法的重载(同一个类中) 必须在同一个类中, 要求如下:方法名必须相同方法参数列表必须不同 ① 参数类型不同 ② 参数的个数不同 ③ 参数的类型顺序不同方法的修饰符、返回类型、抛出异常无限制,…...

    2024/3/16 1:20:36

最新文章

  1. 【嵌入式软件】LWIP 以太网通信

    1.互联网模型 1.1 OSI&#xff08;Open System Interconnection&#xff09;七层模型 1&#xff09;应用层&#xff1a; 为上层用户提供应用的接口。常用的应用层的网络协议有&#xff1a;HTTP、FTP、TFTP、SMTP、SNMP、DNS、TELNET、HTTPS、POP3、DHCP 2&#xff09;表示层&…...

    2024/4/29 0:09:58
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 2024.4.10作业

    #include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); } Widget::~Widget() { delete ui; } //显示时间 void Widget::timerEvent(QTimerEvent *e) { QT…...

    2024/4/27 8:45:52
  4. 巨控科技新品发布:全方位升级,引领智能控制新纪元

    标签: #巨控科技 #智能控制 #新品发布 #GRM560 #OPC560 #NET400 在智能控制领域&#xff0c;巨控科技始终以其前沿技术和创新产品引领着市场的潮流。近日&#xff0c;巨控科技再次以其行业领先的研发实力&#xff0c;推出了三大系列的新产品&#xff0c;旨在为各行各业提供更…...

    2024/4/23 6:25:41
  5. OpenHarmony开发-连接开发板调试应用

    在 OpenHarmony 开发过程中&#xff0c;连接开发板进行应用调试是一个关键步骤&#xff0c;只有在真实的硬件环境下&#xff0c;我们才能测试出应用更多的潜在问题&#xff0c;以便后续我们进行优化。本文详细介绍了连接开发板调试 OpenHarmony 应用的操作步骤。 首先&#xf…...

    2024/4/27 20:51:51
  6. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/4/28 4:04:40
  7. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/4/28 12:01:04
  8. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/4/28 16:34:55
  9. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/4/28 18:31:47
  10. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/4/28 12:01:03
  11. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/4/28 12:01:03
  12. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/4/28 12:01:03
  13. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/4/28 16:07:14
  14. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/4/28 23:42:05
  15. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/4/28 9:00:42
  16. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/4/27 18:40:35
  17. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/4/28 4:14:21
  18. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/4/27 13:52:15
  19. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/4/27 13:38:13
  20. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/4/28 12:00:58
  21. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/4/28 12:00:58
  22. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/4/27 22:51:49
  23. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/4/28 7:31:46
  24. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/4/28 8:32:05
  25. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/4/27 20:28:35
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57