MPEG-TS 封装格式详解

MPEG-TS 封装格式详解

  • MPEG-TS 封装格式详解
    • 简介
    • 基本概念
    • TS 文件格式
    • PSI(Program Specific Information)
      • 节目关联表(PAT,Program Association Table)
      • 节目映射表(PMT,Program Map Table)
      • 实例
    • TS Header
    • 调整字段(adaptation field)
    • PES(Packet Elemental Stream)
      • pes header
      • optional pes header
    • ES(Elementary Stream)
    • 实例:TS 封装过程
    • 参考

MPEG-TS 封装格式详解

简介

MPEG-TS一种标准数据容器格式,传输与存储音视频、节目与系统信息协议数据,应用于数字广播系统,譬如DVB,ATSC与IPTV。传输流在MPEG-2第1部分系统中规定,正式称为ISO / IEC标准13818-1或ITU-T建议书。

MPEG2/DVB是一种多媒体传输、复用技术,在数字电视广播中可提供数百个节目频道。复用的含义是,可以同时传输多层节目。MPEG-TS 主要应用于实时传送的节目,比如实时广播的电视节目。MPEG-TS 格式的特点就是要求从视频流的任一片段开始都是可以独立解码的。简单地说,如果 DVD 上的 VOB 文件数据部分损坏了,就会导致整个文件无法解码,而电视节目是任何时候打开电视机都能解码的。

注意,DVB全称为Digital Video Broadcasting,包括不同的系统,如卫星数字电视广播系统,有线数字电视广播系统,地面开路数字电视广播系统,交互式数字电视广播系统以及数字电视加扰系统。DVB系统标准是一种全球数字电视技术的标准。如何定义广播中的比特流语法与句法,以实现在比特流中复用数字音频与视频,欧洲的DVB采用数字视频压缩MPEG-2标准,该标准是定义比特流的语法与句法的一个ISO/IEC标准,即13818-1标准。DVB系统的核心技术是采用MPEG-2技术进行视频、音频的编码,使用统一的MPEG-2传输流(TS流)。

MPEG-2标准中,有两种不同的码流输出到信道,一种是节目码流(PS: Program Stream),适用于没有传输误差的场景;一种是传输流(TS:Transport Stream),适用于有信道噪声的传输场景。节目流设计用于合理可靠的媒体,如光盘(如DVD),而传输流设计用于不太可靠的传输,即地面或卫星广播。此外,传输流可以携带多个节目。

MPEG-2 system(编号13818-1)是MPEG-2标准的其中一部分,该部分描述了多个视频,音频和数据多种基本流(ES)合成传输流(TS)和节目流(PS)的方式。

基本概念

  • ES(Elementary Stream):基本码流,包含音频、视频、数据的连续码流。直接从编码器出来的数据流,可以是编码过的视频数据流(H.264、MJPEG等),音频数据流(AAC),或其他编码数据流的统称。ES流经过PES打包器之后,被转换成PES包。

  • PES(Packet Elementary Stream):ES形成的分组称为PES分组,是用来传递ES的一种数据结构。PES流是ES流经过PES打包器处理后形成的数据流,在这个过程中完成了将ES流分组、打包、加入包头信息(主要加入了PTS/DTS信息)等操作(对ES流的第一次打包)。PES流的基本单位是PES包,PES包由包头和payload组成。每个PES包的PID是一致的,一个PES包可能由若干个TS包组成。

  • TS(Transport Stream):传输流,固定长度188字节。TS在PES层上加入了数据流识别和传输的必要信息,是对PES的重新封装。TS含有独立的一个或者多个program,一个program又可以包含多个视频,音频和文字信息的ES流。

TS 文件格式

一个 .ts 文件实际上由多个 ts packet 组成,每个 ts packet 大小固定为 188 Bytes。可以是AAC、H264、 PAT、PMT等。每个TS都有PID。

ts 层分为三个部分:ts header、adaptation field、payload。ts header 固定 4 个字节;adaptation field 可能存在也可能不存在,主要作用是给不足 188 字节的数据做填充;payload 是 pes 数据。188-4-adaptation field 就是payload的大小。

