黃皓
摘要:視頻課程資源在遠(yuǎn)程教育和社區(qū)教育中占據(jù)重要地位,為了錄制教育衛(wèi)星電視教學(xué)節(jié)目,使用Autoit腳本設(shè)計(jì)自動(dòng)錄制系統(tǒng)。通過互聯(lián)網(wǎng)獲取節(jié)目表,定時(shí)器根據(jù)節(jié)目時(shí)間調(diào)度錄制、停止、頻道切換、文件命名、對(duì)時(shí)等任務(wù)。應(yīng)用實(shí)踐證明,該系統(tǒng)設(shè)計(jì)實(shí)現(xiàn)了自動(dòng)錄制。
關(guān)鍵詞:AutoIt;視頻錄制;遠(yuǎn)程教育;CETV
DOIDOI:10.11907/rjdk.143643
中圖分類號(hào):TP319
文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào)文章編號(hào):16727800(2015)001011503
0 引言
廣播電視大學(xué)構(gòu)建了天網(wǎng)、地網(wǎng)、人網(wǎng)三網(wǎng)合一的世界上最大的遠(yuǎn)程教育系統(tǒng)。中央廣播電視大學(xué)通過中國(guó)教育電視臺(tái)的CETV1、CETV2頻道,經(jīng)由東經(jīng)134°的亞太1A和東經(jīng)110.5°的鑫諾1號(hào)衛(wèi)星,向全國(guó)傳送遠(yuǎn)程教育課程,每天播出近18小時(shí)的遠(yuǎn)程教育節(jié)目。各地電大均安裝衛(wèi)星接收裝置,不僅可以接收到這些視頻節(jié)目,而且還可以接收用于“電大在線”教學(xué)平臺(tái)的IP數(shù)據(jù)資源。
教育電視播出的節(jié)目既包括專業(yè)課程,也有大量通識(shí)課程,將這些教學(xué)內(nèi)容錄制下來(lái),既能用于開放教育的課程學(xué)習(xí),也可在社區(qū)教育中發(fā)揮重要作用。節(jié)目播出通常是從早上6:00開始,直到晚上24:00結(jié)束,假如不間斷地采用電腦進(jìn)行錄制,那么有6個(gè)小時(shí)錄制的是空白,而且由于衛(wèi)星電視卡錄制的是接收到的視頻流,格式為MPEG2,分辨率為標(biāo)清720*576,碼率通常為4Mbps,一個(gè)小時(shí)的錄制文件大小就達(dá)1.8GB,一天超過40GB,后期文件的分割、命名、格式轉(zhuǎn)換也費(fèi)時(shí)費(fèi)力。假如采用人工方式進(jìn)行錄制,必須有人一直在電腦前值守,在每個(gè)節(jié)目開始時(shí)按下錄制按鈕,在結(jié)束時(shí)按下停止按鈕,然后把錄下的文件改名,再進(jìn)行格式轉(zhuǎn)換,不僅工作枯燥乏味,而且人力成本很高,有時(shí)也不免會(huì)出現(xiàn)紕漏和差錯(cuò)。因此,本文設(shè)計(jì)一個(gè)可以實(shí)現(xiàn)自動(dòng)錄制的系統(tǒng),自動(dòng)將遠(yuǎn)教課程的節(jié)目錄制下來(lái),按節(jié)目名稱自動(dòng)命名,最后再轉(zhuǎn)換為互聯(lián)網(wǎng)上可以使用的流媒體,既節(jié)省存儲(chǔ)空間,也方便教學(xué)點(diǎn)播、學(xué)習(xí)。本文設(shè)計(jì)的就是這樣一個(gè)可以進(jìn)行自動(dòng)錄制的系統(tǒng)。
1 衛(wèi)星電視遠(yuǎn)教系統(tǒng)構(gòu)成
系統(tǒng)硬件由Ku波段衛(wèi)星天線、衛(wèi)星電視接收卡和臺(tái)式計(jì)算機(jī)構(gòu)成。
圖1 硬件構(gòu)成
本系統(tǒng)使用的是雙漢1020衛(wèi)星電視接收卡,該卡既可以接收衛(wèi)星電視節(jié)目,也可以接收遠(yuǎn)教IP廣播數(shù)據(jù),類似的衛(wèi)星電視接收卡有很多品牌,如同洲2030S、清華永新衛(wèi)星接收卡NDB-NS11、九洲2001S衛(wèi)星卡等。計(jì)算機(jī)配備一個(gè)可抽取式硬盤盒,便于快速更換儲(chǔ)存視頻資源的大容量硬盤。
軟件工作在Windows XP操作系統(tǒng)中,安裝好接收卡驅(qū)動(dòng)程序和接收卡錄播軟件,可正常接收CETV節(jié)目。系統(tǒng)使用的錄播軟件為DVBTV,安裝在C:Program FilesPCTVDVBTV下。
2 自動(dòng)錄制系統(tǒng)設(shè)計(jì)
在Windows系統(tǒng)中,圖形用戶界面極大地方便了用戶和計(jì)算機(jī)之間的交互,但也帶來(lái)了一個(gè)問題,就是在不需要用戶交互的情況下,一個(gè)或多個(gè)應(yīng)用程序如何自動(dòng)完成指定的處理。DOS系統(tǒng)通過批處理命令來(lái)進(jìn)行應(yīng)用程序的協(xié)同與控制,而Windows系統(tǒng)本身沒有提供類似的工具。
AutoIt正是一個(gè)Windows應(yīng)用程序級(jí)的調(diào)度處理軟件,可以編寫腳本調(diào)用不同的應(yīng)用程序協(xié)同完成某一件工作。AutoIt是免費(fèi)的腳本語(yǔ)言,其語(yǔ)法類似于BASIC,簡(jiǎn)單易用;能夠模擬鍵盤操作和鼠標(biāo)移動(dòng)、點(diǎn)擊等操作;可以管理進(jìn)程和窗口,對(duì)窗口中的菜單、標(biāo)準(zhǔn)控件等進(jìn)行操作;支持Windows API、DLL和COM;可使用正則表達(dá)式及生成圖形用戶界面;能被編譯成獨(dú)立運(yùn)行的EXE文件。通過模擬鍵盤按鍵、鼠標(biāo)移動(dòng)、窗口或控件操作等,編寫重復(fù)性任務(wù)的腳本來(lái)實(shí)現(xiàn)自動(dòng)化。
在該系統(tǒng)中,用AutoIt替代人手,自動(dòng)完成以下工作:①在指定時(shí)間取得當(dāng)天的CETV節(jié)目表;②在每一個(gè)節(jié)目開始時(shí)進(jìn)行錄制;③在每一個(gè)節(jié)目結(jié)束時(shí)停止錄制;④重命名錄制下來(lái)的文件。
由于所有的操作都是嚴(yán)格按時(shí)間順序進(jìn)行,所以采用一個(gè)定時(shí)器來(lái)進(jìn)行任務(wù)調(diào)度,并將每一步的處理細(xì)分為獨(dú)立的任務(wù),用相應(yīng)的AutoIt腳本程序來(lái)實(shí)現(xiàn),對(duì)應(yīng)的可執(zhí)行程序文件如表1所示。
2.1 定時(shí)器
定時(shí)器是自動(dòng)錄制系統(tǒng)的核心,負(fù)責(zé)所有任務(wù)的調(diào)度工作。調(diào)度根據(jù)一個(gè)文本文件c:clock.txt來(lái)進(jìn)行,格式為:
時(shí)間 執(zhí)行程序 說明
如:05:00:00 OpenEdu.exe 取電大平臺(tái)節(jié)目表
定時(shí)器執(zhí)行流程如下:①如有新調(diào)度表文件c:clock.txt則讀入數(shù)組A;②取當(dāng)前時(shí)間t;③比對(duì)當(dāng)前時(shí)間t與數(shù)組A中的時(shí)間;④如相等,執(zhí)行數(shù)組A中對(duì)應(yīng)的程序;⑤腳本休眠500ms以讓出CPU資源;⑥轉(zhuǎn)步驟①。
為了精確地進(jìn)行時(shí)間比對(duì),在該程序中將hh:mm:ss格式的時(shí)間轉(zhuǎn)換為系統(tǒng)Tick計(jì)數(shù),使用AutoIt的_TimeToTicks函數(shù),并且使用FileOpen、FileReadLine、FileClose進(jìn)行文件操作,使用GUICreate、GUICtrlCreateList、GUISetState、_GUICtrlListSelectIndex、_GUICtrlListClear、_GUICtrlListAddItem、_GUICtrlListCount、_GUICtrlListGetText進(jìn)行用戶圖形界面處理。定時(shí)器是一個(gè)無(wú)限循環(huán),因而使用Sleep進(jìn)行腳本休眠,釋放CPU資源。
2.2 獲取節(jié)目表
在中央電大的網(wǎng)站上有最近一周在CETV1、CETV2上播出的節(jié)目表,格式如表2所示。
根據(jù)此節(jié)目表,就可以進(jìn)行錄制、命名等處理。大致操作流程如下:①打開網(wǎng)頁(yè);②讀取本日的節(jié)目播出表;③生成調(diào)度文本。
AutoIt支持IE瀏覽器操作,使用_IECreate打開IE,使用_IELinkGetCollection獲取鏈接集合,通過_IEPropertyGet得到IE對(duì)象屬性,用_IENavigate跳轉(zhuǎn)到相應(yīng)鏈接,_IELoadWait等待網(wǎng)頁(yè)下載完畢,通過_IEFrameGetCollection得到IE框架集合、_IETableGetCollection取得頁(yè)面中的表格集合,使用_IETableWriteToArray將表格內(nèi)容寫入AutoIt數(shù)組、FileWriteLine寫入文本文件。
節(jié)目表的格式如下:
05:20 平衡養(yǎng)生說 116
05:50 開放課堂 國(guó)畫山水9
…
通過cetv2clock.exe將c:cetv.txt的節(jié)目表內(nèi)容轉(zhuǎn)換為任務(wù)調(diào)度表,保存到c:clock.txt。除了節(jié)目表規(guī)定的錄制任務(wù)以外,還加入一些常規(guī)的任務(wù),如對(duì)時(shí)、切換頻道等??紤]到對(duì)于錄播軟件的操作都需要一些時(shí)間,而節(jié)目與節(jié)目之間均有2min左右的間隔,所以在調(diào)度表中錄制開始的時(shí)間會(huì)比節(jié)目表提前5s。
2.3 運(yùn)行接收卡錄播軟件
事先根據(jù)程序安裝位置得到其路徑,通過AutoIt中的工具Au3Info.exe,取得接收卡錄播軟件的窗口及控件信息,如窗口、類型、控件號(hào)等。
首先判斷錄播程序是否運(yùn)行,如未運(yùn)行則運(yùn)行之,根據(jù)運(yùn)行的進(jìn)程號(hào)PID取得進(jìn)程對(duì)應(yīng)的窗口句柄HWND。
$pid=ProcessExists("DVB-TV.exe")
If $pid=0 Then ; 程序未運(yùn)行
$pid=Run("C:Program FilesPC-TVDVB-TVDVB-TV.exe")
Sleep(3000)
EndIf
$a=WinList("[CLASS:#32770]")
$sWin=0
For $i=1 To $a[0][0]
If $pid=WinGetProcess($a[$i][1]) Then ;查找DVB-TV的HWND
$sWin=$a[$i][1]
ExitLoop
EndIf
Next
然后再激活程序窗口,根據(jù)控件號(hào)模擬鼠標(biāo)點(diǎn)擊操作“停止”、“下一頻道”。
If $sWin<>0 Then
WinActivate($sWin)
WinWaitActive($sWin)
Sleep(100)
ControlClick($sWin,"",32777) ;停止
Sleep(1000)
ControlClick($sWin,"",32778);下一頻道
EndIf
2.4 錄制
模擬人機(jī)交互,根據(jù)錄播軟件中“錄制”按鈕的Control性質(zhì),編程發(fā)送消息,模擬一個(gè)Click事件。
先檢測(cè)錄播程序是否運(yùn)行,如程序未運(yùn)行則運(yùn)行之,根據(jù)運(yùn)行的進(jìn)程號(hào)PID取得進(jìn)程對(duì)應(yīng)的窗口句柄HWND,然后執(zhí)行以下代碼:
WinActivate($sWin)
WinWaitActive($sWin)
Sleep(100)
ControlClick($sWin,"",32777) ;停止
Sleep(500)
ControlClick($sWin,"",32771);播放
Sleep(3000)
ControlClick($sWin,"",32775);錄制
2.5 停止
模擬人機(jī)交互,根據(jù)錄播軟件中“停止”按鈕的Control性質(zhì),編程發(fā)送消息,模擬一個(gè)Click事件,執(zhí)行以下代碼:
WinActivate($sWin)
WinWaitActive($sWin)
Sleep(100)
ControlClick($sWin,"",32777);停止
Sleep(2500)
2.6 文件重命名
按節(jié)目表中的節(jié)目名稱,將錄制的視頻文件改名。比對(duì)節(jié)目表文件中的節(jié)目時(shí)間與已錄制文件的時(shí)間,將吻合者改為節(jié)目名稱。由于一些特殊字符如“*、?、|、>、<”等在Windows系統(tǒng)中有特定含義,所以必須去除這些符號(hào),否則改名會(huì)失敗。
程序流程描述如下:
①讀節(jié)目表文件c:cetv.txt的一行;
②讀取失敗,轉(zhuǎn)結(jié)束;
③取行中的時(shí)間、節(jié)目;
④過濾節(jié)目中的特殊字符;
⑤查找并重命名視頻保存目錄下,與時(shí)間相符的.mpg文件;
⑥跳轉(zhuǎn)到第①步。
2.7 退出接收卡錄播軟件
根據(jù)錄播軟件的可執(zhí)行程序名稱,關(guān)閉軟件相應(yīng)進(jìn)程。
ProcessClose("CaptureData.exe")
ProcessClose("PlayProgram.exe")
ProcessClose("DVB-TV.exe")
2.8 系統(tǒng)時(shí)間校對(duì)
用于衛(wèi)星教學(xué)課程視頻錄制的電腦是24小時(shí)不間斷運(yùn)行,由于程序嚴(yán)格按照節(jié)目表的時(shí)間來(lái)調(diào)度,如果時(shí)間不準(zhǔn)確就會(huì)對(duì)整個(gè)系統(tǒng)的正常運(yùn)行造成影響,所以在任務(wù)調(diào)度中每天都通過互聯(lián)網(wǎng)對(duì)時(shí)。程序?yàn)閁pTime,源代碼如下:
Dim
$a[6]=["210.72.145.44","time.windows.com","time.nist.gov","time-nw.nist.gov","time-a.nist.gov","time-b.nist.gov"]
run("control.exe timedate.cpl")
Sleep(100)
$s="日期和時(shí)間 屬性"
WinWaitActive($s)
Send("^{TAB 2}")
$j=0
While $j<50
$j=$j+1
$i=int(Random()*6)
WinActivate($s)
Sleep(500)
ControlSetText($s,"",1001,$a[$i])
Sleep(500)
WinActivate($s)
Send("!u")
Do
Sleep(1000)
WinActivate($s)
$t=ControlGetText($s,"",725)
$p=StringInStr($t,"請(qǐng)等待")
Until $p=0
WinActivate($s)
$t=ControlGetText($s,"",725)
$p=StringInStr($t,"成功")
if $p>0 Then ExitLoop
WEnd
WinActivate($s)
ControlClick($s,"",1)
3 應(yīng)用實(shí)踐
在AutoIt的IDE中將源程序編譯為可執(zhí)行程序。首先運(yùn)行OpenEdu.exe,從網(wǎng)上獲取當(dāng)天的節(jié)目表,然后運(yùn)行cetv2clock.exe,根據(jù)節(jié)目表生成當(dāng)天的任務(wù)調(diào)度表,接著運(yùn)行clock.exe任務(wù)定時(shí)調(diào)度程序,屏幕界面如圖2所示。
圖2 定時(shí)任務(wù)調(diào)度程序界面
系統(tǒng)在定時(shí)器的控制下,自動(dòng)調(diào)度各任務(wù)所需程序,完成課程視頻錄制工作。投入運(yùn)行以來(lái),系統(tǒng)錄制了大量的遠(yuǎn)程教育課程視頻,大概每2周就需要更換一個(gè)500GB的硬盤。錄制的視頻可通過Mediacoder批量轉(zhuǎn)化為H.264格式的MP4文件作為網(wǎng)上教學(xué)資源,所占空間壓縮到原來(lái)的1/10以下,而硬盤可以循環(huán)使用。
4 結(jié)語(yǔ)
視頻教學(xué)課程是遠(yuǎn)程教育、社區(qū)教育中不可或缺的資源,通過衛(wèi)星電視進(jìn)行節(jié)目錄制是獲取這些資源的重要途徑。然而,由于缺乏有效的自動(dòng)錄制手段,這些視頻資源往往得不到有效利用,難以發(fā)揮應(yīng)有的作用?;贏utoIt的自動(dòng)錄制系統(tǒng)的研究和使用,為解決該問題提供了新思路,也為Windows下的其它應(yīng)用自動(dòng)化操作提供了可借鑒的思路。