提词器原理分析和技术实现.docx
- 文档编号:14454149
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:28
- 大小:563.21KB
提词器原理分析和技术实现.docx
《提词器原理分析和技术实现.docx》由会员分享,可在线阅读,更多相关《提词器原理分析和技术实现.docx(28页珍藏版)》请在冰点文库上搜索。
提词器原理分析和技术实现
播音提词器的原理分析和技术实现
1.提词器应用概述
我开发的一个产品想实现很多显示设备的同屏显示效果,查阅资料的时候发现播音提词器也是其应用之一,那就顺便一起研究了吧。
笔者很长时间没有开发程序了,错误的地方请广大码友多多批评指正。
电视提词器是常用于电视播音、采访工作中的专用设备。
其使用场景是播音员在播音的时候,需要正视前方,流畅说出待播内容。
由于播音具有不确定性,播音员很难准确记住整片文件,因此需要借助外部协助。
外部协助包括语音导播和图像导播:
语音导播是指导播人员在幕后手持文稿阅读,声音传输到播音员所用的耳机,播音员根据导读声音播出。
图像导播:
是指在播音员前方防止较大屏幕的显示屏,用于显示待播文稿,文稿调整显示内容,播音员阅读内容。
语音导播和图像导播各有弊端,语音导播受人为影响较大,例如导播要控制播音进度,并且导播的时候不能出现意外状况(打喷嚏、注意力不集中等),图像导播往往需要借助多种设备,成本较高。
高质量图形设备层出不穷,为了确保播出质量,图形提词器应用越来越广泛。
因此导播系统虽然看似简单,但是如果要实现高质量的导播效果,需要精心设计。
本文主要讨论图像方式的导播,通过需求和技术分析,提供新技术广泛应用下的最优解决思路。
2.图像提词器发展情况
图像提词器发展经历了三个阶段:
模拟信号提词器、计算机信号提词器和网络提词器。
2.1模拟信号提词器
模拟信号提词器是最早的图像提词器技术,其原理是播音员前方放置待播纸质文稿,文稿正上方置摄像仪器,仪器所拍信号通过线路传输到播音员正前方约5米的显示屏,显示屏所显示的为镜像图像,需要经过一个45°的反光玻璃纠正,从而看到正像,播音员阅读正像图片播出。
其示意图如下:
图像在上述环境中显示的图像如下:
播音员阅读反向文字非常吃力,需要模拟信号显示器进行像素偏转处理
现镜像显示其实很简单,只需要对显示器电路作简单的修改,将显像管的行偏转线圈两个接线头调换一下,即可实现图像的镜像显示。
这种方案有如下特点:
1、播放进度掌控在播音员手中,控制自如;
2、原理简单,几乎全部基于硬件设备,线路清晰;
3、硬件刷新率较高,但是图像增强显示,容易对播音员眼部造成伤害;
4、播音的时候,播音员手部需要换搞,动作需要雅观;
5、播音的时候需要较大屏幕,对焦比较麻烦;
6、造价较高;
2.2计算机信号提词器
随着计算机办公普及,电视文稿产生、传输实现了无纸化,使用针对电子文档的提词器是大势所趋,模拟信号提词器也逐步由模拟信号提词器发展成计算机提词器,播音员只需要通过鼠标或控制器就可以灵活控制文稿的显示。
同时由于显示技术的发展和对提词器轻量化和移动性,便携性的要求,传统的CRT提词器已经逐渐被淘汰,转而大量使用液晶显示器做为显示单元。
新型电脑提词器的组成如下图所示:
液晶显示器不再具有偏转线圈扫描单元,市售的液晶显示器也都无法通过简单地修改电路实现图像的镜像显示。
目前实现液晶显示器提词的方法基本有两种:
一种方法是使用专用的硬件VGA镜像发生设备器,实现显示器信号的镜向输出,但这种设备基于硬件,成本高,一旦损坏,将难以及时修复。
第二种方法是使用双显卡或双头显卡,利用软件实现副显卡与主显卡显示内容的镜向,实现方法是使用专用软件辅以一种专用的镜像显示字库并通过改变文字的显示顺序来实现文字的镜向显示。
目前市面基于这种方案的提词器具有如下特点:
1、使用通用的计算机硬件,维修更新方便,成本低
2、必须使用专用软件,文稿兼容性差,不能兼容常见的WORD,WPS,PDF等文稿格式;
3、更无法实现图文同时显示;
4、使用专用字库,仅能实现中文或英文提词,无法实现中英文混合显示;
5、少数民族等需要纵向显示的文稿,播音台无法正常使用;
为解决上述两种方案的弊病,需要设计出一种使用通用硬件,同时又能直接支持各种软件的提词器系统。
第二套方案的硬件设计具有很强的通用性,目前主流PC均可安装双显卡或单片双头显卡,普通显卡由于是民用产品,价格便宜,来源广泛,数百元即可购得,因此这将是一种极为廉价的高可靠性电脑提词器信号输出方案,值得采用,因此提词器系统硬件部分应该选用这种方法。
关键的难点在于如何用软件实现副显示器对主显示器的镜像滚屏输出,同时又要兼容众多的文档格式。
事实上,各种文档格式都有成熟的软件可以打开,并可以在鼠标控制下实现自动滚屏和手动滚屏,例如MicrosoftWord,只要打开文档后,点击鼠标滚轮键,即可控制滚屏速度和方向,同时显示字号、字体的大小均可任意调节。
因此,多文档格式滚屏的实现,完全可以利用各类文稿软件自身的功能来实现。
问题就简化为如何将主显示卡上显示的内容实时地水平镜像复制到副显示器上。
本文重点讲述如何利用简易设备,采用合理的软件技术,解决上述弊端,实现高质量的屏幕镜像复制效果。
2.3网络提词器
随着互联网直播台、现场录播、讨论式播出的不断流行,需要播音软件具有更复杂的、控制功能,实现多人播出,并在播出的时候插稿、临时修改播音词、合理引导播出等。
网络提词器方案一般是根据计算机提词器的第二套方案,对提词器的内容同步、显示控制等进行功能改进,实际上是软件提供了更加复杂的网络控制功能。
网络提词器的原理如下图所示:
上图所示播音员的的计算机仍是核心,播音员可以操控播音计算机的播放进度,而编辑员计算机通过软件获取播音员当前的播出内容,并进行编辑,完毕后将新内容同步到播音员计算机,达到插播效果。
上述方案中,编辑员获取播音员当前播出内容和编辑非常容易,难点在于在播音员正常录播的情况下如何实现屏幕加载。
网络软件技术要求高,而且需要安全操作,因此软件造价相对较高,但是其强大的功能对于大型播音台非常适用。
3.计算机和网络提词器需求分析
通过对提词器的发展分析,可以看出目前市场对提词器的需求大致如下:
3.1文稿引入
文稿引入是指提词器软件应具备自建内容和从外部获取内容的能力。
由于提词器的展示样式是其运行前可以设置的,因此软件所管理的内容应当是文本内容,文稿引入要求可以打开常用格式的稿件,并提取其文本内容。
常用的文稿样式有TXT、MicrosoftWord、WPS、PDF、HTML等。
自建文稿是指用户可以在软件新建一篇文稿,由于软件管理文本内容,因此建议新建文稿的格式为TXT文档。
3.2二次编辑
二次编辑是指播音人员在播音前的阅稿过程中如果发现稿件有错误或已经装入的稿件需要临时调整,可以通过软件及时调整,不影响播出。
3.3题词效果设置
播音的时候,需要对题词文本进行展示样式的设置和字幕展示方式设置,以达到最好的提示效果。
样式的设置包括对字体、字号、文字颜色、文字背景颜色、行间距、字间距、段落间距等;字幕展示方式是指对不同的播音习惯进行文字横排和纵排展示,横向滚动和纵向滚动展示,文字排版方向和字幕滚动方向互相配合使用,一般当字幕自下向上纵向滚动的时候文字横向自上向下排版,字幕自上向下滚动的时候文字自下向上排版,字幕自左向右滚动的时候文字自右向左排版,字幕自左向右排版的时候文字自左向右排版。
以下列出部分效果示意:
横向字幕水平镜像的示意效果
横向字幕垂直镜像的示意效果
横向字幕的自上向下滚动示意效果
纵向字幕的水平镜像效果示意
纵向字幕的垂直镜像效果示意
3.4镜像
支持两个显示器镜像显示,包括屏幕复制、水平镜像和垂直镜像。
3.5进度控制
进度控制是指字幕在运行过程中,应当可以展示出字幕开始的时间、已经运行的时间、剩余时间、进度百分比等信息,便于播音员了解当前进度情况。
播音员可以根据当前进度情况使用多种方式进行进度调整,包括可以鼠标滚轮、游戏手柄、脚踏开关等调整滚动速度和当前进度,并可以随时控制暂停、回复滚动等操作。
3.6插播
插播是指字幕已经装载内容并且正在滚动的时候,其它程序可以增加、删除正要播出的内容,并将最新的内容更新到正在播放的屏幕,更新的时候屏幕不会闪烁。
3.7语言
播音软件要应对不同语种的播音需要,例如英语、汉语、日语、韩语、哈萨克等等,要求软件界面、提示信息和字幕内容支持多语种,便于播音员顺利操作软件和播音。
4.技术实现方法
了解上述需求后,可以想象最好的实现效果好比玩游戏一样,在进行内容的检查后进行样式设定,然后开始执行字幕,执行过程中播音员就像游戏中的线路跑动一样,调整跑动速度,如果已经连接了扩展显示器,扩展显示器可以随时镜像显示。
实现上述效果看似简单,要达到游戏效果绝非易事,有很多难点:
✓字幕排版灵活,如对较大篇幅的文字根据设置进行横向和纵向排版;
✓镜像屏幕需要恒定的速度,而在Windows操作系统下很难得到;
✓字幕滚动过程中持续占用处理器资源,避免字幕滚动过程中出现闪烁;
✓支持更多的外部驱动,包括游戏手柄等;
笔者访查市面上绝大多数提词器,其使用的技术分为以下几种:
方案1:
创建两个窗口,一个全屏运行在主屏幕,另一个全屏运行在副屏幕。
主屏幕运行正像显示的字幕,副屏幕镜像显示主屏幕的内容。
主屏幕字幕排版采用文本控件实现,然后将文本控件图像贴图到副屏幕,建立一个定时器,定时调整文本控件滚动条的位置,并将所产生的最新图像贴图到副屏幕的窗口。
在实现的时候有很多问题要考虑,例如大文件的快速装载,文本控件的滚动条隐藏等,需要主屏幕的软件隐藏文本控件,并将文本控件的显示图像拷贝出来,根据当前位置粘贴到预置好的3个图片框。
该方法使用VB或者VC开发比较适合,VB开发技术门槛低,比较适合工具类软件开发,同时可以调用WindowsAPI实现强大的功能,并且具有很高的运行效率,当然如果做到更优秀的功能,需要采用VC,VC在文本处理、图像处理、硬件控制等方面都具有非常优秀的能力,但是VC开发往往需要更高的成本。
方案2:
同样是创建两个窗口,文字排版依靠系统API函数,API函数根据设置的效果将文字打印在主窗口屏幕,主窗口屏幕打印完毕后,将主窗口所有内容镜像显示到扩展屏幕的窗口。
该方案的排版功能很难实现,例如绘制某一时刻的字幕效果,需要先知道整体高度,当前运行的位置,下一刻速度等。
方案3:
如同方案2,不同的是副屏幕不再是镜像显示主屏幕的图像,而是文字依靠可镜像的字体,直接镜像显示。
其优点是运行效率比方案2高一些,缺点是对字体的控制相当麻烦,投入非常大而收获很小,只能使用很少量的字体。
以上方案有很多缺陷:
1.方案1和方案2依靠全屏贴图实现屏幕镜像,肉眼的舒适切换频率在100毫秒,而双屏整屏幕绘制(StretchBlt),往往会超出(目前市场的中配显示器,整平刷新需要40-70毫秒,如果加上软件处理的损耗,往往会达到120毫秒以上),顿挫感很强;
2.较大文件的字幕需要动态将文字转化为图片,如果要实现无刷新效果,必须使用内存双缓冲绘图技术,该技术比较复杂,即使使用了该技术,若使用了较低配置的显示器或主机,仍无法达到效果;
3.实现纵向字幕是非常艰巨的工程;
4.若要实现多角色播音(加背景颜色),性能会大幅降低;
5.Timer控件有很多缺陷,其主要作用是定时触发,如果处理时间超出timer的设定频率,屏幕滚动时快时慢,影响播出;
6.主屏幕和扩展屏幕尺寸不一致的时候,即放大和缩小显示,出现排版混乱;
为了解决上述问题,笔者决定尝试采用较新的技术:
使用C#开发,运行在Windows7+IE10及以上版本。
为什么必须要采用C#开发呢?
因为C#运行在.netCLR上面,已经提供了性能较好的绘图技术,而且获取外部文档的技术相对简单,而运行在IE10是因为IE10的超文本渲染效果是最好的,滑动非常细腻,而且支持超大文件,而且我想使用CSS3实现部分排版功能。
总之IE的技术投入是非常大的,人家是超文本展示的高手,仔细发掘肯定能满足我们的需求。
众所周知,现在的笔记本通常是Windows7操作系统,IE10通常运行在Windows7上,笔记本通常可以直接连另一个扩展屏幕,无需额外的硬件投入。
当然如果要运行更流畅,建议扩展显示器采用刷新率较高的,而且内存4G以上,CPU2GHZ以上,现在主流笔记本都可以达到。
说了这么多,该技术环节登场,针对需求,列出主要实现办法。
本文的代码主要是测试代码,有些是从往上拷来的,是我都运行过,是可用的。
4.1打开外部文件并提取文本
打开外部文本包括提取Word、WPS、PDF的文本内容,按照原有的段落组织。
C#获取Word内容需要引用MicrosoftWord12.0ObjectLibrary类库,实现方法如下:
Word.ApplicationClasswordApp=newApplicationClass();
object表示Word的路径
objectnullobj=System.Reflection.Missing.Value;
Word.Documentdoc=wordApp.Documents.Open(5.reffile,refnullobj,refnullobj,refnullobj,refnullobj,refnullobj,refnullobj,refnullobj,refnullobj,refnullobj,refnullobj,refnullobj);
doc.ActiveWindow.Selection.WholeStory();
doc.ActiveWindow.Selection.Copy();
IDataObjectdata=Clipboard.GetDataObject();
Stringdoctext=data.GetData(DataFormats.Text).ToString();
doc.Close();
打开WPS文档的代码如下:
object WpsApp;
object[] args = new object[1];
Type wpsAppName;
string progID = "Wps.Application";
wpsAppName = Type.GetTypeFromProgID(progID);
//创建一个WPS实例
WpsApp = Activator.CreateInstance(wpsAppName);
args[0] = true;
//设置为可见
wpsAppName.InvokeMember("Visible", BindingFlags.SetProperty, null, WpsApp, args);
//得到Documents对象
Object wpsDocs = wpsAppName.InvokeMember("Documents", BindingFlags.GetProperty, null, WpsApp, null);
//设置关键参数即可,例如:
在打开的方法中,只要指定打开的文件名与是否可见
args = new object[15];
args[0] = @"C:
/Demo.wps";
args[11] = true;
//打开C盘下的Demo.wps
Object wpsDoc = wpsAppName.InvokeMember("Open", BindingFlags.InvokeMethod, null, wpsDocs, args);
args = new object[3];
//下面就可以从doc对象获取文本了
打开pdf请注意,pdf分为单层pdf和双层pdf,单层pdf是由图片组成的每一页,双层pdf是每一页的图片上面覆盖有文字,软件只能打开双层pdf,实际是读取所覆盖的文字部分,如果想从图片获取文字,只能用OCR技术了,对这个软件来说没有必要。
打开双层pdf的代码如下:
添加一个iTextSharp的引用,iTextSharp是一个开源的PDF操作类库。
stringxieyi="";
fi=new();
StreamReadersr=fi.OpenText();
xieyi=sr.ReadToEnd();
sr.Close();
returnxieyi;
文本读取以后要写入到一个新的txt文件里面,以备后面编辑的时候用。
4.2展示、编辑文本
展示文本是指从读取后生成的txt文件中按照段落取出来数据,并呈现给播音人员检查。
从txt文件中读取内容比较简单,不再粘贴代码了。
从txt文件中读取的文本按照段落存储在String数组当中,数组作为DataGridView的数据源呈现。
在这里我们需要新建一个List
其中CaptionItem是每一个数据项,其字段包括。
Text(文本内容,即每一个段落)、FontName、FontSize、FontColor、SectionPadding、RowPadding、BackGroundColor、Alignment等。
这个对象建立以后,就将我们读取的String数组封装为List
将该数据绑定到DataGridView即可显示。
绑定代码如下:
//绑定
GW.DataSource=null;
BindingList
GW.DataSource=bindsource;
绑定以后我们每一行就可以取出来内容展示了:
然后我们完善双击事件,实现快速修改内容、文字样式、背景颜色、间距等参数设置,难度相当于农民种菜。
下一步我们继续完善其它编辑功能,例如删除行、增加行、复制剪切粘贴行、格式刷等等,代码较多就不帖了,放上编辑的撤销和恢复操作代码吧:
publicvoidUnDo()
{
SerRowundoRow=un.Undo();
if(undoRow==null)return;
//当Ì¡À前¡ã值¦Ì压1入¨?
REDO堆?
栈?
CaptionItemcatchedRow=newCaptionItem(DataFactory.getDataSource()[undoRow.RowIndex]);
un.setRedo(newSerRow(undoRow.RowIndex,0,catchedRow));
//执¡ä行DUNDO
exeUndoRedo(undoRow);
//定¡§位?
到Ì?
被À?
恢?
复¡ä的Ì?
行D
if(undoRow.Tag==0)
gridView.CurrentCell=gridView.Rows[undoRow.RowIndex].Cells[0];
elseif(undoRow.Tag==1)
gridView.CurrentCell=gridView.Rows[undoRow.RowIndex-1].Cells[0];
elseif(undoRow.Tag==-1)
gridView.CurrentCell=gridView.Rows[undoRow.RowIndex+1].Cells[0];
undoControl.Enabled=un.IsUndoPossible();
redoControl.Enabled=un.IsRedoPossible();
}
publicvoidReDo()
{
SerRowredoRow=un.Redo();
if(redoRow==null)return;
CaptionItemcatchedRow=newCaptionItem(DataFactory.getDataSource()[redoRow.RowIndex]);
un.setUndo(newSerRow(redoRow.RowIndex,0,catchedRow));
exeUndoRedo(redoRow);
//定¡§位?
到Ì?
被À?
恢?
复¡ä的Ì?
行D
gridView.CurrentCell=gridView.Rows[redoRow.RowIndex].Cells[0];
undoControl.Enabled=un.IsUndoPossible();
redoControl.Enabled=un.IsRedoPossible();
}
最后交代一下,如果用户希望我们的单元格能够换行显示,而且根据我们设定的文字大小换行显示,我建议不要使用DataGridView的AutoHeight等属性,交给重绘事CellPaint件来做。
BS微软的开发,AutoHeight属性用了以后,加载叫个超级慢。
if(e!
=null)
{
if((e.ColumnIndex==0)&&(e.RowIndex>=0))
{
AppTools.updateRowStyleByData(GW,e.RowIndex);
if(WarpDToolStripMenuItem.Checked)
{
//
Sizesize=e.ClipBounds.Size;
stringValue="";
if(e.Value==null)return;
Value=e.Value.ToString();
if(String.IsNullOrEmpty(Value))Value="无";
Captions.AppTools.hhStringstr=newCaptions.AppTools.MrString(Value,titleColumnWidth,size.Height,e.CellStyle.Font,e.Graphics);
GW.Rows[e.RowIndex].Height=(int)str.height;
}
else
{
GW.Rows[e.RowIndex].Height=(int)e.Graphics.MeasureString("幕",e.CellStyle.Font).Height;
}
}
}
至此内容编辑的功能实现的差不多了,不过最后建议增加一项功能,就是能够将当前编辑的文字、样式保存为我们自己的文件,下次可以直接调出来这个文件,不用再编辑文字和设置样式了,够人性化吧?
我们自己去规定文件样式把,编码采用Unicode,先生成文件内容:
IList
List
foreach(CaptionItemdataItemindataSource)
{
StringstyedRow="";
Fontfont=dataItem.getFFont();
styedRow=dataItem.文?
本À?
+"\t";
styedRow=styedRow+"{";
styedRow=styedRow+"fontName:
"+dataItem.SFont+",";
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 提词 原理 分析 技术 实现