直播:现有的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"}}
查看日志,发现:
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流的开发过程》中,会描述这个测试程序是如何开发的。