在这里插入图片描述

ts文件分为三个层次:ts层、pes层、es层。es层就是音视频数据,pes层是在音视频数据上加了时间戳等数据帧的说明信息,ts层是在pes层上加入了数据流识别和传输的必要信息。

ts 层的内容是通过 PID 值来标识的,主要内容包括:PAT 表、PMT 表、音频流、视频流。解析 ts 流要先找到 PAT 表,只要找到 PAT 就可以找到 PMT,然后就可以找到音视频流了。PAT 表的和 PMT 表需要定期插入 ts 流,因为用户随时可能加入 ts 流,这个间隔比较小,通常每隔几个视频帧就要加入 PAT 和 PMT。PAT 和 PMT 表是必须的,还可以加入其它表如 SDT(业务描述表)等,不过 HLS 流只要有 PAT 和 PMT 就可以播放了。

  • PAT 表:主要的作用就是指明了 PMT 表的 PID 值。
  • PMT 表:主要的作用就是指明了音视频流的 PID 值。
  • 音频流/视频流:承载音视频内容。

在这里插入图片描述

ES流打包成PES流:

在这里插入图片描述

PES流打包成TS流:

在这里插入图片描述

PSI(Program Specific Information)

PSI(节目特定信息)表用来描述传送流的组成结构。

PSI信息由四种类型的表组成,包括节目关联表(PAT,Program Association Table),节目映射表(PMT,Program Map Table),条件接收表(CAT,Conditional Access Table),网络信息表(NIT,Network Infomation Table)。

结构名PID 值描述
PAT0x0000解析 .ts 文件的第一步就是找到 PAT 表,然后获取 PMT 表的 PID 值
PMT在 PAT 中给出根据 PMT 表找到 audio pes packet 和 video pes packet 的 PID 值
CAT0x0001将一个或多个专用EMM流分别与唯一的PID相关联,描述了TS流的加密方式
NITPAT 中给出描述整个网络,如多少个TS流,频点和调制方式等

其中,PAT与PMT两张表帮助我们找到该传送流中的所有节目与流。PAT告诉我们,该TS流由哪些节目组成,每个节目的节目映射表PMT的PID是什么;而PMT告诉我们,该节目由哪些流组成,每一路流的类型与PID是什么。CAT与NIT暂时不考虑。

节目关联表(PAT,Program Association Table)

PAT 层次图:

在这里插入图片描述

各字段解释:

字段类型描述
table_id8b固定为0x00
section_syntax_indicator1b固定为1
zero1b固定为0
reserved2b固定为11
section_length12b后面数据的长度
transport_stream_id16b传输流ID,固定为0x0001
reserved2b固定为11
version_number5b版本号,固定为00000,如果PAT有变化则版本号加1
current_next_indicator1b固定为1,表示这个PAT表可以用,如果为0则要等待下一个PAT表
section_number8b固定为0x00
last_section_number8b固定为0x00
开始循环
program_number16b节目号为0x0000时表示这是NIT,节目号为0x0001时,表示这是PMT
reserved3b固定为111
PID13b节目号对应内容的PID值
结束循环
CRC3232b前面数据的CRC32校验码

PAT 句法图:

在这里插入图片描述

节目映射表(PMT,Program Map Table)

PMT 层次图:

在这里插入图片描述

各字段解释:

字段类型描述
table_id8bPMT表取值随意
section_syntax_indicator1b固定为1
zero1b固定为0
reserved2b固定为11
section_length12b后面数据的长度
program_number16b频道号码,表示当前的PMT关联到的频道,取值0x0001
reserved2b固定为11
version_number5b版本号,固定为00000,如果 PAT 有变化则版本号加1
current_next_indicator1b固定为1
section_number8b固定为0x00
last_section_number8b固定为0x00
reserved3b固定为111
PCR_PID13bPCR(节目参考时钟)所在TS分组的PID,指定为视频 PID
reserved4b固定为1111
program_info_length12b节目描述信息,指定为0x000表示没有
开始循环
stream_type8b流类型,标志是 video 还是 audio 还是其他数据,h.264 编码对应 0x1b,aac 编码对应 0x0f,mp3 编码对应 0x03
reserved3b固定为111
elementary_PID13b与 stream_type 对应的 PID
reserved4b固定为1111
ES_info_length12b描述信息,指定为0x000表示没有
结束循环
CRC3232b前面数据的CRC32校验码

