APP下载

基于DirectShow的多节目片段序列的无缝播放系统设计与实现

2018-02-26田六方徐州电视台

视听界(广播电视技术) 2018年1期
关键词:节目单无缝字幕

田六方 徐州电视台

0. 引言

在LED大屏播放零散节目的过程中,常常会在节目与节目切换时出现短暂的黑屏,这是由于解码器解码不连续引起的[1]。特别是在进行广告插播时,节目的不断切换,产生不断的黑屏和闪烁,将严重影响LED大屏的视觉效果。基于这种情况,就要对零散的节目流进行无缝拼接,其顺序应满足当天播放序列的要求。电视节目的拼接[2]技术是指从某一路电视信号源瞬间切换到另一路电视信号源,在电视屏幕上表现为一个画面迅速转换到另一个画面,无黑场、无抖动、无停顿的连续过程。

自从多媒体问世以来,多媒体的开发工具也应运而生。DirectShow 技术是微软公司开发的一套编程接口,架构在DirectX 等其他的一些多媒体服务的基础上[3]。DirectShow作为高效的多媒体开发系统,其底层的硬件设备与高层的应用程序互相影响、作用,图1是DirectShow系统的框图[4]。

图1 Direct Show系统框图

Direct Show使用Filter Graph模型来管理整个数据流的处理过程。Filter Graph中包含了各种Filter,各个Filter在Filter Graph Manager的统一控制下,按一定顺序连接在一起,从而使数据在由Filter组成的链表中流动[5],图1中的箭头表示Filter链表中的数据流的方向。在Direct Show系统框架外,是与用户直接交互的应用程序。应用程序要按照一定的功能建立起相应的Filter Graph,然后通过Filter Graph Manager来控制系统的数据处理过程。DirectShow能在Filter Graph运行时接收到各种事件,并通过消息的方式发送给应用程序。这样,就实现了应用程序与DirectShow系统之间的交互[6]。

1. 程序框架设计

为了统一对静态图片和视频图片进行相同的处理,针对播放的FilterGraph进行了统一封装,为此定义了如图2的类继承关系。

1.1 CPlayItem

CPlayItem类为系统中播放单元的基础类,主要内容包括构建FilterGraph的虚函数InitGraph()和播放虚函数PlayIt();这些虚函数必须在继承类中进行实现。其主要结构如表1所示:

图2 播放对象各类之间的继承关系

表 1 CPlayItem 成员

其中InitGraph()函数在程序加载播放序列时根据播放文件类型构建相应的FilterGraph;PlayIt()在合适的适合播放本对象,并根据字幕信息和播放时间控制来确定文件的起播点和播放长度。SetPositions()函数设置该FilterGraph的播放控制。

1.2 CPlayPic

CPlayPic实现播放静态图片时的行为,包括渲染字幕和时长控制等。由于播放静态图片不需要创建Filter Graph,所以其初始化函数仅仅只需直接返回即可,CPlayPic:InitGraph() 实现见表 2。

表 2 CPlayPic:InitGraph() 实现

在播放静态图片时,由于需要动态显示字幕和时钟等随时间改变的图像元素,所以其播放过程被实现为一个线程,CPlayPic:PlayIt()实现见表 3。

表 3 CPlayPic:PlayIt()实现

在线程InitialThreadProc_Play中的每一个循环均按顺序做如下过程,播放静态图片的一个循环动作见表4。

表4 播放静态图片的一个循环动作

1.3 CPlayAVI

CPlayAVI实现对视频片段的FilterGraph的构建和播放过程的控制。为此,该类中添加了一系列处理FilterGraph的类成员,如表5所示。

表5 CPlayAVI中与视频播放相关的类成员

其中初始化FilterGraph的过程中加入拦截解码后图片数据流的Filter,目的是对视频中的每一帧图片进行处理,包括添加字幕和时钟等。其中CPlayAVI:InitGraph()的实现基本如表 6 所示。

表 6 CPlayAVI:InitGraph()的创建 FilterGraph 主要流程

Graph在播放的过程中,每帧图像在解码完毕后,都会调用CSampleGrabberCB_TXT类的BufferCB(double SampleTime, BYTE ⋆ pBuffer, long BufferSize )函数,在此函数内,进行类似表4的相同过程。

2. 多线程无缝播放

为了实现各节目片段之间的无缝连接,程序在初始化节目单时,将节目单中的所有播放文件按照播放顺序创建播放列表,表7是加载节目单时创建播放列表代码片段。

表7 加载节目单时创建播放列表

当一个节目对象播放完毕时,主线程会收到一个事件,此时立刻进行下一个播放对象的播放。由于此对象的Graph已经在初始化时渲染就位,所以播放图像立刻出现在屏幕上,不会出现黑屏的现象。播放下一个对象的事件相应如表8所示。

LRESULT CPlayVedioDlg:OnGNotify(WPARAM w,LPARAM iScreenID){int ino =GetNextMedia(iScreenID); //下一个要播放

的播放对象序号saPalylist[ino]->PlayIt(); //播放下一个对象}

3.结束语

本系统采用VC++语言,在DirectShow框架基础上进行开发。使用多线程进行各个节目片段的缓冲播放,实现了各相邻节目片段之间的无缝播放。本系统的主要目的是为了方便多个LED大屏的节目在组织管理时的灵活性。目前该系统已在镇江广电的多个大屏上使用,效果良好,播放顺畅。能够实现每个节目、台标、时钟和字母的自由组合,如图3所示,基本达到了设计目标。

图3 本系统实现了台标(左上)、字幕和时钟(右上)的自由组合

1.谭建国, 张文军. 数字HDTVTS流无缝拼接技术研究 [J]. 通信学报 ,2004,25(5):119-124.

2. 郭淑艳. 数字电视TS流实时低延迟无缝拼接技术的研究与实现[D]. 广东: 华南师范大学. 2007.

3. 赵炯, 陈力. 利用VC++实现基于DirectShow的视频播放器开发[J]. 成都大学学报(自然科学版 ),2011,30(4):349-352.

4. 孟月华, 邓基. Direct Show技术的应用研究与开发[J]. 计算机系统应用 , 2013,22(6):196-199.

5.谢屈波,王六森,夏定纯. 基于Direct Show的图像采集的实现[J].软件导刊,2010,9(6):183-184.

6. 郭昊. 基于DirectShow技术实现视频采集[J]. 火控雷达技术 , 2008, 37(2):97-100.

猜你喜欢

节目单无缝字幕
让农民工培训与就业“无缝对接”
母乳到辅食,如何无缝衔接
幽你一默
“无缝对接”打开国地税合作新局面
到底谁先唱
AS SMOOTH AS YOU LIKE – HELPING YOU MAKE TRANSFERS SEAMLESSLY
一种基于单片机16×32点阵动态字幕的设计
整合适应选择度下的动画电影字幕翻译——以《冰河世纪》的字幕汉译为例
论纪录片的字幕翻译策略
字幕翻译中非言语信息的言语转换——以《BJ单身日记》字幕翻译为例