IPTV支持TS流的方案形成过程

来源:互联网 发布:淘宝代刷皇冠 编辑:程序博客网 时间:2024/05/05 23:35

直播:现有的ISMA方式,流程如下:

    视频采集-->视频编码-->RTP打包-->UDP组播;

    音频采集-->音频编码-->RTP打包-->UDP组播;

    上面是MP4live的工作流程。

直播:MPEG TS流方式,流程如下:

    视频采集-->视频编码-->

    音频采集-->音频编码-->TS打包-->RTP打包-->UDP组播

    上面是TS流的工作流程。

点播:ISMA方式

    分别读取文件中的音频和视频数据,分别打包到RTP,分别发送出去。

点播:TS流方式

    分别读取文件中的音频和视频数据,打包成TS流,封装到RTP中,然后发送出去。

 

 

现在有如下事情需要做:

1.        2010年9月30日搭建环境,测试Darwin服务器是否支持TS流,测试环境如下:

    VLC-->Darwin-->VLC    

       a. 我们分成两步达到这个目标:首先试验VLC1-->VLC2

      VLC流化的配置,可以通过图形界面配置,也可以通过命令行控制。

      VLC1从Darwin服务器请求了媒体数据,然后打包成为TS流,并发送出去,VLC2接收TS流数据,播放;

      整个过程走的通,抓包证明中间确实是TS流。

      当然,也存在问题,就是图形会出现马赛克,猜测是因为B帧的PTS,和DTS有问题。

      还有一个问题是:不能生成sdp文件,因为我们要实现第二步。

      b.  VLC-->Darwin-->VLC 

      Darwin服务器需要一个SDP文件来描述媒体源。

 

2.         问题:VLC在流化过程中,不能生成sdp文件,需要解决这个问题?

错误的写法:

vlc -vvv --extraintf=logger rtsp://115.182.51.78/tv/XingKongDianYing.sdp :sout=#duplicate{dst=rtp{dst=224.1.2.3,mux=ts,port=1234,sdp="file://c:/test.sdp"}}

正确的写法:

vlc -vvv --extraintf=logger rtsp://115.182.51.78/tv/XingKongDianYing.sdp :sout=#duplicate{dst=rtp{dst=224.1.2.3,mux=ts,port=1234,sdp="file://10.57.26.88/guoq/test_100.sdp"}}


3.         问题:VLC在流化过程中,图像质量很差,定位问题?

查看日志,发现:

mux_ts warning: packet with too strange dts (dts=23955930833,old=23956030944,pcr=23956030944)

mux_ts warning: packet with too strange dts (dts=23956097687,old=23956197798,pcr=23956197798)

mux_ts warning: packet with too strange dts (dts=23956231175,old=23956364663,pcr=23956364663)

mux_ts warning: packet with too strange dts (dts=23956398030,old=23956531518,pcr=23956531518)

mux_ts warning: packet with too strange dts (dts=23956564885,old=23956698373,pcr=23956698373)

mux_ts warning: packet with too strange dts (dts=23956731739,old=23956831861,pcr=23956831861)

mux_ts warning: packet with too strange dts (dts=23956898593,old=23956998715,pcr=23956998715)

mux_ts warning: packet with too strange dts (dts=23956278439,old=23957011060,pcr=23956931970)

mux_ts warning: packet with too strange dts (dts=23957044802,old=23957132191,pcr=23957132191)

问题如何解决,现在还不知道。 

而且,使用图形界面配置串流的时候,图像有马赛克。可能有问题。

 4.         直播的方案:

a)         如果解决了问题3,那么直播流化TS,可以通过架设方案完成;

b)        如果不能解决问题3,那么直播流化TS,需要开发方案;可以考虑在MP4live中间加TS流化的代码。

建议采用方案b,因为我们要改写pid等一些信息,需要符合联通的要求,这些是无法通过配置vlc来解决的。 

5.         点播文件的方案:

a)         MP4文件转化为TS文件,然后看Darwin是否能够读取并流化;