PMT 句法图:

在这里插入图片描述

实例

在这里插入图片描述

举个例子,你找个一个TS包,它的PID是0,说明它的负载内容是PAT信息,解析PAT信息,你发现节目1的PMT表的PID是0x10,接着,你在比特流中寻找一个PID为0x10的TS包,它的负载内容是节目1的PMT表信息,解析该PMT信息,你可以发现第一路流是MPEG2音频流,PID号0x21,第二路流是MPEG2视频流,PID号是0x22,第三路流是DVB字幕流,PID号是0x23,解析完毕,凡是比特流中PID号为0x22的TS包,所负载的内容为MPEG2视频流,把这些包一个一个找出来,把其中的有效码流一部分一部分的拼接起来,然后送给解码器去解码。

注意,就一般的视频流而言,只要拼接成一个完整的PES包,就可以送出去给解码器,然后再继续拼接下一个PES包。

TS Header

TS 包的包头提供关于传输方面的信息,大小固定为 4 字节。

TS Header 的结构如下:

在这里插入图片描述

以下是各字段的详细解释:

  1. sync_byte(8bits):同步字节,是包中的第一个字节,固定为 0x47,表示后面是一个 TS 分组(注:后面包中的数据不会出现 0x47 的),用于建立发送端和接收端包的同步。
  2. transport_error_indicator(1bit):传输错误标志位,为 1 表示在相关的传输包中至少有一个不可纠正的错误位。当被置 1 后,在错误被纠正之前不能重置为 0。
  3. payload_unit_start_indicator(1bit):负载起始标识,针对不同的负载,有不同的含义。
    • PES:置为 1,标识 TS 包的有效载荷以 PES 包的第一个字节开始,即此 TS 包为 PES 包的起始包,且此 TS 分组中有且只有一个 PES 包的起始字段;置为 0,表示 TS 包不是 PES 包的起始包,是后面的数据包。
    • PSI:置为 1,表示 TS 包中带有 PSI 数据分段的第一个字节,即这个 TS 包是 PSI Section 的起始包,则此 TS 包的负载的第一个字节带有 pointer_field,用来指示 PSI 数据在 payload 中的位置;置为 0,表示 TS 包不带有 PSI Section 的第一个字节,即此 TS 包不是 PSI 的起始包,即在有效负载中没有 pointer_filed,有效负载的开始就是 PSI 的数据内容。对于空包,payload_unit_start_indicator 应该置为 0。
      比如:若 TS 包载荷为 PAT,则当接收到 TS 包的 payload_unit_start_indicator 为 1 时,表明这个 TS 包包含了 PAT 头信息,从这个包里面解析出 section_length 和 continuity_counter,然后继续收集后面的 payload_unit_start_indicator = 0 的 TS 包,并判断 continuity_counter 的连续性,不断读出 TS 包中的净载荷(也就是 PAT 数据),用 section_length 作为收集 TS 包结束条件。
  4. transport_priority(1bit):传输优先标志,为 1 表明当前 TS 包的优先级比其他具有相同 PID,但此位没有被置 1 的 TS 包高。
  5. transport_priority(1bit):传输优先标志,为 1 表明当前 TS 包的优先级比其他具有相同 PID,但此位没有被置 1 的 TS 包高。
  6. PID(13bits):指示有效负载中数据的类型。PID 是识别 TS 包的重要参数,用来识别 TS 包所承载的数据。在 TS 码流生成时,每一类业务(视频,音频,数据)的基本码流均被赋予一个不同的识别号 PID,解码器借助于 PID 判断某一个 TS 包属于哪一类业务的基本码流。标准中定义的 PID 分配见如下表:
