精华内容
下载资源
问答
  • linked-list-ts:打字稿链表实现
  • ts流中patpmt解析

    2017-09-07 18:13:22
    文件中具体阐述了关于ts流中PAT和PMT的结构,采用采购提的形式将ts包头和PMT结构和PAT结构清晰显示出来,代码具体显示了如何去解析header和PAT
  • TS格式详解

    千次阅读 2020-03-20 19:39:24
    关于ts的封包,ts的封装格式要比flv更复杂,主要的数据单元是ts包,每个包有pid,一个包固定大小普通没有crc的为188,主要分为三类ts包,pat,pmt,pes,pat就是第一个包,当解析的时候会在ts包列表里找pid为0x0的...

    目录

    一、基本概念

    二、TS结构

    三、各小结构解析

    3.1 TS文件

    四、pes层结构

    五、es层结构

    5.1 h.264视频的es层

    5.2 aac音频的es层

    六、 TS封包


    之前都是别人总结的,现在感觉看了那么多之后也有了自己的认识,还是Mark一下吧,方便以后回顾。

    一、基本概念

        关于ts的封包,ts的封装格式要比flv更复杂,主要的数据单元是ts包,每个包有pid,一个包固定大小普通没有crc的为188,主要分为三类ts包,pat,pmt,pes,pat就是第一个包,当解析的时候会在ts包列表里找pid为0x0的包,就是pat包,pat大概作用就是入口的意思,pat里面有pmt包的pid,pmt里面存储的是流的包的pid,比如指定音频包pid是0x102,视频包pid是0x101,后面的0x102和0x101的包就是pes包了,将pes包解析并合并出原始流,就能解码播放了。

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

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

    TS(Transport Stream)流,也叫传输流。是在pes层上加入了数据流识别和传输的必要信息。是由固定长度的188字节的包组成。含有独立是一个或者多个program,一个program又可以包含多个视频,音频和文字信息的ES流。每个ES流会有不同的PID标示。为了分析这些ES流,TS有些固定的PID来间隔发送Program和ES信息表格:PAT表和PMT表。

     

    二、TS结构

    • 一、开始还是看一下TS的格式吧,在TS文件里结构如下图:

    上面是一张ts的结构图:都是一个个transport packet组成,每个都是188byte。可以是AAC、H264、 PAT、PMT等;

    每个TS都有PID和payload,188-payload就是TS header的大小,counter表示这个帧里transport packet的个数;

    三、各小结构解析

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

    3.1 TS文件

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

    TS流:                      
      +-+-+-+-+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  TS   |  =  |  Packet 1 |  Packet 2 |  Packet 3 |    ...    | Packet n-1|  Packet n |
      +-+-+-+-+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      
    一个Packet:             4bytes             184bytes         
      +-+-+-+-+-+    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Packet | =  | Packet header |       Packet data       |
      +-+-+-+-+-+    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

     实际上一个transport packet(Packet)里面并不是一直都是上面那样的,可能会有adaption filed 存放其他信息,

    自适应区(adaption filed )的长度要包含传输错误指示符标识的一个字节。pcr是节目时钟参考,pcr、dts、pts都是对同一个系统时钟的采样值,pcr是递增的,因此可以将其设置为dts值,音频数据不需要pcr。如果没有字段,ipad是可以播放的,但vlc无法播放。打包ts流时PAT和PMT表是没有adaptation field的,不够的长度直接补0xff即可。视频流和音频流都需要加adaptation field,通常加在一个帧的第一个ts包和最后一个ts包里,中间的ts包不加

    如下:

           4 byte         x byte                    184-x byte
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      | ts header |  adaptation field |          payload(pes)       |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    3.3.1 ts header 结构

    sync_byte8b同步字节,固定为0x47
    transport_error_indicator1b传输错误指示符,表明在ts头的adapt域后由一个无用字节,通常都为0,这个字节算在adapt域长度内
    payload_unit_start_indicator1b负载单元起始标示符,一个完整的数据包开始时标记为1
    transport_priority1b传输优先级,0为低优先级,1为高优先级,通常取0
    pid13bpid值
    transport_scrambling_control2b传输加扰控制,00表示未加密
    adaptation_field_control2b是否包含自适应区,‘00’保留;‘01’为无自适应域,仅含有效负载;‘10’为仅含自适应域,无有效负载;‘11’为同时带有自适应域和有效负载。
    continuity_counter4b递增计数器,从0-f,起始值不一定取0,但必须是连续的

    一个重要的PID值

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

    PID取值 

    PID值使用描述

    0x0000

    节目关联表(program association table, PAT)

    0x0001

    条件访问表(conditional access table, CAT)

    0x0002

    传送流描述表(transport stream description table, TSDT)

    0x0003~0x000F

    保留

    0x0010~0x1FFE

    可以分配为network PID, Program map PID,  elementary PID, 或其它

    0x1FFF

    空包(8191)

    好、来分析下面第一个行的4个字节的ts header; 

    
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                47  |     41    |       01   |     10
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
              0X47  | 0100 0001 | 0000 0000  |    0001 0000
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                    

     

    3.3.2 adaptation field结构

    adaptation_field_length1B自适应域长度,后面的字节数
    flag1B取0x50表示包含PCR或0x40表示不包含PCR
    PCR5BProgram Clock Reference,节目时钟参考,用于恢复出与编码端一致的系统时序时钟STC(System Time Clock)。
    stuffing_bytesxB填充字节,取值0xff

    自适应区的长度要包含传输错误指示符标识的一个字节。pcr是节目时钟参考,pcr、dts、pts都是对同一个系统时钟的采样值,pcr是递增的,因此可以将其设置为dts值,音频数据不需要pcr。如果没有字段,ipad是可以播放的,但vlc无法播放。打包ts流时PAT和PMT表是没有adaptation field的,不够的长度直接补0xff即可。视频流和音频流都需要加adaptation field,通常加在一个帧的第一个ts包和最后一个ts包里,中间的ts包不加。

    PAT/PMT类型包(Packet)
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      | ts header |    PAT/PMT    |   Stuffing Bytss  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    
    视频/音频类型包(Packet),一帧视频/音频数据被拆分成N个Packet
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      | ts header |   adaptation field    |      payload(pes 1)     |-->第1个Packet
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      | ts header |              payload(pes 2)                     |-->第2个Packet
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      | ts header |                   ...                           |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      | ts header |             payload(pes n-1)                    |-->第n-1个Packet
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      | ts header |   adaptation field    |      payload(pes n)     |-->第n个Packet
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    PAT和PMT

    PAT(Program Associate Table)格式 节目关联表

    table_id8bPAT表固定为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校验码

    PMT格式

    table_id8bPMT表取值随意,0x02
    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校验码

     

    四、pes层结构

    pes层(ts层中payload)是在每一个视频/音频帧上加入了时间戳等信息,pes包内容很多,我们只留下最常用的。

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

    pes header格式: 

    pes start code3B开始码,固定为0x000001
    stream id1B音频取值(0xc0-0xdf),通常为0xc0
    视频取值(0xe0-0xef),通常为0xe0
    pes packet length2B后面pes数据的长度,0表示长度不限制,
    只有视频数据长度会超过0xffff
    flag1B通常取值0x80,表示数据不加密、无优先级、备份的数据
    flag1B取值0x80表示只含有pts,取值0xc0表示含有pts和dts
    pes data length1B后面数据的长度,取值5或10
    pts5B33bit值
    dts5B33bit值

    pts是显示时间戳、dts是解码时间戳,视频数据两种时间戳都需要,音频数据的pts和dts相同,所以只需要pts。有pts和dts两种时间戳是B帧引起的,I帧和P帧的pts等于dts。如果一个视频没有B帧,则pts永远和dts相同。从文件中顺序读取视频帧,取出的帧顺序和dts顺序相同。dts算法比较简单,初始值 + 增量即可,pts计算比较复杂,需要在dts的基础上加偏移量。
          音频的pes中只有pts(同dts),视频的I、P帧两种时间戳都要有,视频B帧只要pts(同dts)。打包pts和dts就需要知道视频帧类型,但是通过容器格式我们是无法判断帧类型的,必须解析h.264内容才可以获取帧类型。

     
    举例说明:
        ------------------------------>
        I     P     B     B     B     P
        1     2     3     4     5     6   读取顺序
        1     2     3     4     5     6   dts顺序
        1     5     3     2     4     6   pts顺序
        
    点播视频dts算法:
    dts = 初始值 + 90000 / video_frame_rate,初始值可以随便指定,但是最好不要取0,video_frame_rate就是帧率,比如23、30。
    pts和dts是以timescale为单位的,1s = 90000 time scale , 一帧就应该是90000/video_frame_rate 个timescale。
    用一帧的timescale除以采样频率就可以转换为一帧的播放时长
    
    点播音频dts算法:
    dts = 初始值 + (90000 * audio_samples_per_frame) / audio_sample_rate,audio_samples_per_frame这个值与编解码相关,aac取值1024,mp3取值1158,audio_sample_rate是采样率,比如24000、41000。AAC一帧解码出来是每声道1024个sample,也就是说一帧的时长为1024/sample_rate秒。所以每一帧时间戳依次0,1024/sample_rate,...,1024*n/sample_rate秒。
    
    直播视频的dts和pts应该直接用直播数据流中的时间,不应该按公式计算。

    五、es层结构

    es层(pes payload)指的就是音视频数据。

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

    5.1 h.264视频的es层

    打包h.264数据我们必须给视频数据加上一个nalu(Network Abstraction Layer unit),nalu包括start code和nalu header,start code固定为0x00000001(帧开始)或0x000001(帧中)。h.264的数据是由slice组成的,slice的内容包括:视频、sps、pps等。nalu type决定了后面的h.264数据内容。

    nalu header:
       0 1 2 3 4 5 6 7
      +-+-+-+-+-+-+-+-+
      |F|NRI|   Type  |          
      +-+-+-+-+-+-+-+-+
     
      F:   占1bit,forbidden_zero_bit,h.264规定必须取0,禁止位,当网络发现NAL单元有比特错误时可设置该比特为1,以便接收方纠错或丢掉该单元。
      NRI: 占2bit,nal_ref_idc,取值0~3,指示这个nalu的重要性,I帧、sps、pps通常取3,P帧通常取2,B帧通常取0,nal重要性指示,标志该NAL单元的重要性,值越大,越重要,解码器在解码处理不过来的时候,可以丢掉重要性为0的NALU。
      Type:占5bit, nal_unit_type:0=未使用 1=非IDR图像片,IDR指关键帧
                                 2=片分区A 3=片分区B
                                 4=片分区C 5=IDR图像片,即关键帧
                                 6=补充增强信息单元(SEI) 7=SPS序列参数集
                                 8=PPS图像参数集 9=分解符
                                 10=序列结束 11=码流结束
                                 12=填充
                                 13~23=保留 24~31=未使用
                 
      打包es层数据时pes头和es数据之间要加入一个type=9的nalu,关键帧slice前必须要加入type=7和type=8的nalu,而且是紧邻                             
      
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      | pes header| nalu(0x09)| 1byte |  nalu |     | nalu(0x67)|     | nalu(0x68)|     | nalu(0x65)|     |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                                 随意     其他   内容       SPS     内容     PPS       内容      I帧      内容
                                 
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      | pes header| nalu(0x09)| 1byte |  nalu |     | nalu(0x41)|     |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                                 随意     其他   内容       P帧     内容
    F1bforbidden_zero_bit,h.264规定必须取0
    NRI2bnal_ref_idc,取值0~3,指示这个nalu的重要性,I帧、sps、pps通常取3,P帧通常取2,B帧通常取0
    Type5b参考下表
    nal_unit_type说明
    0未使用
    1非IDR图像片,IDR指关键帧
    2片分区A
    3片分区B
    4片分区C
    5IDR图像片,即关键帧
    6补充增强信息单元(SEI)
    7SPS序列参数集
    8PPS图像参数集
    9分解符
    10序列结束
    11码流结束
    12填充
    13~23保留
    24~31未使用

    5.2 aac音频的es层

    打包aac音频必须加上一个adts(Audio Data Transport Stream)头,共7Byte,adts包括fixed_header和variable_header两部分,各28bit。

    syncword12b固定为0xfff
    id1b0表示MPEG-4,1表示MPEG-2
    layer2b固定为00
    protection_absent1b固定为1
    profile2b取值0~3,1表示aac
    sampling_frequency_index4b表示采样率,0: 96000 Hz,1: 88200 Hz,2: 64000 Hz,3:48000 Hz,4: 44100 Hz,5: 32000 Hz,6: 24000 Hz,7: 22050 Hz,8: 16000 Hz,9: 12000 Hz,10: 11025 Hz,11: 8000 Hz,12: 7350 Hz
    private_bit1b固定为0
    channel_configuration3b取值0~7,1: 1 channel: front-center,2: 2 channels: front-left, front-right,3: 3 channels: front-center, front-left, front-right,4: 4 channels: front-center, front-left, front-right, back-center
    original_copy1b固定为0
    home1b固定为0

    variable_header

    copyright_identification_bit1b固定为0
    copyright_identification_start1b固定为0
    aac_frame_length13b包括adts头在内的音频数据总长度
    adts_buffer_fullness11b固定为0x7ff
    number_of_raw_data_blocks_in_frame2b固定为00

    六、 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包>
      
      
      
    
    

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

     

    第一个TS包

    参考

    https://www.jianshu.com/p/d6311f03b81f

    https://my.oschina.net/u/727148/blog/666824

    https://blog.csdn.net/leek5533/article/details/104823279

    展开全文
  • 数字电视的常用总结(PSI_SI_EPG_TS) 广电行业的朋友可以参考下,很有用的资料
  • 通用串口(三路隔离) / PROFINET网关TS-180可实现PROFINET网络与串口网络之间的数据通信,可连接多个具RS232/RS485/RS422接口的设备到PROFINET网络,即将串口设备转换为PROFINET设备。本文档是TS-180相关使用案例。
  • TS中的一些符号

    千次阅读 2020-11-27 01:06:00
    一、! 非空断言操作符 在上下文中当类型检查器无法断定类型时,一个新的后缀表达式操作符 ! 可以用于断言操作对象是非 null 和非 undefined 类型。具体而言,x! 将从 x 值域中排除 null 和 undefined 。...

    一、! 非空断言操作符

    在上下文中当类型检查器无法断定类型时,一个新的后缀表达式操作符 ! 可以用于断言操作对象是非 null 和非 undefined 类型。具体而言,x! 将从 x 值域中排除 null 和 undefined
    那么非空断言操作符到底有什么用呢?下面我们先来看一下非空断言操作符的一些使用场景。

    • 忽略 undefined 和 null 类型
    // 监听div大小控制元素显示与隐藏
    const [divSize, setDivSize] = useState<number | undefined>(window.innerWidth);
    const handleChange = ()=> {
    	setDivSize(document.getElementById('targetDiv')?.offsetWidth)
    }
    useEffect(()=>{
    	// 监听
    	window.addEventListener("resize", handleChange);
    	// 销毁
        return () => window.removeEventListener("resize", handleChange);
    }, [])
    
    
    <div style={{width: '100%'}} id="targetDiv">
    	// 如果不加!,会报错,对象可能为“未定义”。
    	{divSize! > 1000 ? && <span>哈哈哈</span>} 
    </div>
    
    • 调用函数时忽略 undefined 类型
    type HandleChange= () => void;
    
    function myFunc(onChange: HandleChange | undefined) {
    	//如果不加!,会报错
    	const a = onChange(); // Error
      	const b = onChange!(); //OK
    }
    
    • 确定赋值断言

    在 TypeScript 2.7 版本中引入了确定赋值断言,即允许在实例属性和变量声明后面放置一个 ! 号,从而告诉 TypeScript 该属性会被明确地赋值。

    let x: number;
    initialize();
    // 在赋值前使用了变量“x”。
    console.log(2 * x); // Error
    
    function initialize() {
      x = 10;
    }
    

    很明显该异常信息是说变量 x 在赋值前被使用了,要解决该问题,可以使用确定赋值断言:

    let x!: number;
    initialize();
    console.log(2 * x); // Ok
    
    function initialize() {
      x = 10;
    }
    

    二、?. 运算符

    TypeScript 3.7 实现可选链,如果遇到 null 或 undefined 就可以立即停止某些表达式的运行。
    ?. 与 && 运算符行为略有不同,&& 专门用于检测 false 值,比如空字符串、0、NaN、null 和 false 等。而 ?. 只会验证对象是否为 null 或 undefined,对于 0 或空字符串来说,并不会出现 “短路”。

    • 在使用可选调用的时候,我们要注意以下两个注意事项

    1.如果存在一个属性名且该属性名对应的值不是函数类型,使用 ?. 仍然会产生一个 TypeError 异常。

    2.可选链的运算行为被局限在属性的访问、调用以及元素的访问 —— 它不会沿伸到后续的表达式中,也就是说可选调用不会阻止 a?.b / someMethod() 表达式中的除法运算或 someMethod 的方法调用。

    三、?? 空值合并运算符

    TypeScript 3.7 引入空值合并运算符 ??,当左侧操作数为 null 或 undefined 时,其返回右侧的操作数,否则返回左侧的操作数。

    与逻辑或 || 运算符不同,逻辑或会在左操作数为 false 值时返回右侧操作数。

    console.log(false || '哈哈哈')  // 哈哈哈
    console.log(false ?? '哈哈哈')  // false
    
    • 不能与 && 或 || 操作符共用

    如果??和&&或||共用了会抛出 SyntaxError。

    // 但当使用括号来显式表明优先级时是可行的,
    (null || undefined ) ?? "foo"; // 返回 "foo"
    

    四、?: 可选属性

    比如定义了一个子组件的属性为value和onChange,在主组件使用的时候只用了value属性,就会报错,这个时候就可以使用?:,比如

    type Person = {
    	name: string
    	age?: number
    }
    

    将属性变成可选的,就不会报错啦

    五、& 运算符

    在 TypeScript 中交叉类型是将多个类型合并为一个类型。通过 & 运算符可以将现有的多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性。

    type Animal = { age: number; };
    type Dog= Animal & { name: string; };
    
    let tony: Dog = {
      age: 2,
      name: '旺财'
    }
    
    • 同名基础类型属性的合并

    那么现在问题来了,假设在合并多个类型的过程中,刚好出现某些类型存在相同的成员,但对应的类型又不一致,比如:

    interface X {
      c: string;
      d: string;
    }
    
    interface Y {
      c: number;
      e: string
    }
    
    type XY = X & Y;
    type YX = Y & X;
    
    let p: XY;
    let q: YX;
    
    p = {c: 6, d: '111', e: '222'} // Error
    

    在上面的代码中,接口 X 和接口 Y 都含有一个相同的成员 c,但它们的类型不一致。对于这种情况,此时 XY 类型或 YX 类型中成员 c 的类型是不是可以是 string 或 number 类型呢?并不是!既是string又是number的类型是不存在的,所以c的类型是never。

    六、| 分隔符

    在 TypeScript 中联合类型(Union Types)表示取值可以为多种类型中的一种,联合类型使用 | 分隔每个类型。联合类型通常与 null 或 undefined 一起使用

    • 类型保护

    当使用联合类型时,我们必须尽量把当前值的类型收窄为当前值的实际类型,而类型保护就是实现类型收窄的一种手段。类型保护是可执行运行时检查的一种表达式,用于确保该类型在一定的范围内。

    七、_ 数字分隔符

    TypeScript 2.7 带来了对数字分隔符的支持,正如数值分隔符 ECMAScript 提案中所概述的那样。对于一个数字字面量,你现在可以通过把一个下划线作为它们之间的分隔符来分组数字:

    const inhabitantsOfMunich = 1_464_301;
    const distanceEarthSunInKm = 149_600_000;
    const fileSystemPermission = 0b111_111_000;
    const bytes = 0b1111_10101011_11110000_00001101;
    

    分隔符不会改变数值字面量的值,但逻辑分组使人们更容易一眼就能读懂数字

    • 使用限制

    虽然数字分隔符看起来很简单,但在使用时还是有一些限制。比如你只能在两个数字之间添加 _ 分隔符,也不能连续使用多个 _ 分隔符。

    • 解析分隔符

    解析数字的函数是不支持分隔符:

    Number('123_456') // NaN
    parseInt('123_456') // 123
    parseFloat('123_456') // 123
    
    // 可以借用正则表达式来解析
    let str = '123_456'
    console.log(str.replace(/[^0-9]/gu,'')) //123456
    

    八、TypeScript 断言

    类型断言好比其他语言里的类型转换,但是不进行特殊的数据检查和解构。它没有运行时的影响,只是在编译阶段起作用。
    类型断言有两种形式:

    • “尖括号” 语法
    let someValue: any = "this is a string";
    let strLength: number = (<string>someValue).length;
    
    • as 语法
    let someValue: any = "this is a string";
    let strLength: number = (someValue as string).length;
    

    九、#XXX 私有字段

    在 TypeScript 3.8 版本就开始支持 ECMAScript 私有字段

    1.私有字段以 # 字符开头,有时我们称之为私有名称;
    2.每个私有字段名称都唯一地限定于其包含的类;
    3.不能在私有字段上使用 TypeScript 可访问性修饰符(如 public 或 private);
    4.私有字段不能在包含的类之外访问,甚至不能被检测到。

    class Person {
    	#name: string
        constructor(name: string){
    		this.#name = name
    	}
      a(){
        console.log(this.#name)
      }
    }
    
    let person = new Person('名字');
    console.log(person.#name); // Property '#name' is not accessible outside class 'Person' because it has a private identifier.
    console.log(person.a()); //名字
    

    参考文献:https://juejin.cn/post/6875091047752400910

    展开全文
  • 关于mpeg2中ts流PAT与PMT详解
  • JS/TS 清空数组的几种方法比较

    千次阅读 2021-03-09 20:10:47
    方式1:splice函数 arrayObject.splice(index,howmany,element1,…,elementX) index:必选,规定从何处添加/删除元素。 howmany:必选,规定应该删除多少元素。未规定此参数,则删除从 index 开始到原数组结尾的所有...

    方式1:splice函数

    arrayObject.splice(index,howmany,element1,…,elementX)

    index:必选,规定从何处添加/删除元素。

    howmany:必选,规定应该删除多少元素。未规定此参数,则删除从 index 开始到原数组结尾的所有元素。

    element1:可选,规定要添加到数组的新元素。

    var arr = [1,2,3,4];  
    arr.splice(0,arr.length);  
    

    方式2:给数组的length赋值为0

    赋予数组的长度小于本身的长度,数组中后面的元素将被截断。

    赋予数组的长度大于本身的长度,将扩展数组长度,多的元素为undefined。

    var arr = [1,2,3,4];  
    arr.length = 0;
    

    方式3:直接赋予新数组 []

    这种方式为将arr重新复制为空数组,之前的数组如果没有被引用,将等待垃圾回收。

    var arr = [1,2,3,4];  
    arr = [];
    

    效率比较:
    效率测试代码如下

        var a = [];
        var b = [];
        var c = [];
        for(var i =0 ; i < 100000000;i++){
            a.push(i);
        }
        console.time('splice');
        a.splice(0,a.length); 
        console.timeEnd('splice');
        
        for(var i =0 ; i < 100000000;i++){
            b.push(i);
        }
        console.time('length');
        b.length = 0;
        console.timeEnd('length');
        
        for(var i =0 ; i < 100000000;i++){
            c.push(i);
        }
        console.time('赋值[]');
        c = [];
        console.timeEnd('赋值[]');
    

    复制代码
    测试结果:

    splice: 0.010986328125ms
    length: 0.009033203125ms
    赋值[]: 0.024169921875ms

    总结:

    多次测试发现第二种方式最快,第一种其次,大数据量下 第三种最慢。

    测试结果可能不严谨。大家仅做参考。

    如果我的文章帮助到了你,或者给你提供了类似的思路, 烦请给我点个赞,谢谢~~~

    展开全文
  • TS16949体系审核检查IATF
  • TS各个 与 SECTION 的解析 CAS原理
  • TS流编辑工具.rar

    2020-04-13 10:38:17
    TS文件编辑工具,更改SI/PSI,修改NIT/SDT/BAT/PAT/PMT等各种,保存修改的码流,并且还能和码流播放卡一起使用。方便快捷
  • TS携带 PSISI等的数据时,各个以各对应的Section语法格式做为传输单元存放到TS包中 以便传输;TS包,有一个TS包的PID,系统就是根据这个PID来找对应的TS包;对于包含音视频数据(PES包)的TS包,系统通过TS的...
    TS流,通过一个个的TS包来传送;TS包可以是传送PSI SI等各表的数据包,也可以是传送节目音视频数据(携带的PES包:音视频基本流包)的包;TS携带 PSISI等表的数据时,各个表以各表对应的Section语法格式做为传输单元存放到TS包中 以便传输;
    TS包,有一个TS包的PID,系统就是根据这个PID来找对应的TS包;对于包含音视频数据(PES包)的TS包,系统通过TS的PID找到对应TS数据包,提取其中的数据组合成节目的音视频;对于携带PSISI等数据的TS包,系统通过TS的PID找到对应TS数据包,提取各个PSI SI数据表格,用来指导系统;
       因此其中部分PID用来固定传输某些数据内容;如下
    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理
        有了TS的PID后, 如果TS包携带的是PSISI等表格的Section数据时,有时还不能确定该PID的TS包中携带的数据是什么,SDT BAT ST等表传送时,都用的是PID为0X0011的TS数据包,对于这种携带PSI SISection单元的TS包,对应的数据(表的Section语法中)还有一个TABLE_ID字段,用来可以确定是具体的什么表,如下图
    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理
    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理
    每不同的表中,我们看表的SECTION语法,都会看到descriptor()字样,descriptor()表示的也是一个语法结构,他具体对应的语法结构,由他内部的descriptortag字段决定,各个表的具体的定义,可以参见13818对应的定义,其中这里面还可以有用户的自定义描述符,可见下表:
    the descriptors declared or defined within the present document,giving the descriptors-tag values andthe intendedplacement within the SI tables. This does not imply that their usein other tables is restricted. PSI SI表中包含什么descriptor,就用对应的语法去解!当然用户自定义的由用户自定义去解!!!
    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理
    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理
    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理
    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理
    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理

      



    PSI(ProgramSpecific Information)
    PAT (Program AssociationTable) 节目关联表
    PMT(Program MapTable) 节目映射表
    CAT(Conditional AccessTable) 条件接收表
    SI(ServiceInformation) 
    NIT(Network InformationTable) 网络信息表
    SDT(Service Discription Table) 业务描述信息表
    BAT(Bouquet AssociationTable) 业务群信息表
    EIT(Event InformationTable) 节目事件信息表
    TDT(Time and Data Table) 日期时间表
    事件  event
        一组给定了起始时间和结束时间、属于同一业务的基本广播数据流。例如:一场足球比赛的半场、新闻快报或娱乐表演的第一部分
    节目  programme
    由广播者提供的一个或多个连续的事件。例如:新闻广播,娱乐广播。
    网络  network
    一个传输系统,可以传输一组 MPEG-2 传输流( TS )。例如:某个有线电视系统中的所有数字频道
    业务  service
    在广播者的控制下,可以按照时间表分步广播的一系列节目 , 我们也称之个频道,口语中也称之为节目  
    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理
    节目关联表PAT
    PAT 定义了一个 TS 流中所有的节目, PAT PID 0x0000 ,他是 PSI 信息的根节点。要查找节目播放信息必须从 PAT 开始。
    PAT 中包含了 TS 中所有节目的完整列表,每个表项包括 ServiceID PMT( 用于播放 ) PID
    PAT中ServiceID 为0的表项表示NIT。
    节目映射表PMT
     PMT 提供了一个节目的 ServiceID 和用于播放的所有资源信息,例如音视频 PID PCR ,字幕 PID 等。
     简单的说, PMT 完整的描述了一路节目是由哪些 PES 组成,给播放提供相应的资源。
    •   PAT PMT 关系
    条件访问表CAT
    CAT 提供了在一个或多个 CA 系统及其授权管理信息,用于节目的解扰工作。
    如果在一个 TS 中任何原始流进行了加密处理,那么在 TS 中一定要插入 CAT
    CAT 中,最重要的字段就是 CA_descriptor () 段。下面将简单讲述一下该描述段
    CA_descriptor 用来表示含有 ECM 或者是 EMM 信息的 TS PID ,即 CA_PID
    CA_descriptor 出现在 PMT 中时, CA_PID 指向含有与访问控制信息( ECM )相关的节目包。
    CA_descriptor 出现在 CAT 中时, CA_PID 指向含有与授权管理信息( EMM )相关的节目包。
    CA_descriptor 中几个重要的字段如下:
    CA_system_ID :该字段表示适用于相关 ECM / EMM 流的 CA 系统类型。其值是用户定义的。
    CA_PID :该字段表示传送流包的 PID ,此包中含有由相应的 CA_system_ID 指明的 CA 系统的 ECM EMM 信息,由 CA_PID 指明的包的内容( ECM EMM )所在的上下文决定,既由 TS 中的 PMT CAT 或节目流中的 stream_id 字段决定。
    NIT
    NIT 描述了一个 DVB 传输通道的所有物理参数,包括下列信息:
    传输路径(卫星、电缆、地面)
    接收频率
    调制类型
    误码保护
    传输参数
    机顶盒在扫描或变换信道时,可以存储一个物理信道的所有参数,便于以后很快跳回该信道。
    信道中也可以传送相邻或其他信道的传输参数,使得信道转换灵活快捷。
    如果 NIT 中的传输参数与实际不符,会对许多接收设备,如机顶盒,产生不可预知的影响。
    如果 NIT 中的传输频率与实际接收频率不同,许多接收设备在没有任何原因提示的情况下,不产生任何图像和声音。
    SDT
    SDT 包含对 TS 流中节目(服务)的更多详细描述:
    节目名称,如 CNN,CBS,Eurosport,ARD,ZDF,BBC,ACB,SBS 等等
    在提供节目 PID 的同时, SDT 对用户提供了文本信息。
    通过提供文本列表,使得接收设备操作灵活。
    BAT ,与 SDT 密切相关:
    BAT SDT PID 相同,只是 tableID 不同。
    SDT 描述一个物理信道的节目结构。
    BAT 描述几个或大量物理信道的节目结构。
    BAT
    BAT 表是由 DVB 定义的,是一个 SI 表,因此它是一个全局表,一个数字电视系统只对应一个 BAT 表,其 table_id =0X4A
    一个节目类别对应一个段。为了让受众能更方便地在众多的节目中寻找出自己喜欢的节目,往往需要提供一种把众多的节目频道进行分类的方法(一个类相当一个节目组)。
    例如把电影频道归为“家庭影院”的类别,把电视连续剧归为“电视剧场”的类别等等, BAT 表就提供了这一功能,每一个类别都用一个 bouquet_id 来标识。它包括了节目业务名称(类别)及节目组所包含的节目清单(节目列表)。 BAT 表在 SI 信息中属于可选表  
    EIT
    EIT(eventinformation table)
    DVB 中的 EPG(electronicprogram guide)
    包含一天或一周内所有广播的计划开始和结束时间。
    结构非常灵活,允许传送大量附加信息
    不是所有机顶盒都支持这一特性
    事件信息表 EIT 按时间顺序提供每一个业务所包含的事件的信息。按照不同 table_id 有四类 EIT
    1 ) 现行传输流,当前 / 后续事件信息 = table_id ="0x4E"
    2 ) 其它传输流,当前 / 后续事件信息 = table_id ="0x4F"
    3 ) 现行传输流,事件时间表信息 = table_id ="0x50" "0x5F"
    4 ) 其它传输流,事件时间表信息 = table_id ="0x60" "0x6F"
    现行传输流的所有 EIT 子表都有相同的 transport_stream_id original_network_id
    TDT/TOT
    机顶盒操作还需要传输当前时钟和当前日期,分两步:
    TDT( time&date table)
    传送 GMT UTC
    即零度子午线的当前时刻
    TOT(timeoffset table)
    传送不同时区各自适当的时间偏移量
    TDT TOT 中的信息如何计算以及计算到什么程度,取决于机顶盒的软件
    对广播时间信息的完全支持还需要机顶盒得到当前的位置信息:
    对拥有多个时区的国家,如澳大利亚和美国,这个问题尤其重要。
    其它表
    运行状态表 (RST)
    运行状态表给出了事件的状态(运行 / 非运行)。运行状态表更新这些信息,允许自动适时切换事件。
    填充表 (ST)
    填充表用于使现有的段无效,例如在一个传输系统的边界。
    选择信息表 (SIT)
    选择信息表仅用于码流片段(例如,记录的一段码流)中,它包含了描述该码流片段的业务信息的概要数据。
    间断信息表 (DIT)
    间断信息表仅用于码流片段(例如,记录的一段码流)中,它将插入到码流片段业务信息间断的地方。

    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理

    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理

    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理
    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理
    ================================
    TS流的形成:前段音视频数据经过音视频编码器后音视频数据流ES,ES经过分组器(打包器)形成一个个的分组,即PES(音视频数据流ES的分组包,PacketES,PES最长一般为188个字节);音视频PES再经过复合器,从而形成传输流TS,传输流以传输流分组(TS Packet);TSPacket中的有效数据既可以是PES(音视频ES分组包),也可以是PSI等信息数据,这个由TSPacket中的PID来指定负荷数据的类型;SI各表格是以SECTION为单位放到TSPacket中,因此不同的表格就要按标准遵循对应SECTION的语法;比如PMT表,PMT可能包含多个节目的描述,因此它可能会被划分为多个SECTION放到TSPacket中,遵循的语法就是TS_program_map_section() ;
    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理


    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理

    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理

    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理

    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理
    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理

    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理

    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理

    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理

    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理
    【通过码流分析工具的查看,800来个 PID为0X191的401节目的PMT SECTION TS包都是一样的】
    根据TS Packet 的语法,可以简要分析下上面的数据包:
    同步字节段:0X47(8bit)
    传输错误指示字符段:0(1bit)
    有效负载数据单元起始指示符字段:1(1bit)
    传输优先级字段:0(1bit)
    PID:0x191(13bit)(PAT表中指定该PID的TS包为包含PMT SECTION数据的TS包)
    传输加扰控制字段:(0x0)(2bit)
    调整字段控制字段:0x01(无调整字段,只有有效负载)(2bit)
    连续性计数器字段:(4bit)
    数据字节字段:这些数据 有可能是PES包,有可能是PSISECTION (由PID决定),如果没有调整字段,从这开始就是负载数据了;
      若是PES数据,则这些负载数据通过PES分组语法来解析;
      若是PSISECTION数据,则通过SECTION语法来解释,可通过第一个table_id来确定是哪一个表的SECTION;如下表:【要知道PMT表须先知道PAT表】
    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理

    Programassociation Table
    The Program Association Table provides the correspondencebetween a program_number and the PID valueof the Transport Stream packets which carry the programdefinition. The program_number is the numeric label associated witha program. 
    The overall table is contained in oneor more sections with the following syntax. It may be segmented to occupy multiplesections 
    Programassociation section[PAT section syntax]
    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理

    table_id :
    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理

    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理
    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理

    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理
    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理

    CAS原理:
      条件接收(CA)系统(CAS)是数字电视广播(DVB)实行收费所必须采用的系统,也是数字电视平台不可缺少的部分,CAS负责完成用户授权控制与管理信息的获取、生成、加密、发送以及节目调度控制等工作,保证只有已被授权的用户才能收看节目,从而保护节目制作商和广播运营商的利益。
      在DVB前端,CAS将通过加扰器节目级复用器复用后的节目内容,即MPEG-2/DVB视频、音频和辅助数据传输流(TS), 与一个加扰伪随机序列做XOR运算,这个 伪随机加扰序列就是控制字发生器提供的 控制字CW
       CW被业务密钥( SK加密处理后授权控制信息(ECM)数据流中传送SK被用户个人分配密钥( PDK加密处理后,在 授权管理信息EMM数据流中传送, PDK存放在用户智能卡(Smard Card)中
       已加扰的MPEG-2/DVB视频、音频和辅助数据传输流(TS)、ECM、EMM数据流、节目说明信息(PSI)和业务信息(SI)等数据流,经复用后,从发送端经传输信道传送给接收端机顶盒(STB)。
       对于已经缴费的用户,其智能卡会被授权,STB从接收到的已加扰传输流中, 解复用出ECM和EMM数据流后送给智能卡, 智能卡首先读取PDK,用 PDK对EMM解密得到SK,再用 SK对ECM解密得到CW,利用 CW由解扰器对已加扰传输流(TS)进行解扰后,再进行节目级解复用
        TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理

    TS各个表 <wbr>与 <wbr>SECTION <wbr>的解析 <wbr>CAS原理
    展开全文
  • ts 图对于确定物理海洋学中的水质量属性非常有用。 该程序有助于在背景中绘制具有密度轮廓的 TS 图。 它使用了可从 csiro 的海水工具箱中获得的外部代码 sw_dens()
  • 触发器(Trigger)是用户定义在关系上的一类由事件驱动的特殊过程。 触发器保存在数据库服务器中 任何用户对表的增、删、改操作均由服务器自动激活相应的触发器 触发器可以实施更为复杂的检查和操作,具有更精细...
  • 默认是接收网络udp组播窜流,然后解析TS,播放音视频。也可以做些小改动,改为读取本地TS文件。里面核心的代码是解析TS流,使用ffmpeg软解,使用sdl播放三大块。希望对你们有所帮助。
  • 模板表达微服务 :desktop_computer: :lollipop: Typescript中的裸分快递微服务模板 :face_with_monocle:里面有什么 快递终点 添加了插件以验证输入 开玩笑地测试: 用超级测试进行端点测试 正常单元测试 ...
  • TS流中文标准文档

    2018-02-02 17:29:44
    中文版本的ts流文档,官方标准文档翻译,包括 pat pmt nit si psi bat eit 等的结构,和ts流机制描述。
  • 解码 ts源成es流,获取其中的pcr时间,并统计一些数据,同时将es流中的视频流再次封装成ts流,提取i帧成ts流。可以控制新ts的播放速率。(缺陷就是只能有一个PMT和2个program)
  • 另外可以查看各种由哪些子构成(Total),Eit数量等等,还是比较方便的。 增加包提取功能,查看每一个ts包或者psi/si包,提取psi/si功能等。 附带压缩包里面提供我常用的psi生成器,ts分析专家,自己评价物有所...
  • 实现了TS流的PAT、PMT的解析以及多节目信息的提取,包括音视频PID、流类型等信息,并可以根据视频PID,抽取出相应的视频pes、es数据,整个代码由C++编写完成。
  • (PAT,SDT,PMT的解析) 2)输入一个节目号能够显示未来几天的信息(EIT的解析) 3)显示NIT中的信息 4)显示CAT的信息(主要是ECM_PID,和EMM_PID) 5)显示系统的时间,这个是我猜的其实我也不知道是系统...
  • 插件可在导入的样式中生成所有使用过CSS类和ID的 目标 提供JS和CSS之间的。 安装与设定 npm install postcss-d-ts // postcss.config.js module.exports = { plugins: [ "postcss-preset-env", ... + "post...
  • 3GPP TS 36.521-1 Ver13.1.0

    2018-07-05 16:45:16
    3GPP TS 36.521-1 version 13.1.0 Release 13(2016-05)
  • 一、特点:TS3-MVA32B2 TS3-MVA71B TS3-MVA91B ●采样速度快,测量准确,稳定,配合各种传感器使用。 ●双排大1寸数码管全四位显示,显示清晰直观,范围-1999~9999,浮动小数 ●标准信号输入4-20mA;0-20mA;0-10V...
  • TS流中BAT与SDT等的解析

    千次阅读 2019-04-13 14:22:06
    TS流的文章不少,但都比较难读;TS码流分析的软件挺多,但思路都雷同。 本文章从另外一个角度来理解和分析TS流,不过只是我个人的理解,错误在所难免,不当之处,请大家多多指教(本文可能经常更新)。   ...
  • TS-ME型多功能电量监测仪表是在消化国外进口同类产品的技术基础上,根据我国对电力设备的运行和计算机智能化监控要求而设计的,该产品集电流、电压、功率、功率因数、电度为一体的综合电量监测仪表,RS485...
  • TS-Demultiplex.zip

    2019-12-02 16:23:14
    ts流的解复用程序,解析TS流的TS_header,PAT,PMT信息,然后解析PES包信息,将TS包解复用为音频流和视频流并保存为mp3文件和h264文件
  • TS流解析[PAT/PMT/SDT]

    2015-07-01 14:07:55
    NIT 中解析了TS流现行网络中的相关信息,主要为NIT_NAME NIT中主要还包括地面,有线、卫星 传送系统的描述符和server_list 的描述符、 本文未对传送系统和描述符、Server_list描述符进行解析 PAT ,主要获取...
  • TS16949各部门KPI数据

    2014-09-03 16:26:57
    PCBTS16949各部门KPI数据大家可以参考

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 84,824
精华内容 33,929
关键字:

ts表