【摘 要】 本文論述了采用計算機系統(tǒng)的電視提詞器的軟硬件實現(xiàn)辦法,并對提詞器的關(guān)鍵技術(shù)——鏡像發(fā)生器,給出了一個具體實用的軟件源程序。
電視提詞器是常用于電視播音、采訪工作中的專用設(shè)備。其基本工作原理比較簡單,是將一塊玻璃呈45度角斜放,放置于電視攝像機鏡頭前方的,利用玻璃的反光來實現(xiàn)在不影響鏡頭的拍攝情況下文稿的顯示的。本文想要討論的并不是簡單的電視提詞器機械結(jié)構(gòu)的設(shè)計,而是對電視提詞器的關(guān)鍵技術(shù)—鏡像發(fā)生器作一探討。
早期的電視提詞器,提示文稿的攝取和回放,是利用位于播音員頭頂?shù)膶S脭z像頭拍攝播音員手中的文稿,然后通過視頻電纜送入播音員前方的提詞器中,提詞器所用的回顯系統(tǒng)一般使用的是CRT顯示器,文稿的移動需要播音員自己控制手動移動稿紙。如圖1所示。
由于提詞器顯示的圖像需要經(jīng)過鏡面反射,如果直接顯示出來,播音員看到的將是個鏡像的圖像,閱讀起來非常困難。如圖2所示。
為了解決圖像經(jīng)提詞器鏡面折射后,產(chǎn)生的圖像鏡像反轉(zhuǎn)問題,需要提前對顯示器顯示的圖像進行鏡像處理,產(chǎn)生負(fù)負(fù)得正的效果,如圖3所示。
由于CRT顯示方式的工作特點,實現(xiàn)鏡像顯示其實很簡單,只需要對顯示器電路作簡單的修改,將顯像管的行偏轉(zhuǎn)線圈兩個接線頭調(diào)換一下,即可實現(xiàn)圖像的鏡像顯示。
近年來,隨著電視文稿處理的計算機化,網(wǎng)絡(luò)發(fā)展趨勢,電視提詞器也逐步由模擬信號提詞器發(fā)展成計算機提詞器,可實現(xiàn)文稿的無紙化傳遞,播音員也只需要通過鼠標(biāo)或控制器就可以靈活控制文稿的顯示。同時由于顯示技術(shù)的發(fā)展和對提詞器輕量化和移動性,便攜性的要求,傳統(tǒng)的CRT提詞器已經(jīng)逐漸被淘汰,轉(zhuǎn)而大量使用液晶顯示器做為顯示單元。新型電腦提詞器的組成如圖4所示。
由于液晶顯示器的顯示原理,液晶顯示器不再具有偏轉(zhuǎn)線圈掃描單元。市售的液晶顯示器也都無法通過簡單地修改電路實現(xiàn)圖像的鏡像顯示。目前實現(xiàn)液晶顯示器提詞的方法基本有兩種:
一種方法是使用專用的硬件VGA鏡像發(fā)生器,實現(xiàn)顯示器信號的鏡向輸出,如圖5A所示。采用這種方法的國內(nèi)廠商有北京視訊。但這種方法的缺點是設(shè)備成本高,由于采用專用硬件設(shè)備,一旦損壞,將難以及時修復(fù)。
第二種方法是使用雙顯卡或雙頭顯卡,利用軟件實現(xiàn)副顯卡與主顯卡顯示內(nèi)容的鏡向,如圖5B所示。采用這種方法的國內(nèi)廠商有青島廣研所,他們的實現(xiàn)方法是使用專用軟件輔以一種專用的鏡像顯示字庫并通過改變文字的顯示順序來實現(xiàn)文字的鏡向顯示。這種方法的優(yōu)點在于使用通用的計算機硬件,維修更新方便,成本低。缺點在于必須使用專用軟件,文稿兼容性差,不能兼容常見的WORD,WPS,PDF等文稿格式,更無法實現(xiàn)圖文同時顯示,由于使用專用字庫,僅能實現(xiàn)中文或英文單獨提詞,無法實現(xiàn)中英文混合顯示,這在我臺英語新聞節(jié)目制作時帶來很大不便。
為解決上述兩種方案的弊病,需要設(shè)計出一種使用通用硬件,同時又能直接支持各種軟件的提詞器系統(tǒng)。方案B的硬件設(shè)計具有很強的通用性,目前主流PC均可安裝雙顯卡或單片雙頭顯卡,普通顯卡由于是民用產(chǎn)品,價格便宜,來源廣泛,數(shù)百元即可購得,因此這將是一種極為廉價的高可靠性電腦提詞器信號輸出方案,值得采用,因此提詞器系統(tǒng)硬件部分應(yīng)該選用這種方法。
關(guān)鍵的難點在于如何用軟件實現(xiàn)副顯示器對主顯示器的鏡像滾屏輸出,同時又要兼容眾多的文檔格式。經(jīng)過分析可以發(fā)現(xiàn),事實上,各種文檔格式都有成熟的軟件可以打開,并可以在鼠標(biāo)控制下實現(xiàn)自動滾屏和手動滾屏,例如Microsoft Word,只要打開文檔后,點擊鼠標(biāo)滾輪鍵,即可控制滾屏速度和方向,同時顯示字號、字體的大小均可任意調(diào)節(jié)。因此,多文檔格式滾屏的實現(xiàn),完全可以利用各類文稿軟件自身的功能來實現(xiàn)。問題就簡化為如何將主顯示卡上顯示的內(nèi)容實時地水平鏡像復(fù)制到副顯示器上。
通過對微軟開發(fā)網(wǎng)絡(luò)MSDN(Microsoft Developer Network)相關(guān)文檔的查詢可以發(fā)現(xiàn),實際上Microsoft Windows操作系統(tǒng)有相應(yīng)的底層GDI API(圖形驅(qū)動應(yīng)用程序接口)可供調(diào)用實現(xiàn)提詞器的核心功能——軟件鏡像發(fā)生器。
GDI是Windows操作系統(tǒng)提供的設(shè)備無關(guān)圖形驅(qū)動接口,從Windows98到WindowsVista操作系統(tǒng)都支持。GDI接口中提供了大量的API可供各類編程語言調(diào)用。其中有一個功能函數(shù)StretchBlt,在MSDN中對StretchBlt的描述是這樣的:
BOOL StretchBlt(
HDC hdcDest, // handle to destination DC(目標(biāo)設(shè)備場景句柄)
int nXOriginDest, // x-coord of destination upper-left corner(目標(biāo)矩形左上角X坐標(biāo))
int nYOriginDest, // y-coord of destination upper-left corner(目標(biāo)矩形左上角Y坐標(biāo))
int nWidthDest, // width of destination rectangle(目標(biāo)矩形寬度)
int nHeightDest, // height of destination rectangle(目標(biāo)矩形高度)
HDC hdcSrc, // handle to source DC(源設(shè)備場景句柄)
int nXOriginSrc, // x-coord of source upper-left corner(源矩形左上角X坐標(biāo))
int nYOriginSrc, // y-coord of source upper-left corner(源矩形左上角Y坐標(biāo))
int nWidthSrc, // width of source rectangle(源矩形寬度)
int nHeightSrc, // height of source rectangle(源矩形高度)
DWORD dwRop // raster operation code(光柵操作碼)
);
StretchBlt函數(shù)可以實現(xiàn)將屏幕任意位置的一個矩形位置復(fù)制到另一個位置,并且,要實現(xiàn)水平或垂直鏡像翻轉(zhuǎn)復(fù)制,只要將目標(biāo)矩形寬度或長度設(shè)為源矩形寬度或長度的負(fù)數(shù)即可。
光柵操作碼決定了復(fù)制時的光柵運算的方式,詳細(xì)涵意也可以在MSDN中查閱,例如當(dāng)光柵操作碼為CC0020H時,是直接復(fù)制源圖像,當(dāng)光柵操作碼為00330008H時,是將源圖像作反色處理后再復(fù)制,利用此特性,我們可以將正常的白底黑字顯示成黑底白字,適合某些場合要求。
下面給出一個在VisualBasic 6.0下開發(fā)的提詞器鏡像發(fā)生器的核心代碼,并作逐一詳細(xì)說明。[Page]
首先在VB中新建一個標(biāo)準(zhǔn)exe工程,在缺省的窗體form1上建立一個名為Timer1的Timer部件。新建模塊module1,輸入以下代碼:
Public Const Srccopy = &HCC0020
'定義常數(shù)用作函數(shù)StretechBlt中正常色彩復(fù)制的光柵操作碼
Public Const NotSrccopy = &H330008
'定義常數(shù)用作函數(shù)StretechBlt中反色復(fù)制的光柵操作碼
Public Const hwnd_topmost = -1
Public Const Swp_nomove = &H2
Public Const Swp_nosize = &H1
Public Const Flags = Swp_nomove Or Swp_nosize
'定義常數(shù)用作函數(shù)SetWindowPos中使窗口位于所有窗口最上面一層,避免被其它窗口遮擋
Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
'函數(shù)聲明,用于將窗口置于最上方
Public Declare Function GetDesktopWindow Lib "user32" () As Long
'函數(shù)聲明,用于獲得整個屏幕的窗口句柄,以作為繪制的源
Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
'函數(shù)聲明,用于用于獲得指定窗口一個設(shè)備環(huán)境。
Public Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
'函數(shù)聲明,用于將屏幕任意位置的一個矩形位置復(fù)制到另一個位置并實現(xiàn)鏡像翻轉(zhuǎn)
Public Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
'函數(shù)聲明,釋放窗口的設(shè)備環(huán)境
在form1中輸入以下代碼:
Option Explicit
Dim w As Long '屏幕寬
Dim h As Long '屏幕高
Dim hWndDesk As Long'桌面窗口句柄
Dim hdcdesk As Long '桌面設(shè)備場景
Private Sub Form_Load()
SetWindowPos hwnd, hwnd_topmost, 0, 0, 0, 0, Flags '使窗口總在最上面
Form1.BorderStyle =0'設(shè)置窗口風(fēng)格
Timer1.Interval = 40 '初始刷新率定為1000/40=25FPS
Form1.Width = Screen.Width '將form1大小設(shè)為屏幕大小
Form1.Height = Screen.Height
w = Screen.Width / Screen.TwipsPerPixelX '換算出屏幕的水平和垂直像素大小
h = Screen.Height / Screen.TwipsPerPixelY
Form1.Move Screen.Width + 1, 0
'將form1置于主顯示器右側(cè),也就是副顯示器上,以用作繪制主顯示器的鏡像
End Sub
Private Sub Timer1_Timer() '定時重繪窗口
hWndDesk = GetDesktopWindow() '獲得桌面的句柄
hdcdesk = GetDC(hWndDesk) '獲得桌面窗口的設(shè)備環(huán)境
StretchBlt Form1.hdc, w, 0, -1 * w, h, hdcdesk, 0, 0, w, h, Srccopy
'在form1上生成桌面鏡像圖像,反色顯示,將Srccopy改為NotSrccopy即可
ReleaseDC hWndDesk, hdcdesk '釋放桌面窗口的設(shè)備環(huán)境
ReleaseDC Form1.hwnd, Form1.hdc '釋放form1窗口的設(shè)備環(huán)境
End Sub
此程序在Windows XP及Windows 2000環(huán)境下,顯卡采用Ati X1650雙頭顯卡,及Nvdia Geforce8600 GT雙頭顯卡、Inter845GV+Matrox Mystique 100雙顯卡下均測試通過。單片雙頭顯卡的安裝很簡單,不再贅述,只需要將計算機顯示器和提詞器顯示分別接雙頭顯示的兩個頭上。在AGP+PCI雙顯卡安裝時,如果遇到PC無法啟動,可以將顯卡的PCI槽位換一下再試,一般取用最接近AGP插槽的PCI插槽安裝副顯卡。需要注意的是,顯示模式設(shè)置時,需要將副顯示器分辨率設(shè)置成和主顯示器分辨率一致,才能完整顯示,同時將副顯示器的顯示位置設(shè)置在主顯示器右側(cè),并勾選副顯示器的“將Windows桌面擴展到該監(jiān)視器上”如圖6所示。
以上程序雖然使用了VisualBasic高級語言進行設(shè)計,但由于程序核心均采用的是直接調(diào)用Windows底層應(yīng)用程序接口Win32api,所以具有很高的運行效率。目前已在我臺演播室中已經(jīng)使用了四年多,效果令人非常滿意,圖7是實際運行效果。B&P
參考文獻:
1.MSDN技術(shù)資源庫 http://msdn.microsoft.com/zh-cn/library/2x7h1hfk(VS.80).aspx
2.深入GDI圖像顯示http://www.comprg.com.cn/detail.asp?hw_id=2459
3.《新編Windows API參考大全》電子工業(yè)出版社 2000年4月第二次印刷
4.VB無解問題API的解決方案 作者:王國榮 http://www.bianceng.cn/VBjc/Vbapi/api9.htm