PID 值描述
0x0000节目关联表(program association table, PAT)
0x0001条件访问表(conditional access table, CAT)
0x0002传送流描述表(transport stream description table, TSDT)
0x0003~0x000F保留
0x0010~0x1FFE自由分配
0x1FFF空包
  1. transport_scrambling_control(2bits):有效负载加密模式标志,00 表示未加密。如果传输包包头中包括调整字段,不应被加密。其他取值含义是用户自定义的。

  2. adaption_field_control(2bits):调整字段标志,表示此 ts 首部是否跟随调整字段和负载数据。占 2bits,字段值含义如下:

    • 00:保留;
    • 01:表示无调整字段,只有有效负载数据;
    • 10:表示只有调整字段,无有效负载数据;
    • 11:表示有调整字段,且其后跟随有效负载数据;
  3. continuity_counter(4bits):循环计数器,用于对传输误码进行检测。在发送端对所有的包都做 0~15 的循环计数,起始值不一定是 0。在接收终端,如发现循环计数器的值有中断,表明数据在传输中有丢失。

代码实现:

typedef struct MPEGTS_FIXED_HEADER
{
	/* byte 0 */
	unsigned sync_byte : 8; // 同步字节,值为 0x47

	/* byte 1, 2 */
	unsigned transport_error_indicator : 1; // 传输错误指示位,置 1 时,表示传送包中至少有一个不可纠正的错误位
	unsigned payload_unit_start_indicator : 1; // 负载单元起始指标位,针对不同的负载,有不同的含义
	unsigned transport_priority : 1; // 传输优先级,表明该包比同个 PID 的但未置位的 TS 包有更高的优先级
	unsigned PID : 13; // 该 TS 包的 ID 号,如果净荷是 PAT 包,则 PID 固定为 0x00

	/* byte 3 */
	unsigned transport_scrambling_control : 2; // 传输加扰控制位
	unsigned adaptation_field_control : 2; // 自适应调整域控制位,分别表示是否有调整字段和负载数据
	unsigned continuity_counter : 4;// 连续计数器,随着具有相同 PID 的 TS 包的增加而增加,达到最大时恢复为 0
	/* 如果两个连续相同 PID 的 TS 包具有相同的计数,则表明这两个包是一样的,只取一个解析即可。 */
} MPEGTS_FIXED_HEADER; // MPEG-TS 包头占 4 字节

调整字段(adaptation field)

在MPEG-TS中,为了传送打包后长度不足188B(包括包头)的不完整TS,或者为了在系统层插入节目时钟参考PCR(Program Clock Reference)字段,需要在TS包中插入可变长度的调整字段。

当 TS Header 的 adaption_field_control 字段的第一个比特位是 1 时,说明该 TS packet 有调整字段(adaptation field)。

调整字段包括对较高层次的解码功能有用的相关信息,调整字段的格式基于采用若干标志符,以表示该字段的某些特定扩展是否存在。调整字段由调整字段长度、不连续指示器、随机存取器、PCR标志符、基本数据流优先级指示器、拼接点标志符、传送专用数据标志、调整字段扩展标志以及有相应标志符的字段组成。

adaptation field 结构如下:

字段大小描述
adaptation_field_length8 bit调整字段长度
discontinuity_indicator1 bit不连续指示器,一般为 0
random_access_indicator1 bit随机存取器,一般为 0
elementary_stream_priority_indicator1 bit基本数据流优先级指示器,一般为 0
PCR_flag1 bitPCR标志符,携带 pcr 时置 1
OPCR_flag1 bitOPCR标志符,一般为 0
splicing_point_flag1 bit拼接点标志符,一般为 0
transport_private_data_flag1 bit传送专用数据标志,一般为 0
adaptation_field_extension_flag1 bit调整字段扩展标志,一般为 0
PCR40 bit当 PCR_flag=1 时携带
stuffing_bytes不定填充字节,取值0xff