b)        MP4文件给Darwin,Darwin读取,然后转为TS流,流化;

经过试验证实:Darwin服务器不支持流化TS类型。在RTSP命令中Describe阶段,返回514错误码:unsupported media type.

Request: DESCRIBE rtsp://10.57.26.88/test.ts RTSP/1.0/r/n

        Method: DESCRIBE

        URL: rtsp://10.57.26.88/test.ts

 

Response: RTSP/1.0 415 Unsupported Media Type/r/n

        Status: 415

 

那么现在的方案有如下两个选择:

a)         读MP4,出TS流;

b)        读TS文件,出TS流;

 

6.         研究TS流的开源代码

a)         MPEG4IP中的mpeg2t;

提取TS流的。

b)        VLC中的mux_ts;

c)        Live555中有没有可供借鉴的?

testMPEG2TransportStreamer.cpp

d)        libtsmux,一个开源的C库

e)         MP4Box,GPAC。

Mp4fileàTS file, or RTP, or UDP.

f)         tstools

       esmerge.c 

7.         直播TS流方案

    视频采集-->视频编码-->

    音频采集-->音频编码-->TS打包-->RTP打包-->UDP组播

8.         点播TS流方案

        Darwin服务器读取TS文件,打包成为RTP数据,发送出去。 

9.         MP4文件转换为TS文件

vlc -vvv --extraintf=logger d:/11.mp4 :sout=#std{access=file,mux=ts,dst=d:/11.ts}

 10.         MP4文件转换为TS流 

vlc -vvv --extraintf=logger d:/11.mp4:sout=#duplicate{dst=rtp{dst=224.1.2.3,mux=ts,port=1234,sdp="file://10.57.26.88/guoq/test_100.sdp"},dst=display}

11.     做一个测试程序

从MP4文件中读出视频数据,音频数据,打包到TS流,并封装成RTP包,发送出去;使用VLC可以接收并播放。

在《IPTV支持TS流的开发过程》中,会描述这个测试程序是如何开发的。

 

目标:从MP4文件中读出音视频数据,打包到TS流,保存成为TS文件。使用VLC或者暴风影音可以播放该文件。

1. 读取MP4文件,取得其中的音视频数据;

    可以使用MPEG4IP中的库,引入头文件mp4.h,连接libmp4v2.so;写法可以参考MP4creator。

    顺序取得音频帧,和视频帧,对它们按照播放时间做两路归并排序。

    播放时间的计算:

        audio_play_time = audio_timestamp*1000/audio_timescale;

        video_play_time = video_timestamp*1000/video_timescale;

2. 这时候取到的是ES流,ES打包成为PES包,PES打包成为TS包。其实,我们漏下了一点东西要说,ES在打包成为PES之前,需要做一点事情:

    视频ES,如果是第一帧,那么需要加入VideoStreamHeader,每一种编码格式,比如H.264,或者MP4,都不相同。每一种编码格式都需要取得自己独特的VideoStreamHeader。

   音频ES,每一帧的音频,都需要加入AudioStreamHeader,每一种编码格式,比如AAC,都需要单独取得。

   a. H.264,定义个uchar H264_delimeter[4]={0x00, 0x00, 0x00, 0x01};

       第一个是H264_delimeter[4],0x09, 0xE0;

       第二个是H264_delimeter[4],SeqHeader;

       第三个是H264_delimeter[4],PictHeader;

   b. mp4, mp2, mp1,MP4GetTrackESConfiguration;

   c. AAC音频,放置7个字节的ADTS固定头信息;其中要设置每一帧音频数据的长度,所以每一帧都需要改变。

3. ES-->PES

    需要构造PES头,需要打标PTS和DTS;

4. PES-->TS

    需要构造TS头,需要打标PCR,需要对PES分成小于188的几块,长度通常是184,或者184-8;8个字节是PCR信息。

   当然,对整个TS流来说,需要一个PAT表,告诉我们有几路节目program;

   还需要几个PMT表,PMT表告诉我们,这个节目里面包含的几个ES流。

原创粉丝点击