音响论坛 门户 查看内容

基于网络TS流的数字电视多播的设计与实现

2010-5-12 11:35| 发布者: admin| 查看: 852| 评论: 0|原作者: 王沛|来自: 依马狮广电

一. 整体结构的

  1.系统结构介绍

  随着数字电视广播及计算机网络的发展,基于IP的MPEG2 TS传输流在数字电视前端设备中越来越普及。传统的数字电视播出监控系统中需要用到大量的机顶盒来解码视频压缩信号以达到监控目的。本文通过对Directshow技术、视频编解码技术、RTP/RTCP协议、组播/单播技术以及视频服务质量的研究,设计了一种基于Directshow和RTP/RTCP传输MPEG-2 TS的实时直播监控系统。本文详细介绍了该系统的设计方案与开发过程。Directshow是微软提供的一套基于DirectX(包括DirectDraw、Direetsound和Dirct3D)基础之上的一个流媒体体系结构,是一种基于COM技术的为开发高性能多媒体应用而开发的底层应用程序接口。对于IP组播接收流程如下:构建多条Graph,每条Graph完成从接收到播放的全部过程,其中各条Graph中视频的PID不同,播放的节目便不同。但是在IP单播时,如果依然采用与组播相同的结构,运行的结果却是只能播放一个节目,后来发现这是由组播和单播的原理决定的:对于交换机上的RTP/UDP组播包,接收程序只要在组播域内,设置该组播IP地址和Port端口号便可以接收数据,即接收程序可以在本机不同的Port接收相同的数据;而单播需要设置程序所在机器的Port,这样就只存在一个Port可供使用,多条Graph需要同时接收数据,只有一条可以成功从该Port获取数据并且占用该Port,而其它Graph没有空闲端口可以使用,接收不到数据。

  根据以上特性,决定采用一条Graph的结构,这样只需要一个Port来接收数据,获取并保存视频PID,在解复用后分出多个分叉(Tee,Directshow的分枝处理),每个分叉使用不同的PID播放各自不同的节目。

  2.改进后的结构

  改进后新的结构如上图:

  如上图所示,只需要一个source filter接收数据,多个render filter来渲染图像,这样一个Port也可以播放多路节目了。

  改进后的结构与原结构相比的优势:

  (1)    每增加一个播放节目,比原来结构会少用两个filter和一条Graph,节省了资源;

  (2)    实现双击视频节目在大窗口中播放的效果不需要释放原来Graph资源再新建Graph的过程,而只是将节目视频与另外的播放窗口重新映射就可以了,节省资源,加快了执行的速度。

  基于以上原因,将组播接收和文件播放的结构也都改为单Graph的结构。

  在GraphEditor中播放的效果如下:

  3.完成的界面

  播放效果:

  二. 音频Meter和视频比例的实现

  1.音频Meter的实现

  在SDK下的scope项目的示波器filter上面进行修改,原filter实现了一个完整的示波器,即连续的多点绘图,并在一个对话框中显示波形,没有提供可以使用的接口。修改后只需要一个点的数据,去掉显示波形的对话框,添加一个接口以供程序调用,分别获取左右声音Meter的数据,得到数据后设定一个Timer,每100ms获取一次数据,使用progress control显示振幅。

  由于该修改后的filter需要连接在Decoder filter的后面,但是Decoder filter只有一个output pin,已经连接了render filter,所以需要使用另一个filter,该filter可以动态创建所需的output pin并且不改变接收、输出的数据,将其连接在Decoder filter后面便可以解决问题。

  这两个filter都连接如下:

  使用原示波器filter播放效果如下:

  修改后的scope filter播放效果如下:

  2.视频比例的实现

  计算视频原始大小和播放窗口大小,根据长宽比例的不同决定缩放的比例,使得视频至少有长或宽之一与播放窗口相同,具体使用不同节目render filter的IVideoWindow接口的put_X()方法重新设置视频大小,其中X是Left、Top、Width、Height之一。

  三. 工作过程中的主要问题和解决方法

  1.查询接口的问题

  由于在使用多条Graph的结构中,每条Graph对应于一个节目和窗口,所以从Graph查询IVideoWindow 接口后,实际是自动将其对应于这条Graph中的唯一视频render filter,但是改变结构后,一条Graph对应于多个视频render filter,这样就不能从Graph查询接口了,改为从各视频render filter查询自己的IvideoWindow接口来控制不同节目的视频显示。音频原理相同。

  2.增加音频问题。

  将音频Decoder filter和render filter加入Graph后,按照视频相似的方法设置音频在MPEG-2 Demultiplexer中output pin的媒体类型,结果没有声音播放,原因是音频类型的设置比视频的要多,至少还要增加两项:媒体类型中pbFormat的nChannel属性和nSamplesPerSec属性,在本程序中设置为nChannel=2;nSamplesPerSec=48000。增加这两个属性后可以正常播放声音。

微信扫码关注公众号