针对不同的 ts payload,adaptation field 的应用方式也不同:

  • 针对 PAT、PMT,不足 188 Bytes 的部分直接使用 0xff 进行填充,而不会使用 adaptation field(但是也有例外,有的编码器会携带)。
  • 针对 PES packet,才会使用 adaptation field 做填充。
    • audio PES packet 不会在 adaptation field 中携带 PCR 字段。
    • video PES packet 可以选择是否在 adaptation field 中携带 PCR 字段。一般 PES packet 被拆分时,会在第一个和最后一个拆分包添加 adaptation field。第一个拆分包的 adaptation field 才会携带 pcr 时钟,且主要作用是为了携带 pcr 时钟,而不是为了填充数据;最后一个拆分包的 adaptation field 不会携带 pcr 时钟,只做填充用。

PCR 属于编码端的时钟,其作用是如果编码端时钟源与解码端时钟源不同步,那么解码端应该采用 pcr 作为自己的时钟源,以同步编码端。

例如编码端时钟是解码端的 2 倍,解码端是正常的物理时钟,这时一个物理世界 5min 的视频,因为编码端时钟源走得太快,那么最后一个视频帧的 dts 就是 10min。播放端直接播放的话,就会播放 10min,显得播放得很慢。所以播放端需要加快播放,方法就是采用 pcr 时钟作为自己的时钟源,让自己的时钟走得跟编码端一样快,这样看起来就是正常速度播放了。

注意,adaptation field 最少占用 1 个字节,即 adaptation_field_length 字段,这样最少可以填充 1 个字节。

adaptation field 层次图:

在这里插入图片描述

adaptation field 句法图:

在这里插入图片描述

PES(Packet Elemental Stream)

每个 pes packet 都包含一个完整的视频帧或音频帧,pes packet 结构如下:

  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  | pes header |   optional pes header    |      pes payload    |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      6 Byte           3~259 Byte              max 65526 Byte

PES 层次图:

在这里插入图片描述

PES 句法图:

在这里插入图片描述

pes header

6 Bytes 固定的 PES Header 结构如下:

字段大小描述
packet_start_code_prefix3 比特起始码,固定为 0x000001
stream_id1 比特PES 包中的负载流类型。音频取值(0xc0-0xdf),通常为0xc0;视频取值(0xe0-0xef),通常为0xe0
PES_packet_length2 比特PES 包长度,包括此字段后的可选包头和负载的长度。0表示长度不限制,只有视频数据长度会超过0xffff

optional pes header

optional pes header 可选包头中的控制信息有很多,这里我们只给出与 pts、dts 有关的结构:

字段大小描述
PTS_DTS_flags2 bit10 表示 PES 头部有 PTS 字段,11 表示有 PTS 和 DTS 字段,00 表示都没有,10 被禁止
pts40 bit实际 pts 长度占用 33 bit
dts40 bit实际 dts 长度占用 33 bit

PTS(显示时间戳)和 DTS(解码时间戳),是用来音视频同步的。DTS/PTS是相对SCR(系统参考)的时间戳,是以 90000 为单位,PTS/DTS 到 ms 的转换公式是 PTS/90,系统时钟频率为 90Khz,所以转换到秒为 PTS/90000。

PTS 和 DTS 字段的长度为 40 bit,实际中间有 7 个填充位,有效长度为 33 bit。

在这里插入图片描述

ES(Elementary Stream)

es 层指的就是音视频数据。

以视频数据为 H.264 格式,音频数据为 AAC 格式为例:

video:
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |   start code    | nalu header |          h264 data            |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
         4 byte          1 byte               x byte
audio:
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  | adts header |                     aac data                    |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      7 byte                           x byte

关于 H.264 的详细介绍:H.264 压缩与编解码原理

关于 AAC 的详细介绍:AAC 格式详解

实例:TS 封装过程

一个 PAT 包含整个 TS 流的信息,其中里面有一张表,比较重要的两个属性 program_number 和program_map_PID,可能出现多对,每一对 program_number 表示一个节目,而与该 program_number 对应的 program_map_PID 则表示该节目对应的流信息应该放在一个 PMT 表中,而该 PMT 表的 PID 应该与这里的 program_map_PID 相等。

