zoukankan      html  css  js  c++  java
  • 4.数字电视搜索功能原理

    看电视麻,必须有节目才行。节目从哪里来?自然要搜索才行。我们就来介绍一下搜索功能如何实现。

    一,搜索所需要的硬件

    1,当然是tuner,就是我们俗称的高频头,因为节目都是由信道中的一个一个频点所承载的,我们要得到频点里的电信号,这个部件自然是不可缺少的。

    for example,我们要看ccav-1,假定这个节目在256Mhz频点上,我们必须先锁定这个频点,然后进行解调,找到这个频率里面的信息,才能找到节目。

    2,QAM(Quadrature Amplitude Modulation),调制解调器。上一步我们得到了电信号,因为传输的过程中有各种干扰,比如我们要播发mpeg2的视频,是不能直接把01010的二进制串直接播发的,那样的话,几米之后,信号就被各种噪声弄成了不可识别的东东。所以我们要把01010这种东西加上各种纠错码,变成各种正弦信号。在前端,我们调制完了,当然在终端我们必须把这01010这种恢复出来。这个工作就是QAM来做的。dvb的标准里面有16/32/64/128/256-QAM这些标准,具体请看一下通信原理了,呵呵。

    ps:通常tuner是外置,而qam被集成进soc中,这是为什么呢?因为高频是模拟的,而qam过程,实际是数字的。出于工艺,成本,集成度诸多考虑,模拟电路一般会独立出来,soc中通常只有数字电路。

    3.Demux,解复用器。上一步我们得到了01010的二进制串,但是这个串通常是几路节目通过一定的规则混合在一起的。我们看节目,一个时间点,通常只看一个节目,所以我们要先从几路节目中,得到我们需要的那一路,这就是demux的作用。

    当然有些同学说,为什么要搞这么复杂,一个频点上一路节目不就行了嘛。当然,这样做绝对ok,实际上模拟电视就是这么干的,但是信道里面的频点是有数的,如果不压榨每一点资源,怎么能在有限的资源多做一些事呢?这实际就是数字电视的优势嘛,可以多看很多节目。呵呵。

    二,搜索一个频点节目的过程。

    上一段我们解释了需要的硬件,提到了节目是通过一定的规则混合的(这个过程其实就叫复用)。下面我们说说这个规则是啥。也就是搜索一个频点节目的方法。

    概述:

    ISO13818-1 system这个spec里面描述了这个规则。不过实际上说白了,也很简单。先说大概步骤,然后详细,说下。

    1.锁定xxx频率

    2.从qam中得到TS流

    3.对demux设置参数,具体就是pid(package id),tid(table id), mask这些,得到PAT表(节目关联表)。

    4.从PAT中得到各个PMT的信息

    5.解析PMT,得到该PMT的音视频id,加密信息。

    具体流程如下图所示。

    image

    经历这五步曲,我们就搜索完成了一路节目,剩下的就是批量完成这个事件了。

    前两步,就不多做介绍了,这不是ts流的业务范围。我们先来介绍一下TS流的概念(transport stream)。简单来说,TS就是一个包装网络信息,节目信息,音频数据,解密数据等等的容器。所谓的节目信息,就是指PSI,这个是我们搜索所关注的。

    TS每一个包是188字节,连续的包,就构成了我们节目流。每个包都有对应的PID,这个PID就是我们解复用的依据。PID在哪呢?一个ts包,有一个4bytes的包头,这个4bytes包头中,有一个13bits的字段,就是ts包对应的pid。这个pid就是这188bytes的第二bytes的后五位,与第三bytes的全部。如下图所示。

    image

    一行代码表示就是 uint16_t pid = ((uint16_t(buf[1] & 0x1F) << 8 ) | buf[2];

    为什么有了PID,还要再加一个TID呢?因为13818里面规定的不同的表,也有可能使用相同的PID,比如NIT与ST,这时我们要区分他们,就需要Table ID了。

    我们要先找PAT,PAT是一切表的始祖,所以PID是固定的0x0000,TID是0x00。我们找到当前流里面所有的PAT的section。按照spec解析,大致的表结构如下图所示,里面的programs loop描述了各个PMT的PID。

    image

    对于PAT来说,第一个program_number是0x0000,这个其实对应的不是PMT,而是NIT的PID,下面我们会介绍NIT搜索方式,这里先不解释。

    有了PMT的pid,剩下的就是解析PMT里面的音视频的streams loop从而得到音视频PID,就完成一路节目的搜索。PMT的表结构如下图

    image

    完成一路节目,再设置下一路PMT的PID,TID,循环,就完成了一个单频点的搜索。

    三,搜索整个网络节目的方法

    我们得到一个频点所有节目后,剩下的任务就是如何完整的搜索整个网络的节目了。当然,我们必须要知道当前网络一共有哪些频点是可用的。一般来说,有三种方式。

    1.NIT

    NIT这个表,描述了当前网络的所有信息,比如频点,波特率,调制方式,pmt信息等等。比如下面这个nit,就有两个section组成,每个section中描述了当前网络里面节目的信息。这个网络里面有25个频点,就有25个transport_streamsloop.

    image

    image

    下面我们看一下transport stream loop里的信息

    image

    每一个serviceid就代表了一个节目。

    其实NIT搜索,就是所谓的快速搜索功能。对于运营商来说,通常不会在所在的频点都加入nit,因为nit数据量相对比较大,都加入这个表,太浪费带宽资源,所以对于运营商来说,通常都有一个所谓的“主频点”,当然是人为规定的,这个频点里通常会包含的信息比较全,其他频点的就不一定会有nit了,从这角度来说,nit是可选的。

    当然,NIT不止搜索这一个用途,其他用途,以后再说。

    2.配置文件

    如果网络里所有的频点都没有NIT怎么办?我们当然不能无法搜索节目。通常来说,数字电视软件都是运营商定制的,我们交付软件时,是知道网络的相关状态的。所以我们可以在软件中增加一个配置文件,描述当然网络里面所有的频率信息。

    当我们软件启动时,解析这个配置文件,就可以得到一个频点列表,然后我们一个一个锁频,解析pat,pmt,这些,就可以得到所有的节目信息了。

    比起方法一缺点就是比较慢。

    3.私有表

    这种方法是一种比较不正式的做法。

    但是13818给了我们这种机制,我们可以自定义私有表,来描述自己需要的信息。当然节目信息可以加入进去了。

    通常会用到多网络搜索时,一个比较常见的情况是,卫星机,要搜索多个卫星的节目。但是多个卫星属于多个网络,卫星的位置,频率都不一样。无法使用NIT搜索,这时我们可以加一个私有表,这个私有表描述多个卫星的节目信息,从而加快搜索速度。

    四,其他一些常用手法

    通常来说,有线电视网络都是比较稳定的,不会经常的改来改去。为了加快切台速度,会把节目的所有信息都保存起来,比如频点,av/pid等等,这样按遥控器时,就不用每次都搜索,直接读文件得到相关信息即可。

  • 相关阅读:
    echo和tee的使用
    cut列的截取
    BZOJ1414: [ZJOI2009]对称的正方形(二维hash)
    BZOJ1010: [HNOI2008]玩具装箱toy
    BZOJ2588: Spoj 10628. Count on a tree(主席树)
    BZOJ3991: [SDOI2015]寻宝游戏(set+lca / 虚树)
    BZOJ2286: [Sdoi2011]消耗战(虚树)
    Linux
    奇妙的棋盘(建图+搜索)
    礼物(动态规划)
  • 原文地址:https://www.cnblogs.com/mr-nop/p/3676679.html
Copyright © 2011-2022 走看看