新闻  |   论坛  |   博客  |   在线研讨会
基于DirectShow的卫星电视多路节目播放技术
yanqin | 2009-06-24 14:45:50    阅读:1685   发布文章

 

摘要:首先对mpeg-2系统层协议进行剖析,然后介绍了directshow的应用领域和技术要点,最后提出了一种基于directshow的多路视音频播放技术,并给出了主要模块的设计方案,以及directshow链路死锁问题的解决方法。这种方法应用于多路电视节目的实时播放和节目素材的收集与整理之中,较传统的单路节目播放和采集节约了硬件成本提高了工作效率。
关键字:dvb-s,directshow,mpeg-2,解复用

引言

dvb(数字视频广播,digital video broadcasting)是欧洲标准组织提出的电视广播体系。目前我国已经上星的多家省级电视台均采用了其中的dvb-s(dvb卫星传播)标准。dvb-s的信号传输属于典型的多路单载波(mcpc)模型,每个载波可以承载多路各不相同的电视节目。传统采用数字卫星接收系统,只能对dvb-s信号中的某一路节目进行播放和采集。本文提出了一种在通用接收机条件下基于directshow技术的对dvb-s传输流进行解复用,提取并播放其中的多路视频节目的设计方案,实现了单监视器条件下对多路电视节目的播放。同时本文所讨论的技术对节目素材收集、网络视频点播以及硬盘录像机等多媒体应用具有重要的借鉴意义。无线soc开发平台499元 s3c44b0 arm7开发板378元 s3c2410 arm9开mpeg-2系统层协议剖析

dvb-s采用mpeg-2作为复用传输和视频编码协议。mpeg-2标准(iso/iec 13818)是运动图像专家组mpeg(moving picture experts group)于1994年推出的编码标准。运用mpeg-2压缩技术既可以获得比较好的压缩效果,又能够保持高清晰度的活动图像,因此mpeg-2广泛应用于数字视频广播和数字多媒体领域。

mpeg-2协议主要分为系统、视频和音频三个部分。mpeg-2的系统层协议描述了多路数据的复用方式,并规定了数据传输的格式。

2.1  传输流结构

mpeg-2系统层定义了两种数据传输方式:传输流(ts,transport stream)和节目流(ps,program stream)。前者是针对那些容易发生错误的环境而设计,例如通过卫星信道进行传输的dvb-s,后者则是针对错误较少的环境而设计,例如dvd光盘等。传输流是一种面向分组的多路复用流:基本数据流(es)进行打包成为pes,再经系统复用生成ts数据,最后打包成固定帧长(188字节)的ts包进行传输。每一个ts包只包含一种es(压缩视频、音频,或ip数据等)。系统层使用一个13比特值作为每个包的标识符,称为pid。在一道传输流中pid与es是一一对映的关系。ts包的帧结构如图1所示。

图1

2.2       psi信息和pid映射关系

psi(节目详细信息,program specific information)包含了多路节目的复用信息,它是解复用操作的依据。psi包括节目关联表(pat)、节目映射表(pmt)、网络信息表(nit)以及条件访问表(cat)等。

pat的pid固定的为0x0000,它定义了传输流中特定序号的节目与相关的传输流分组的对应关系。pmt提供了节目号码与组成节目的es pid的映射关系。nit属于私有分段,通常包括用户选择的服务、通道频率等映射以及该路节目的供应商和节目名称等信息。nit的pid系统层未作限定,因此理论上任何有效的pid值都可能作为nit的pid。cat的pid固定为0x0001,它出现在传输流中有加密数据的情况下。cat描述了条件访问系统的类型,和其它用户私有信息。

directshow简介

directshow是微软公司directx框架的一部分。directshow的实现是基于com(组件对象模型)的,因此具有良好的可开发性和可复用性。

directshow侧重于多媒体数据的处理。多媒体数据具有数据量大、音像同步要求苛刻、媒体格式众多等特点。directshow框架提供了对显卡和声卡等硬件的完整封装,开发者可以不必考虑硬件的工作原理以及驱动编程的具体实现细节。另一方面,directshow组件之间的相对独立性使开发者可以专注于处理算法的实现而无需过多考虑组件之间的数据传输问题,因此开发者通过编写相对简洁的代码便可高效地完成较为复杂的多媒体处理。

3.1 filter链路


filter是directshow中最基本的组成部分,它是完成某个特定功能的com组件。filter依次连接起来,构成了filter链路。directshow通过一个称为filter graph manager(链路图管理器)的com对象管理整个filter链路。应用程序通过filter graph manager来对链路的状态进行控制,如播放、暂停或停止等。按照功能,filter可以分为source filter、transform filter、rendering filter三种类型。

source filter用于获取数据。数据可以来自文件也可以是实时的数据源如网络、数据采集卡等。

transform filter接收source filter传送来的数据,对其进行处理,比如解复用操作、音像数据的分离或编码/解码等。

rendering filter的主要功能是将数据送往显卡、声卡进行多媒体演示或者输出到文件进行存储。

3.2       工作模式

directshow框架定义了两种工作模式:推模式(push mode)和拉模式(pull mode)。

