ts 流中SI中的SDT 表

ts 流中SI中的SDT 表
----------------------------------------
SDT即服务描述表(Service Description Table),
----------------------------------------
网上说, SDT以transport_stream_ID连接了NIT和EIT;
它的意思是说, SDT 都包含一个传输流ID(transport_stream_ID)字段, 说明服务是针对哪个个TS_ID, NIT及EIT中也都有TS_ID 字段.
网上说, SDT的servicID必须与PMT中的Program_no一致,因此,SDT又与PSI的信息连接。
这句鬼话的意思是说, SDT表中包含一个servicID 字段, 它等于PMT中的Program_no, 所以该服务是针对指定的节目的(Program_no).
或者说该服务是针对某个频道的.
到现在为止,服务是什么还没有说,只是说了一个定语,说明它是针对谁的,它包含了省级(network_id),县级(ts_id)定语,具体服务又包含了乡级定语(service_id见后)
服务的内容要靠描述长度和描述内容来说明,描述内容由描述子来说明,描述子由描述tag和描述内容来说明.最底层的描述内容就是bit字符串了.
例如:

for (i=0;i<N;i++)
{
    service_id                     16    uimsbf
    reserved_future_use            6     bslbf
    EIT_schedule_flag              1     bslbf
    EIT_present_following_flag     1     bslbf
    running_status                 3     uimsbf
    free_CA_mode                   1     bslbf
    descriptors_loop_length        12    uimsbf
    for (j=0;j<N;j++)
    {
        service_descriptor()
    }
}
service_descriptor()
{
    descriptor_tag                    8    uimsbf
    descriptor_length               8    uimsbf
    service_type                    8    uimsbf
    service_provider_name_length    8    uimsbf
    for (i=0;i<N;i++)
    {
        char                        8    uimsbf
    }
    service_name_length             8    uimsbf
    for (i=0;i<N;i++)
    {
        char                        8    uimsbf
    }
}

SDT 的 descriptor_tag ;  0x48 (Service descriptor)
例如:
0x00000005; descriptor_length ;  18
0x00000005; service_type ;  0x1 (Digital television service)
0x00000005; service_provider_name_length ;  6
0x00000005; service_provider_name ;  'FFmpeg'
0x00000005; service_name_length ;  9
0x00000005; service_name ;  'Service01'


大部分简单descriptor() 如下述.
根据descriptor_tag不同也会有解释上的变化. 而sdt 0x48描述符比它复杂.
adaptation_field_data_descriptor()
{
    descriptor_tag                        8        uimsbf
    descriptor_length                    8        uimsbf
    adaptation_field_data_identifier    8        bslbf
}


----------------------------------------
2. sdt 表实例介绍:
----------------------------------------

(gdb) x/50b section (sdt section)
  0x5555555dc240:    0x42    0xf0    0x25    0x00    0x01    0xc1    0x00    0x00
  0x5555555dc248:    0xff    0x01    0xff    0x00    0x01    0xfc    0x80    0x14
  0x5555555dc250:    0x48    0x12    0x01    0x06    0x46    0x46    0x6d    0x70
  0x5555555dc258:    0x65    0x67    0x09    0x53    0x65    0x72    0x76    0x69
  0x5555555dc260:    0x63    0x65    0x30    0x31    0x77    0x7c    0x43    0xca
  0x5555555dc268:    0xff    0xff    0xff    0xff    0xff    0xff    0xff    0xff
  0x5555555dc270:    0xff    0xff

  1. section header: 0x42 0xf0 0x25 0x00 0x01 0xc1 0x00 0x00
    0x42 :        table_id
    0xf0 0x25:     数据长度0x25(12bits), bit15 为1表示这是一个section
    0x00 0x01:     扩展id, 这里是transport_stream_id.
    0xc1:        version (5bits) 为0,最低位1表示子表是当前使用的表
    0x00:        section number
    0x00:        last section number

  2. 0xff 0x01:    origin network_id
     0xff: reserved
     进入循环
  3. 0x00 0x01: service_id
     0xfc:        前6bits保留,后2bit, EIT_schedule_flag, EIT_present_flag
     0x80 0x14: 前3bit, running state, 第4bit,ca_mode, 后12bit 循环长度
  4. 进入循环
       0x48:        descriptor_tag, 是服务描述,确定了后续数据的解释规则
     0x12:        长度
     0x01:        服务类型,为数字电视业务
     0x06:        长度(供应商名字长度)
     0x46 0x46 0x6d 0x70 0x65 0x67: FFmpeg
     0x09:        长度(服务名字长度)
     0x53 0x65 0x72 0x76 0x69 0x63 0x65 0x30 0x31: Sevice01
     退出循环(0x12长度已到)
     退出循环(0x14长度已到)
  5. 0x77 0x7c 0x43 0xca: 4bytecrc.

 这个SDT表描述了:
       service_provider: FFmpeg
       service_name    : Service01

其中service_provider,service_name 是由0x48 descriptor_tag 决定的.
而"Service01", "FFmpeg" 是流里包含的.

当然,服务是针对service_id , 精确到具体的节目. 所以也包含了network_id及transport_stream_id 三级精确定位.

小结: sdt表描述了一组服务,因为是一组,1个或者多个,所以才称为一个表.
每个服务包括一个service_id,及服务名称,供应商是谁. 这里的服务对应的是频道. 名称类似于cctv1频道, cctv2频道,cctv5频道,新知频道,剧场频道等等这种概念.

参考图片:

小结2: 不能哭了半天不知道是谁死了. SDT表到底说了什么呢?
故名字义,SDT表就是用来描述一组服务或者说一组频道. 一组就是1个或多个的意思,所以才叫表.
每个服务(service_id)由频道名称(service_name)和频道供应商(service_provider)来描述, 就这么点信息.
当然频道信息是归属于某个供应商的,它是某个供应商(network_id)下某组产品(transfort_stream_id)下的某个服务(service_id)
不过我查了一下,发现当下播出的udp 流中虽然有SDT表, 但是频道名称(service_name)及频道供应商(service_provider)填的都是空,
所以相当于就没有使用!!
是的,播出一个音视频流有PSI就够了, SI 信息只是锦上添花的事情,没有也没关系.
另外我也查了一下,EIT表根本就没有. 所以当下的dvb播出状况就是没有使用SI. 不过它把频道信息打在视频流里,显示在屏幕左上角,也从侧面解决了sdt问题。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值