贾大伟 潘明照
(作者单位:平度市融媒体中心)
数字电视在给人民群众带来高质量的视听节目的同时,也为相关从业者开展增值业务带来可能。数字电视应急信息广播系统是一种可行的应急广播实现方式。其编辑制作端软件的主要作用是制作要播发的应急广播信息,使之适宜于接收端接收、处理和显示。
编辑制作端的主要工作是编辑制作信息发送端所需发送的应急业务信息,主要包括以下几个方面:开机画面附加信息;主菜单、节目指南及节目切换时附加显示的信息;用户调整音量时,音量显示界面附加显示的信息;私有数据信息;游动字幕信息;其他信息,如可用于挂角显示的天气信息和其他适宜于挂角显示的信息。
大部分应急信息是采用图片形式显示的。这些图片本身可使用专用图片制作软件进行制作。如开机画面、主菜单、节目指南、节目切换、音量显示时附加显示的图片等都可由专业制作软件制作完成。编辑制作端将其加密并上传到数据库服务器中,发送端读取相关数据库记录就可以定时播发相应的信息。
私有数据信息是根据今后业务的需要,为实现未来机顶盒端的特定功能而播发的私有数据。本系统可支持这些私有数据的播发而不需要重新开发一套播发软件。私有数据由业务提供者提供,私有数据的发送在发送端也只是将其分段打包,然后转成传送流(Transport Stream, TS)包进行发送。
游动字幕信息是可由本系统制作的信息。
编辑制作端的功能:录入、编辑各类信息,上传信息并存入数据库系统;查询各种历史记录;通知发送端发送紧急信息、重置发送端。
与发送端软件的Win32 控制台应用程序不同,编辑制作端使用图形用户界面(Graphical User Interface,GUI)。具有图形用户界面的Windows 程序依靠外部发生的事件来驱动。程序不断循环以等待可能的输入,然后做适当的处理。当前所有的GUI 系统,几乎都是以消息为基础的事件驱动系统[1-2]。
本系统使用Visual C++开发环境并借助微软基础类库(Microsoft Foundation Classes, MFC)来开发编辑制作端软件。使用MFC 对Win32 应用程序编程接口及相关机制进行封装,以便应用程序的开发。
本系统的编辑制作端主要与数据库打交道,操作的是数据库记录,编辑制作端将制作好的信息输入数据库中,由发送端取出使用,其查询的也是数据库记录,因而编辑制作端软件可以不需要文档支持。同时,编辑制作端的设计也不采用基于对话框的应用程序,因为编辑制作端的应用程序需要菜单、工具栏等的支持,如果采用基于对话框的应用程序则加载菜单、工具栏等比较麻烦,工作量更大。本系统编辑制作端设计的用户界面如图1 所示:
图1 编辑制作端用户界面设计
在该界面中,主窗口左侧为一树型控件;下部为一排命令按钮,用于添加、修改、删除、查询数据库记录。具体操作方法有以下几种:一是使用基于文档/视图结构的单文档界面(Single Document Interface, SDI)框架,在视图中选择CFormView 作为基类。在向导生成的应用程序中删除与文档相关的代码,如文件新建、打开等,这种方式保留文档/视图结构的支持,也就是说有CDocument 类相关的开销。二是不需要文档/视图结构的支持,使用MFC 窗口分割类CSpliterWnd来分割窗口,在向导生成的CMainFrame 类中添加CSpliterWnd 型的变量,在CMainFrame 类的OnCreate函数中添加生成分割窗口的代码。三是采用“Using views effectively without the doc/view overhead”所提出的方法,该方法也不需要文档/视图结构支持,其思路是让MFC Framework 解决由于CFormView 的构造函数和Create 成员函数被封装为私有而难以使用的问题[3]。
此外,系统启动时使用的登录界面(见图2)使得只有授权用户才能使用系统。
图2 登录界面
在下面的论述中将重点关注业务逻辑,毕竟业务功能才是一个应用程序的灵魂。
编辑制作端将需要定时播发的应急业务信息存入数据库,发送端软件通过SQL 数据库查询得到当前要播发的应急信息并进行播发。以MySQL(关系型数据库管理系统)为例,描述本系统使用的数据库的设计[4]。根据发送端软件的要求,主要使用以下数据表:
2.2.1 节目表和分组表
节目表(program)(见表1)提供了节目(以逻辑频道号标识)的TS 流ID 及各种分组标识,即节目切换、音量调整、挂角时的分组标识。分组表(infoprogramgrouping)(见表2)标识了每个分组使用的包ID,为应急业务信息打包时提供包ID 信息。
表1 节目表(program)
表2 分组表(infoprogramgrouping)
节目表和分组表的作用是对不同的节目进行分组,不同的分组可以显示不同的应急业务信息,即数字电视应急信息广播系统中可以同时显示不同的分类信息。使用时可以按节目的类型(如体育类、教育类、文艺类、娱乐类等)进行分类,相似的节目分为同一组。这样的信息发布会更有针对性与灵活性,能同时发布的信息数量也会更多。
2.2.2 信息图片表和信息时间表
信息图片表的作用是保存应急业务信息的相关信息,由于图片数据量较大,本系统不将图片直接存储于数据库中,而是将其单独存放于一个图片目录中。信息图片表(infopicture)(见表3)中的picname保存的是图片在图片目录中的名称。信息时间表(picturetime)(见表4)说明的是图片的组ID 和播发开始与结束的时间等信息。
表3 信息图片表(infopicture)
表4 信息时间表(picturetime)
2.2.3 游动字幕相关表
游动字幕相关表包括游动字幕表(movetitle)(见表5)、游动字幕信息时间表(movetitletime)(见表6)、游动字幕属性表(movetitleproperty)(见表7)。游动字幕的这三个表描述了游动字幕的相关信息。游动字幕表描述了字幕信息内容、字体大小、游动次数等的信息,游动字幕信息时间表规定了播发开始和结束的日期信息。游动字幕属性表指定了字幕的位置信息和每天开始游动播出的时间。
表5 游动字幕表(movetitle)
表6 游动字幕信息时间表(movetitletime)
表7 游动字幕属性表(movetitleproperty)
2.2.4 其他表
除上述数据库表外,还有挂角信息表、操作员表等数据库表。挂角信息表包括挂角位置信息表(logoposition)、挂角时段表(logogroupperiodoftime)两个表。挂角位置指出了挂角的位置,挂角时段表表明了挂角的时间段信息。操作员表则描述了能够操作系统的相关人员的口令等信息,能够约束登录系统的人员。
有了这些基础表之后,就可以在这些基础表上形成便于处理的数据库视图。视图是一个内容由查询定义的虚拟表。视图具有简单性、安全性等多种优点,但使用上也有一些限制。
Visual C++提供了多种数据库访问技术,常见的有开放数据库连接(Open DataBase Connectivity, ODBC)、数据库访问对象(Data Access Object, DAO)、ActiveX数据对象(ActiveX Data Objects, ADO)等。本系统编辑制作端采用Visual C++的ADO 进行编程,将播发的信息存入数据库中。ADO 具有强大的数据处理功能,它提供了十分简单、易用的编程接口,是Windows 环境中比较常用的数据库编程技术。
在使用ADO 进行编程时,首先需要引入ADO 类,并初始化COM,然后就可以使用_ConnectionPtr、_RecordsetPtr 和_CommandPtr 三个智能指针了。为了更易于使用,封装前两个智能指针的操作为CADOConnection和CADORecordSet 类。 为进一步简化操作, 让CADORecordSet 类继承自CADORecordBinding,使得RecordSet 记录集中的字段可以绑定到C/C++变量中。
使用数据库时首先要连接数据库,使用连接字符串与指定数据库进行连接,连接时须提供用户名和密码。我们在CInfoeditApp 类(CWinApp 的派生类)中添加一个CADOConnection 型的变量MyConnection,在CDlgLogin 类中有这个变量的一个引用,本系统启动时会打开一个CDlgLogin 类的对话框,提示用户输入用户名和密码,系统由此连接到指定数据库。若用户名和密码组合输入错误,就会导致连接失败,若失败的输入次数超过三次,则会退出系统。
编辑制作端软件除与数据库通信外,还需要直接与发送端进行通信,所以需要使用Socket 编程。本系统编辑制作端与发送端的通信采用传输控制协议(Transmission Control Protocol, TCP)。TCP 通信分服务器端和客户端,服务器端程序不能主动连接客户端,在通信时必须先由客户端去连接服务器端才能实现通信。服务器端程序要先启动,等待客户端的连接。其中,客户端程序的基本操作过程为:socket,创建套接字;connect,连接服务器,向服务器端程序发出连接请求;与服务器端进行通信收发数据rend/recv;关闭套接字[5]。同时,针对客户端生成CMyClientSocket 类,其主要函数为OpenConnection、SendData、ReceiveData 等。
图片信息的编辑在CDlgPicInfoEdit 类中完成,CDlgPicInfoEdit 类继承于CDialog。首先,在其中打开文件对话框,选择已经制作好的要播出的图片,系统会检查图片的宽度、高度、每像素位数、图像数目(如gif 图片可包含多幅图片)等信息,并检查其格式是否为接收端软件支持的格式。若图像宽高不是建议的宽高时,给出警告信息及建议的宽度、高度等信息。如果是合法的图片,将在m_Picture 静态控件中进行预览,模拟演示其在电视上的接收显示效果;如果是合法的多幅图片格式,则会启动一个多媒体定时器,模拟演示其动画效果。其次,添加分组信息,并指定图片在此分组的播出时间。本系统对同一图片可以添加多个分组,不同的分组在同一时间段内也可以显示不同的(信息)图片。分组的使用扩展了同一时间系统能够显示的信息量。添加时间信息时可以直接指定开始时间和结束时间,也可以指定开始时间和播出天数。最后,点击“确定”按钮添加数据库记录。在添加数据库记录前需要先把图片文件上传到发送端(或者数据库服务器)。上传文件使用CMyClientSocket 类,连接成功后,通过SendData传输加密后的图片数据。上传文件时,需先把加密后的图片内容读入缓冲区,分多次发送到接收端,如每次上传8 000 字节,所有内容全部上传无误后,即可添加此记录。
2.6.1 游动字幕制作
不同于其他信息的制作,本系统编辑制作端使用单独的一个类来进行游动字幕信息的制作。其编辑界面如图3 所示:
图3 游动字幕编辑界面
游动字幕信息的制作采用以下三种方式:一是纯文本文件,即编辑制作端只提供要显示文本及其字体大小、颜色等属性,其显示由接收端完成,接收端软件根据接收到文本及字体大小、颜色等属性生成字幕进行显示。二是使用图片文件的方式,将字幕制作成图片,并指定一种透明色(可为任意一种字幕本身不使用的颜色,可指定为黑色或纯蓝色)。三是生成alpha 文件,这也是本系统推荐的方式。由于成本的限制,接收端的数字电视机顶盒配置不是很高,大多数的数字电视机顶盒只配置了点阵字库而没有矢量字库,因此显示效果较差,采用生成alpha 文件的方式能够有效弥补这一不足。该方式可以根据文本信息生成相应的alpha 通道信息,alpha 通道可用来记录图像中的透明度信息,从而定义图像中的透明、半透明和不透明区域,用8 位的灰度图像就可保留字幕信息。alpha 通道叠加各种不同颜色信息后可生成丰富多彩的字幕图像。在添加、修改数据时,同样需要先将图片文件上传。
2.6.2 游动字幕演示
模拟演示游动字幕的效果在定时器回调函数FortyMilliSecondProc1 中实现。与普通显示函数不同的是,这里的显示要模拟背景图层和当前图层之间带透明色的叠加,需要使用TransparentBlt 之类的函数来实现。本系统使用的是多媒体定时器,定时器的定时间隔设定为40 ms。多媒体定时器使用多线程编程方式,开辟一个独立线程执行定时器回调函数,定时精度较高。这种定时器在安装时要先调用timeGetDevCaps 函数来明确定时器服务支持的最小和最大定时器分辨率,然后调用timeBeginPeriod设置系统支持的最小分辨率,最后产生周期执行的定时器事件,启动定时器。在回调函数FortyMilliSecondProc1 中,要根据当前字幕在显示框中的位置,创建与背景静态图片框兼容的内存DC。在内存DC 中完成背景图像与字幕图像的混合,最后将(已经混合好的)内存DC 中的图像BitBlt(块拷贝)到背景静态图片的字幕显示框中。
数字电视应急信息广播系统编辑制作端是一个带有用户界面的应用程序。编辑制作端的业务逻辑本身并不复杂,但涉及用户界面编程、数据库编程、网络编程等各个方面,所以开发此类应用程序需要熟悉用户界面、数据库、网络等方面的知识。本文探讨了编辑制作端应急信息的制作、上传,介绍了游动字幕信息的演示,达到了“所见即所得”的效果。该系统的实际运行结果表明,系统运行稳定、可靠,达到了设计要求。