ts 流中SI中的SDT 表

2024-03-15 18:10
文章标签 ts si 流中 sdt

本文主要是介绍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问题。

这篇关于ts 流中SI中的SDT 表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/812823

相关文章

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码+详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装,可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 (1)通过position属性,可以控制下拉选项的位置 (2)通过传入width属性, 可以自定义下拉选项的宽度 (3)通过传入classN

React+TS 从零开始教程(2):简中简 HelloWolrd

源码链接:https://pan.quark.cn/s/c6fbc31dcb02 这一节,我们来见识React+TS的威力,开始上手开发第一个组件,什么组件呢? 当然是简中简的 HelloWolrd组件啦。 在src下创建一个components,然后新建Hello.tsx 为什么是tsx呢,这个目的就是告诉编译器,我这个文件是支持jsx语法的,如果遇到你看不懂的标签,就当作React Ele

idea或vscode支持vue语法,ts可解析*.vue

一、ide不能解析vue文件 刚开始导入时,在vscode中的vue文件中内容都是灰色的 ide不能解析vue解决方法: 1.idea或webstorm安装vue.js插件 2.在vscode中 vue2.0的项目安装vetur插件vue3.0及以上的项目安装Vue-official插件(之前是Volar)  vue官方推荐:搭配 TypeScript 使用 Vue | Vue.j

从零到一学FFmpeg:av_packet_rescale_ts 函数详析与实战

文章目录 前言一、函数原型二、功能描述三、使用实例 前言 av_packet_rescale_ts是FFmpeg库中的一个函数,用于重新缩放或转换媒体流中的时间戳(timestamp),以适配不同的时间基(timebase)。 在处理多媒体数据时,特别是当数据在不同组件间传递,或者在编码、解码、转封装等操作中,时间戳经常需要调整以匹配当前上下文的时间基。 提示:以下是本

socket输入流中读取一个固定长度的字节

前段时间项目中用到socket编程,我用socket输入流读取一个固定长度的字节经常会遇到各种各样的错误:后面读取内容的错位,或者直接后面的内容读取不到等问题。 具体我用的方法是 socektInputStream.read(byte[] array1);   最后通过以下代码读取固定长度的字节 public static byte[] readFixedLengthArray(Bu

tauri中从前端ts调用rust函数,并异步收到响应结果

在前端是可以异步调用rust代码的,而且还是挺简单的逻辑,一共就三步:定义rust函数,注入到invoke_handler中,在前端调用。有英文能力的可以看官方文档:Calling Rust from the frontend | Tauri Apps 没有英文阅读能力可以看中文文档:Tauri Rust基本示例_w3cschool 定义Rust命令 命令是在 src-tauri/src

从零到一学FFmpeg:av_compare_ts函数详析与实战

文章目录 前言一、函数原型二、功能描述三、使用场景四、使用实例 前言 av_compare_ts是FFmpeg库中的一个函数,用于比较两个时间戳(Timestamps)。这个函数广泛应用于视频处理、流媒体播放和多媒体同步等场景,特别是在需要精确控制媒体数据播放顺序和时间的地方。 提示:以下是本篇文章正文内容,下面案例可供参考 一、函数原型 int av_compar

vue3 ts 引入echarts

Echarts Page:https://echarts.apache.org/handbook/zh/get-started/ TS: https://echarts.apache.org/handbook/zh/basics/import install npm install echarts --save create echart.ts // 引入 echarts 核心模

TS-RadiMation测试软件如何在序列测试中发挥作用?

一、测试目的 序列测试的目标是在没有测试工程师干预的情况下依次运行不同(类型)的测试。这些测试可以是相同类型或完全不同类型。 例如,序列测试功能可用于: ● 依次运行辐射发射测试、传导发射测试和辐射抗扰度测试(全部在同一电波暗室中进行)。 ● 不同频段使用不同放大器的情况。对于这种情况,可以生成多个TSF文件,其中每个 TSF 文件定义一个频带。然后,可以将所有创建的 TSF

React+TS前台项目实战(十三)-- 全局常用响应式加载动画Loading组件封装

文章目录 前言Loading组件1. 功能分析2. 代码+详细注释3. 使用方式4. 不同尺寸loading动画效果展示 总结 前言 高阶组件有几大优点,其中一个就是渲染劫持,如懒加载,是否显示该元素loading,这在项目中我们经常用到。毫无疑问,这个实战系列我们必然也要用到它,本文主要封装这个loading组件,为了后期开发页面使用。 Loading组件 1. 功