一. 引言
随着电视数字化进程的不断加快,计算机硬件及其相关软件在广播电视行业中的应用越来越广泛。字幕提示器在现代节目的制作和安全播出中的发挥着不可或缺的作用,大部分的节目包括新闻、专题等等都离不开它的使用,它的应用大大地提升了节目制作效率。现阶段的各类提示器在硬件上大相径庭,唯独在软件方面存在差异。我台购买的提示器设备已使用5年多的时间了,在使用过程中发现它有一些不够完美的地方,如:不能及时对文本进行修改,而且操作繁琐;播放时出现文字乱码;播放不稳定,画面跳跃较大等等问题。后就此类问题与厂家联系得知,他们有新的软件已经开发出来并解决了老版本存在的一些缺陷。不过,我们如果要使用新的软件,就必须再投入一笔数额较大的资金。为了使软件更便于操作、更好地适应我台实际工作的需要同时也能为单位节省成本,我们在配合现有硬件的基础上自主研发了NewsMagic字幕提示器软件。
二. 软件特点
NewsMagic本身只有50K大小,提供的各种操作方便快捷,人机对话界面简洁明朗。在设计过程中,我们采用了多种优化方法。这些方法包括有:文字编码技术、文档自动排版技术、文档精确定位技术、双缓存显示技术、精确定时技术、CPU及内存优化分配使用技术等等。经过优化后的提示器软件,大大地降低了计算机资源的占用率。例如:在编辑状态下,该软件对计算机资源的占用率就等同于使用Windows记事本;在播放状态下,虽然计算机配置的不同、文字数量的多少都会改变资源的占用率,但是不超过一千个字符数(约27M内存)这个范围内。这些优化方法保证了NewsMagic在使用时得到快的操作反映速度,平稳流畅的播放画面,并且完全不会出现文字乱码现象。另外,为了适应实际工作需要,操作起来更为人性化,控制部分除了可以用鼠标、键盘来操作外,还可以配置各类无线遥控器来控制使用。
三. 便捷的操作使用介绍
NewsMagic具有任意设置播放时的滚屏速度功能、设置播放时的文字大小/字体等属性功能、设置播放时行间距功能,在播放时能快速准确翻页功能。软件可以导入txt文本文档并将其显示在文字显示区内,而且能随时在文字显示区里进行编辑、修改、保存为txt文本文档,也可以直接在文字显示区内输入新的文字然后播放。
软件的人机界面简单明了,相应的功能操作都很方便快捷,点击:新建、打开、保存、另存为功能按钮就可以直接对txt文本文档进行操作。
文本文档的编辑提供了剪切、复制、粘贴功能,提高了编辑效率。点击“播放”按钮即可进行滚屏播放。 播放时的字体、行间距等属性直接在界面上点击相应的功能按钮就可以设置修改。在进行滚屏播放时,控制操作也很简单;遥控器以及键盘操作:按相应的按钮即可实现功能;鼠标操作:点击左键可以在播放和暂停状态间切换,点击右键可以在正常显示和镜像显示状态间切换,鼠标滚轮在播放状态时提供变换速度功能、在暂停状态时提供准确翻页功能。
四. 对程序效率影响的关键技术
一个程序的设计要考虑到运行稳定、功能强大又要考虑到尽可能地减少计算机资源的占用,因此我们在设计时尝试了各种不同的处理方法,减少了许多不必要的运算过程,大大提高了程序运行效率。下面是对程序运行效率影响最大的关键技术进行阐述。
1.文字处理
NewsMagic在创建的时候完全采用UNICODE编码。因为,文本文档在windows操作系统中默认是ANSI编码方式,每个ANSI字符占用1个字节即8bit,8bit的ANSI编码只能表示256种字符,表示26个英文字母是绰绰有余,但是表示汉字、韩国语、日语等有着成千上万个字符的非西方字符肯定就不够了,所以如果采用ANSI编码,在使用过程中会因为某些汉字无法识别而出现乱码现象。而UNICODE是目前一种用来解决ASCII码256个字符限制问题的比较流行的解决方案,通过用双字节来表示一个字符,从而在更大范围内将数字代码映射到多种语言的字符集。使用UNICODE编码可以很容易地在不同语言之间进行数据交换,很好地分配支持所有语言的单个二进制.exe文件或DLL文件,而且能提高应用程序的运行效率。我台现阶段使用的软件时常出现一些文字乱码现象,估计是他们使用了ANSI编码,或者他们将文本文档字符编码转换成自己设定的编码方式时有一些漏洞。采用了UNICODE编码后,软件在使用过程中从未出现过文字无法正确显示的现象。
2.显示处理
关于文字的滚屏功能,目前没有什么函数或工具能直接实现,所以我们采用一种模拟运动方法来模拟文字的滚屏效果。具体做法就是把所有的文字先画在一张很长的图上面,播放时就一部分一部分显示这幅图,利用人眼的视觉暂留效应,短时间间隔刷新显示图像,运行时感觉就像文字在滚动一样。在编写程序时,考虑到播放时全屏显示,在短时间内要更新一副图,普通的图像显示方法在播放时会出现屏幕闪烁现象。因为我们的绘图过程大多放在OnDraw或者OnPaint函数中,OnDraw在进行屏幕显示时是由OnPaint进行调用的。当窗口由于任何原因需要重绘时,总是先用背景色将显示区清除,然后才调用OnPaint,而背景色往往与绘图内容反差很大,这样在短时间内背景色与显示图形的交替出现,使得显示窗口看起来在闪。如果将背景刷设置成NULL(即不要背景),那么这样无论怎样重绘图形都不会闪了。当然,这样做会使得窗口的显示乱成一团,因为重绘时没有背景色对原来绘制的图形进行清除,而又叠加上了新的图形。有的人会说,闪烁是因为绘图的速度太慢或者显示的图形太复杂造成的,其实这样说并不对,绘图的显示速度对闪烁的影响不是根本性的。于是我们采用了双缓存显示技术。所谓双缓存显示技术就是在内存中创建一个与显示动画的窗口区域一样大的位图,先用GDI函数绘制位图,然后再将要求大小的图形按照一个点一个点地覆盖到屏幕上去。这样在内存中绘图时,随便用什么反差大的背景色进行清除都不会闪,因为是覆盖当前的画面而不是在当前画面上面继续画图,从而实现平滑动画;并且,图形是从内存中直接显示到当前窗体,所以速度很快,从而实现高速动画。同时,为了提高程序的运行效率,我们不要计算机去绘制背景了。
字幕提示器物理结构是在摄像机下面放置一个显示器,在镜头前加装一面涂了特定膜的反光玻璃,将显示器的画面反射到镜面上来。这样,要在玻璃面上正常显示字幕,就要求在显示器上镜像显示字幕。于是,我们在内存中画图的时候就要画两张图,一张正面显示的,一张反面显示的,正面显示用来给编辑人员观看使用,反面显示用来给主持人观看使用。
但在内存中画图就出现了一个问题,将文字按照指定的字体和大小并根据当前屏幕的分辨率自动换行后生成的图片非常大。一般播出时是一行8个文字,一屏有7行,那么一千个字的文稿生成的图片就有18面屏幕大小,如果按屏幕1024×768分辨率来计算,一个点由4位来表示,那么这副生成的图片就有1024×768×4×18/1024/1024=54M。再加上生成大小一样的两副图,于是最后生成的图片就有54×2=108M。这样下来,软件使用就非常耗资源,短短一千个文字就占据了一百多兆的内存,我们现有的字幕提示器主机配置如下:CPU-P42.0,内存:256M,显存:128M。如果这样编写软件,在目前这种电脑配置情况下无法使用。所以,在内存画图时要使用图像压缩技术。对位图采用BIRL4的压缩方法后,一千个文字生成的图片只有13.5M,正反两张共27M,大大减小了资源的占用率。
使用双缓存技术后图像不闪烁了,但是要让图像滚屏就必须引入一个概念:定时器。使用定时器就能让计算机在设定的时间间隔内刷新一副图像,同时每次显示时,图片的显示位置稍微变动一下,图像就滚屏起来。最初我们使用windows开发最常用的SetTimer()函数,但在运行过程中发现,图像滚屏速度不均匀,有时快点有时慢点,整体感觉图像在抖动。经研究发现原来windows提供的这个timer定时器精度不准确,误差比较大,设定为10ms,实际运行过程中会改变为20ms或者30ms等等,导致了滚屏速度不均匀。为了能使图像平稳滚动,一定要使用一个效率高并且定时精度也很高的定时器。微软公司在其多媒体Windows中提供了精确定时器的底层API支持,即多媒体定时器。利用多媒体定时器可以很精确地读出系统的当前时间,并且能在非常精确的时间间隔内(精确到1ms)完成一个事件、函数或过程的调用。利用多媒体定时器的基本功能,可以通过两种方法实现精确定时。(1)使用timeGetTime()函数,该函数定时精度为ms级,返回从Windows启动开始所经过的时间。由于使用该函数是通过查询的方式进行定时控制的,所以,应该建立定时循环来进行定时事件的控制。(2)使用timeSetEvent()函数,利用该函数可以实现周期性的函数调用。
五. 结论
经过一段时间的测试应用,NewsMagic没有出现:死机、自动关闭、逻辑错误等异常现象,现已经正式在我台投入使用。在使用过程中,得到了节目人员和主