一个PMT中描述了流的类型,其中0x0f表示AAC音频,而0x1b表示H264视频,除这两种之外还有其他流,例如字幕。elementay_PID表示该流的数据应该存放在以该PID为表示的TS包中。

  +-+-+-+-+-+-+-+-+-+-+-+
  | PAT                 | 
  |                     |
  | program_number  5   |___
  | program_map_PID 10  |   |
  |                     |   |
  | program_number  6   |___|__  
  | program_map_PID 11  |   |  |
  |                     |   |  |  
  | program_number  7   |   |  |   
  | program_map_PID 12  |   |  |
  |                     |   |  |
  |         ...         |   |  |
  |                     |   |  |
  +-+-+-+-+-+-+-+-+-+-+-+   |  |
                            |  |
  +-+-+-+-+-+-+-+-+-+-+-+   |  |
  | PMT                 |   |  |
  | TS Header PID = 10  |<——   |
  |                     |      |
  | stream_type    0x0f |______|__________________0x0f表示AAC音频,下方AAC数据打包PID=20,   
  | elementary_PID 20   |      |
  | stream_type    0x1b |______|__________________0x1b表示H264视频,下方H264数据打包PID=22 
  | elementary_PID 22   |      |
  |                     |      |  
  +-+-+-+-+-+-+-+-+-+-+-+      |
                               |
  +-+-+-+-+-+-+-+-+-+-+-+      |
  | PMT                 |      | 
  | TS Header PID = 11  |<————— 
  |                     |
  | stream_type    0x0f |   
  | elementary_PID 23   |
  | stream_type    0x1b |
  | elementary_PID 24   |
  |                     |  
  +-+-+-+-+-+-+-+-+-+-+-+

音频数据打包过程:

裸ACC数据:
  +-+-+-+-+-+-+-+-+-+-+-+
  |         AAC         |          
  +-+-+-+-+-+-+-+-+-+-+-+
添加PES头的ACC数据:
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  | AAC PES |         AAC         |          
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
添加TS头将PES分割之后的TS包,假设正好分割成2个TS包,包大小固定188字节,不够用adaptation域填充一般填充0xFF:
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |TS | AAC PES |  AAC 1  |TS | adaptation|    AAC 2    |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |- - - - Packet 1 - - - |- - - - - Packet 2 - - - - - |
  <假设 PID = 20 的TS包>            

视频数据打包过程:

裸H264数据,一帧:
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |              H264             |          
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
添加PES头之后的H264数据,一帧表示一个PES包:
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  | H264 PES|           H264                |          
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
将一个PES包分割之后,分别添加TS头之后的TS包。
这里假设分割成3个TS包,每个包固定大小188字节(包含TS包头在内),
最后一个包不够188字节使用adaptaion域填充0xFF:
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |TS | H264 PES| H264 1|TS |  H264 2     |TS | adaptation|  H264 3 |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |- - - Packet 1 - - - |- - Packet 2 - - | - - - - Packet 3 - - - -|
  <假设 PID = 22 的TS包>

现在回头看下面这个是不是有些头绪了。

在这里插入图片描述

参考

  1. https://www.cnblogs.com/moonwalk/p/16200434.html
  2. https://blog.csdn.net/leek5533/article/details/104993932/
  3. https://www.cnblogs.com/jimodetiantang/p/9140808.html
  4. https://zhuanlan.zhihu.com/p/612042998
  5. https://blog.csdn.net/Kayson12345/article/details/81266587
  6. https://www.cnblogs.com/lvyunxiang/p/15792678.html
  7. https://blog.csdn.net/u012117034/article/details/124881444
  8. https://blog.csdn.net/michaeluo/article/details/75263462
  9. TS协议解析第四部分(adaptation field)
  10. https://blog.csdn.net/m0_60259116/article/details/125451635
  11. https://www.cnblogs.com/jimodetiantang/p/9146855.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/676953.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索k8s集群的配置资源(secret和configmap)

目录 ConfigMap ConfigMap&#xff08;主要是将配置目录或者文件挂载到k8s里面使用&#xff09; 与Secret类似&#xff0c;区别在于ConfigMap保存的是不需要加密配置的信息。&#xff08;例如&#xff1a;配置文件&#xff09; ConfigMap 功能在 Kubernetes1.2 版本中引入&…

