直播:现有的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流。
转自 http://hi.baidu.com/goggle1/blog/item/b3665dc3c753c13ae5dd3b13.html