TSOverIP
通过IP网络传输TS流数据,主要是通过单播(UDP)或组播(Multicast)的方式进行传输。考虑到以太网中数据帧的最大长度为1500字节,所以TSOverIP规定,每7个TS数据包封装在一起组成一个IP包进行发送。
网上的资料不多,我写一个发送psi的程序,却发现问题多多,逐个解决之后,总结一下:
1.一般情况下,一次发送一个IP包为7*188B=1316字节(虽然,可以自定义发送和接收的IP包封装为1~7个188B);
2.若一个TDT表内容只有1个188B,另外的SDT表假设3个188B,那该如何封装和连续计数呢?
答:还是分开使用各自的计时器进行计数,有几种表使用几个pid则用几个计数器;计数器当程序进行发送时才开始计数,全局变量。一个188B的情况,不要怕浪费资源,剩余6个188为空包。当TDT和TOT一起发送,他们使用的同一个pid=0x14,则5个空包,2个内容。空包用pid=0x1FFF进行填充即可。
3.发送间隔
Thread.Sleep(TimeSpan.FromMilliseconds(db._EitPF_Interval)); //毫秒计数的时间间隔
按毫秒级让线程休息xx 毫秒即可,把发送的线程看成是实时的过程(封装数据采用多线程,数据提前产生好;避免和发送过程一起等待时间造成响应问题,资源冲突等问题)
4.多线程
多线程之间注意逻辑关系,注意引入互斥类mutex。
lock (this)
{
mutex.WaitOne();
。。。。。。。。。。。。。。。。。 //处理发送内容
mutex.ReleaseMutex();
}