算法 java 排序和查找

排序和查找 冒泡排序&#xff08;稳定&#xff09;选择排序&#xff08;不稳定&#xff09;插入排序&#xff08;稳定&#xff09;希尔排序&#xff08;不稳定&#xff09;归并排序&#xff08;稳定&#xff09;快速排序&#xff08;不稳定&#xff09;堆排序计数排序桶排序基数…

Scikit-Learn随机森林分类

Scikit-Learn随机森林分类 1、随机森林分类1.1、随机森林分类概述1.2、随机森林分类的优缺点2、Scikit-Learn随机森林分类2.1、Scikit-Learn随机森林分类API2.2、Scikit-Learn随机森林分类初体验(葡萄酒分类)2.3、Scikit-Learn随机森林分类实践(鸢尾花分类)2.4、参数调优与…

undefined symbol: _ZN3c104impl8GPUTrace13gpu mmcv

这里写自定义目录标题 ImportError: //python3.8/site-packages/mmcv/_ext.cpython-38-x86_64-linux-gnu.so: undefined symbol: _ZN3c104impl8GPUTrace13gpuTraceStateEERROR conda.cli.main_run:execute(49): 这样的问题往往都是版本不匹配导致的 pytorch的版本&#xff0c;m…

为Android组件化项目搭建Maven私服

概览 文章目录 概览前言搭建 maven 私服服务器环境jdk安装配置nexus安装配置管理创建存储点、仓库 项目中使用 maven 私服上传 module 到仓库自动发布 module手动上传单个aar包 引用仓库中的 modulebuild.gradle引入远程module FAQ开发阶段有些module用远程依赖&#xff0c;有些…

构建大型语言模型(LLM)产品的实战指南

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

#13前端后花园周刊-10个现代 Node.js 运行时新特性、Nextjs15、Astro4.9、CSS压缩

⚡️行业动态 JavaScript 的创建者 Brendan Eich 在 Twitter/X 上出现&#xff0c;反驳了 JS 是“最邋遢的”的说法&#xff0c;称其只有 50% 。 &#x1f4c6;发布 Next.js 15 RC 流行的 React 元框架已经准备好迎接一个主要的新版本&#xff0c;它有一个 RC&#xff0c;让…

YOLOv9改进策略 | 添加注意力篇 | 利用YOLOv10提出的PSA注意力机制助力YOLOv9有效涨点(附代码 + 详细修改教程)

一、本文介绍 本文给大家带来的改进机制是YOLOv10提出的PSA注意力机制&#xff0c;自注意力在各种视觉任务中得到了广泛应用&#xff0c;因为它具有显著的全局建模能力。然而&#xff0c;自注意力机制表现出较高的计算复杂度和内存占用。为了解决这个问题&#xff0c;鉴于注意…

群体优化算法---蝙蝠优化算法分类Iris数据集

介绍 蝙蝠算法&#xff08;Bat Algorithm, BA&#xff09;是一种基于蝙蝠回声定位行为的优化算法。要将蝙蝠算法应用于分类问题&#xff0c;可以通过将蝙蝠算法用于优化分类器的参数&#xff0c;图像分割等 本文示例 我们使用一个经典的分类数据集&#xff0c;如Iris数据集&…

基于深度学习的CT影像肺癌检测识别

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 肺癌是全球范围内导致癌症死亡的主要原因之一&#xff0c;早期检测和诊断对于提高患者生存率至关重要。随着深度学习技术的迅猛发展&#xff0c;基于CT影像的肺癌检测识别成为了研究热点。本文介绍…

Spire.PDF for .NET【文档操作】演示:在 C# 中向 PDF 文件添加图层

Spire.PDF 完美支持将多页 PDF 拆分为单页。但是&#xff0c;更常见的情况是&#xff0c;您可能希望提取选定的页面范围并保存为新的 PDF 文档。在本文中&#xff0c;您将学习如何通过 Spire.PDF 在 C#、VB.NET 中根据页面范围拆分 PDF 文件。 Spire.PDF for .NET 是一款独立 …

