在学习流媒体播放的时候,是利用vlc-2.2.1做为调试工具的。由于需要对ts流进行rtsp方式点播,在进行rtsp的C/S两端配置时出现了种种问题,经过一番探索解决问题,发现使用命令行的方式比界面方式方便很多,配置的复杂度集中在服务端,客户端则很简单,界面或命令行方式皆可。
1、vlc -vvv --extraintf=logger test.ts --sout "#duplicate{dst=rtp{sdp=rtsp://:554/test.sdp}}" --loop
这是最初的配置,结果在客户端只有声音没有图像。
2、vlc -vvv --extraintf=logger test.mp4 --sout "#transcode{vcodec=h264,vb=0,scale=0,acodec=mpga,ab=128,channels=2,samplerate=44100}:duplicate{dst=rtp{sdp=rtsp://:554/test.sdp}}" --loop
这种方式是从网上查询到的,客户端可以正常播放。从配置看是存在一个转码过程的,试用的文件是h263编码格式,换成一个flv文件仍然只有声音出来。
3、vlc -vvv --extraintf=logger test.ts --sout "#duplicate{dst=rtp{mux=ts{pid-video=100,pid-pmt=1000},sdp=rtsp://:554/test.sdp}}" --loop
这个配置的mux部分是从网上http方式ts流推送配置找到的灵感,图像终于出来了。但是客户端存在比较严重的马赛克现象,原因不明。
4、vlc -vvv --extraintf=logger test.mp4 --sout "#transcode{vcodec=h264,vb=0,scale=0,acodec=mpga,ab=128,channels=2,samplerate=44100}:duplicate{dst=rtp{mux=ts{pid-video=100,pid-pmt=1000},sdp=rtsp://:554/test.sdp}}" --loop
这个实际是根据(3)对(2) 进行的修改。
总结:
点播涉及到sdp的payload的格式,考虑到源数据的多样性,在进行推送的时候目前看来如果不配置mux则按H264类型生成sdp。
(1)之所以无图像是因为由于没有指定mux信息,sdp中生成了错误的H264类型,而对于ts流应该是MP2T类型;
(2)由于对原数据转换成了H264,因此尽管未指定mux信息仍能正常显示;
(3)由于指定了mux信息,sdp生成了正确的MP2T类型;
(4)和(2)的区别就在于传输的是ts流而不是H264;
修正:
关于mux的理解存在偏差,通过wireshark抓包分析, (1)是将ts文件demux后发送其H264数据,因此sdp中信息是对的,(3)是将ts文件demux后再mux进行发送,由于此ts文件中的H264是设备的硬codec生成,基本可以确定不是H264编码格式就是ts封装格式引起(1)(3)的问题。