推模式下,数据被source filter主动推向与其相连的transform filter,后者再将处理过的数据推向下行filter。推模式通常使用在实时数据情况下。对于实时数据源,数据传输速率可能不是恒定的(例如网络媒体传输、视频采集卡等),因此采用推模式source filter可以根据数据源的实际状况决定如何将数据传给下行filter。

拉模式下source filter被动的提供数据,与其相连的transform filter创建一个数据线程主动的向source filter索取数据,有一个“拉”的过程。工作在拉模式的filter一般采用异步读取数据的方式。拉模式通常应用于本地文件播放以及媒体编辑等。

4          设计方案

4.1       原理及流程

卫星信号经天线接收、放大、变频后以中频信号的形式送入通用接收机。通用接收机对信号进行解调和信道编码的解码。输出的传输流数据流,首先经过psi分析得到完整的pid映射关系,然后根据节目关联表信息将其中的视音频数据分离送往解码器,最终在显示终端上播放。工作流程如图2所示。


图2

从数据采集、分离到显示,可以在一条filter链路上实现:source filter获得接收机输出的传输流数据;解复用filter实现分析psi、解复用功能,并将视频和音频数据送往解码器filter。

完整的filter链路图如图3所示。

 

图3

图中每一个方框表示一个filter。source filter没有输入并且只有一个输出。与之相连的是解复用filter,它有一个输入和多个视频、音频输出。视频数据被送往mpeg-2解码器filter,音频数据送往音频解码器filter。解码器的输出连接到了render filter。

4.2       filter工作模式的选择

处理微机通过高速数据采集卡获得通用接收机的输出,因此对于filter链路来说,数据源是一种实时源。所以选择推模式作为整个filter链路的工作模式。

5          主要模块的设计和实现难点

5.1       source filter

source filter封装了采集卡的接口函数,采用双缓冲工作方式,通过轮询察看缓冲区是否已满。当缓冲区满时将数据送往与之相连的解复用filter。

5.2       解复用filter

解复用filter是整个filter链路的核心部分。它的功能是分析传输流的psi,建立完整的pdi映射关系;然后从传输流中分离出每路节目的视频和音频数据,将它们送往相应的视频和音频解码器,同时接收应用程序的控制信息。解复用filter对每一个传输流包的处理过程如图4所示。

图4

5.3 解决链路死锁问题


filter链路通常需要一个传输线程。在推模式下,传输线程通常由source filter创建,数据被线程推向解复用filter,经处理生成的视频和音频数据被送往解码器,最后在终端上播放出来。整个过程都在单线程内完成。

在多路输出情况下,一般的推模式单线程模型将会导致链路死锁。解决死锁问题的关键是为每一路视频或音频输出创建专门的传输线程,并且线程的创建应该在解复用filter内完成而不是在source filter内(因为source filter只有一个传输流输出)。

在directshow sdk中,可以通过使用coutputqueue对象来实现多线程传输,最终解决死锁问题。方法是在解复用filter中声明一个coutputqueue对象,在每次启动传输时调用coutputqueue的receive(imediasample* psample)函数。此时对象会自动生成一个传输线程,并将其加入到自身的线程队列中,当线程完成时将其从队列中清除。

5.3       video mixing renderer9

video mixing renderer9(vmr9)是directx9新添加的组件。它使用了direct3d9技术,充分利用了显卡专有的图形处理能力,并且在做视频的合成和显示时不占用系统cpu资源。使用vmr9可以高效的完成多路视频的播放。如果使用传统的video render filter,在多视频显示条件下,必须为链路添加多个render filter。而vmr9最多接收十六个视频输入,在多路播放时可以将每一路视频设置在窗口的不同区域来显示,还能够实现多个视频或图片的叠加,例如在节目中加入动态字幕或台标。

6          实验结果

pc机配置

l         操作系统:windows2000 professional

l         cpu:p4 2.4ghz

l         内存1g byte

l         显卡:主板集成,显存128m byte

信号参数:

l         卫星参数:泛美8号,166°e

l         极化方式:垂直

l         下行频率:3836mhz

l         符码率:22000波特

l         节目提供商:tvbs

l         频道数目:9(加密频道数目6,非加密频道数目3)

图5是显示界面,图中正在播放三路非加密节目。

图5

7          结束语

本文作者的创新点:使用directshow技术,结合通用接收机,解决了数字卫星接收单监视器系统无法播放多路节目的问题,降低了硬件成本,对于非专业条件下的多媒体节目的播放(监控)和素材的收集具有实用价值。另一方面,使用directshow还可以实现其它的功能,例如使用des(directshow editing services)可以实现对多媒体文件的非线性编辑等。理论上还可以将本文的设计应用在网络环境中:网络客户端可以通过psi信息,选择播放或录制感兴趣的电视节目从而实现网络视频点播功能。

参考文献

1、    iso/iec 13818-1(mpeg-2 system),iso/iec 13818-2(mpeg-2 video),iso/iec 13818-3(mpeg-2 audio)
2、    microsoft, directx 9.0 programmers reference,2002。
3、    陆其明,directshow开发指南,清华大学出版社,2003
4、    史京玲,刘旺开,白涛.vc环境下监控软件流程图界面的开发.微计算机信息,2004年20卷第4期

  


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客