wireshark 二次开发

一、 Windows 准备 1、源代码下载 Git&#xff1a;https://github.com/wireshark/wireshark 2、 准备Visual C 要编译wireshark&#xff0c;开发电脑上应该安装了Visual Studio并包括了Visual C&#xff0c;请至少安装Visual Studio 2010以减少不必要的麻烦。 visual studio …

英码科技推出鸿蒙边缘计算盒子:提升国产化水平,增强AI应用效能,保障数据安全

当前&#xff0c;随着国产化替代趋势的加强&#xff0c;鸿蒙系统Harmony OS也日趋成熟和完善&#xff0c;各行各业都在积极拥抱鸿蒙&#xff1b;那么&#xff0c;边缘计算要加快实现全面国产化&#xff0c;基于鸿蒙系统开发AI应用势在必行。 关于鸿蒙系统及其优势 鸿蒙系统是华…

友顺科技(UTC)分立器件与集成IC产品选型和应用

友顺科技股份有限公司成立于1990年&#xff0c;是全球领先的集成电路与功率半导体厂商 ,集团总部位于台北&#xff0c;生产基地位于福州、厦门。 友顺科技具有完整模拟组件产品线&#xff0c;其中类比IC涵盖各种稳压器、PWM控制IC, 放大器、比较器、逻辑IC、Voltage Translato…

Pulsar 社区周报 | No.2024-05-30 | BIGO 百页小册《Apache Pulsar 调优指南》

“ 各位热爱 Pulsar 的小伙伴们&#xff0c;Pulsar 社区周报更新啦&#xff01;这里将记录 Pulsar 社区每周的重要更新&#xff0c;每周发布。 ” BIGO 百页小册《Apache Pulsar 调优指南》 Hi&#xff0c;Apache Pulsar 社区的小伙伴们&#xff0c;社区 2024 上半年度的有奖问…

VB.net实战(VSTO):Excel插件设计Ribbon界面

1. 新建Ribbon 1.1 开发环境 Visual Studio 2022 1.2 解决方案资源管理器中右击My Project 1.3 添加》新建项 1.4 office/SharePoint》功能区(可视化设计器)&#xff0c;双击 2.调出工具箱 Visual Studio 2022》视图》工具箱 3.设计界面 3.1 添加功能区选项卡 3.2拖动Group…

OZON的选品工具,OZON选品工具推荐

在电商领域&#xff0c;选品一直是决定卖家成功与否的关键因素之一。随着OZON平台的崛起&#xff0c;越来越多的卖家开始关注并寻求有效的选品工具&#xff0c;以帮助他们在这个竞争激烈的市场中脱颖而出。本文将详细介绍OZON的选品工具&#xff0c;并推荐几款实用的辅助工具&a…

【嵌入式DIY实例】-OLED显示网络时钟和天气数据

OLED显示网络时钟和天气数据 文章目录 OLED显示网络时钟和天气数据1、硬件准备与接线2、代码实现在前面的的文章中,我们制作了一个互联网气象站,其中天气数据(温度、湿度、压力、风速和风度)被串行发送到笔记本电脑并显示在SSD1306 OLED屏幕(12864像素)上。 在该项目中,…

麦肯锡:ChatGPT等生成式AI应用激增,大中华区增长最快

全球顶级咨询公司麦肯锡&#xff08;McKinsey & Company&#xff09;在官网发布了《he state of AI in early 2024:Gen AI adoption spikes and starts to generate value》&#xff0c;一份关于生成式AI应用的调查报告。 麦肯锡对多个国家/地区的1,363位管理者进行了调查…

6个PPT素材模板网站,免费!

免费PPT素材模板下载&#xff0c;就上这6个网站&#xff0c;建议收藏&#xff01; 1、菜鸟图库 ppt模板免费下载|ppt背景图片 - 菜鸟图库 菜鸟图库是一个设计、办公、媒体等素材非常齐全的网站&#xff0c;站内有几百万的素材&#xff0c;其中PPT模板就有几十万个&#xff0c;…