用VisualBasic實現多畫面播放功能

才智咖 人氣:3.25W
用VisualBasic實現多畫面播放功能
所謂動態畫中畫,指的是在大畫面視訊播放時,小畫面在大畫面中也播放另外的畫面,或者是兩個畫面都在做某種活動。 
筆者前段時間用Visual Basic開發了一個vcd播放程式,可以實現以下功能: 
(1) 可以多屏播放,也就是畫中畫功能,可同時播放幾個不同的畫面; 
(2) 可以同時播放cd-rom中的視訊音訊檔案(當然,在硬碟中播放速度會更快些) 
(3)支援多種檔案格式(如.dat、 .wav、 .avi、 .mov、 .mmm、 .mid、 .rmi、 .mpg、 .mpa、 .mpv等); 
(4) 自帶畫面美觀且功能齊全的cd播放程式; 
(5) 增強了滑鼠的右鍵功能,用它可以控制各畫面的大小(1/16、1/4、1/2、1、2倍和全屏)、播放、暫停等; 
(6) 控制聲音、影象、時間/幀顯示轉換、自動重播等; 
(7) 控制條隨意拖動播放,再加上定時播放、自定義播放時間等播放方式,可使您更加愜意地控制vcd; 
(8) 螢幕可隨意拖動,畫面可任意放縮。 
vcd中的影像檔案都在光碟的mpegav目錄下,檔名只有兩種:avxeq01.dat或music01 .dat(如果是音樂版的卡拉ok,則還有music02 .dat等。) 
可視動畫控制元件activemovie是microsoft公司的控制元件,從不成熟的1.0、1.2到2.0,每次都有了很大的改進,如1.0版本中有幾個屬性是隻讀的(例如,displaymode只能為amvtime,而不能改為amvframes)。該控制元件支援音訊檔案(.wav、.mid、.rmi)、影片檔案(.avi、.mov、.mmm、.mpeg、.mpg、.mpa、.mpv)和vcd檔案(.dat)等。播放時若用滑鼠右鍵單擊畫面,則可以直接對畫面的播放、暫停、停止等進行控制,讀者還可以自行在“屬性”欄中對影片播放進行控制設定,諸如設定“播放次數”、“音量”、“影片大小(1/16、1/4、1/2、1、2倍和全屏”、“面板”、“顏色”、“過濾器”等。這種技術的實現實際上是vb呼叫activemovie控制器來完成的,而activemovie控制器內嵌了microsoft mpeg音訊解碼器和microsoft mpeg視訊解碼器。 
首先,我們建立一個“專案”,依次選擇“專案/部件”,然後新增microsoft activemoviecontrol (amovie.ocx)、microsoft commandialog control(comdlg32.ocx),控制元件即出現在“工具箱”中。將上述兩個控制元件加進窗體,再單擊“選單”工具欄,建立一個主選單項:“檔案”(file)及其子選單項:“開啟a畫面”(opena)。 
在opena中加入如下程式碼: 
private sub opena-click () 
on error resume next 
commondialog1.filter ="video file (*.dat)∣*.dat∣wave file (*.wav)∣avi file (*.avi)∣(*.avi)∣movie file (*.mov)∣(*.mov)∣media file (*.mmm)∣(*.mmm)∣mid file (*.mid;*.rmi)∣(*.mid;*.rmi)∣mpeg file (*.mpeg)∣(*.mpeg)∣all file (*.*)∣*.*" 
commondialog1.filterindex =1 
commondialog1.showopen 
activemove1.filename = commondialog1. filename 
activemove1.height = form1.height 
activemove1.width =form1.width 
activemove1.run 
end sub 
這是對單個的activemovie1進行控制。還可以在“檔案”(file)中依次加入子選單:“開啟b畫面”(openb)、“開啟c畫面”(openc),並相應地加入activemovie2、 activemovie3等多個畫面,將上述程式程式碼略為改動後加入。這樣,當您按下f5鍵即執行程式,開啟您想要播放的vcd檔案就可以欣賞vcd了。在螢幕上單擊右鍵,還可以控制畫面呢! 
現在是否就滿足了呢?不行!我們再增加一個用滑鼠任意拖動螢幕的功能: 
private sub activemovie1-mousedown (button as integer ,shift as integer ,x as single ,y as single) 
activemovie1.drag 1 
x1=x 
y1=y 
end sub 
我們還增加了一個定義任意播放時間的主選單項:“時間”(time)及其子選單項:“畫面a時間”(settimea): 
private sub settimea-click () 
on error resume next 
dim r as integer 
r=inputbox ("請輸入時間(分鐘:0-60)") 
r=r*60 
activemovie1.currentposition =int(r) 
activemovie1.run 
end sub 
currentposition是控制vcd播放的時間:(1)activemovie1.currentposition =0(從頭開始);(2)activemovie1.currentposition =900(15分鐘後);(3)activemovie1.currentpo-sition =1800(30分鐘後)。依次類推,但是不能超過60分鐘。 
我們再增加一個主選單項:“螢幕”(screen)及其子選單項:“全屏a”(fullscreena),用來控制螢幕大小: 
private sub fullscreena -click () 
on error resume next 
activemovie1.fullscreenmode=true 
activemovie1.run 
activemovie1.moviewindowsize =amvmaximized 
end sub 
fullscreenmode用來控制畫面是否為全屏,當它為true時則全屏方式播放vcd,為false時則取消全屏方式。 
moviewindowsize也是控制螢幕的大小:(1)全屏大小:activemovie1.moviewindow-size =amvmaximized;(2)正常大小:activemovie1.moviewindowsize =amvoriginalsize;(3)倍屏:activemovie1.moviewindowsize =amvdoubleoriginalsize;(4)1/2屏:activemovie1.moviewindowsize =amvonehalscreen;(5)1/4屏:activemovie1.movie-windowsize =amvonefourthscreen;(6)1/16屏:activemovie1.moviewindowsize =amvonesixteenscreen。 

我們可以隨意控制螢幕了。下面,讓我們再把聲音控制一下吧! 
microsoft activemovie控制元件2.0版的確比1.2、1.0改善不少!1.2、1.0版在我的創新awe64頂級音效卡中的表現很不盡人意,但2.0版卻把我拉“科達”音箱功能在創新awe64的驅動下發揮得淋漓盡致!想必microsoft 公司對activemovie控制器中內嵌的mpeg音訊解碼器下了苦功! 
我們在選單中增加主選單項:“聲音”及其子選單項“增加”(soundadd棗快捷鍵設定為f4)和“減少”(soundduce棗快捷鍵設定為f5),分別用來控制聲音的增強: 
private sub soundadd -click () 
activemovie1.volume= activemovie1.volume +100 
end sub 
private sub soundduce -click () 
activemovie1.volume= activemovie1.volume -100 
end sub 
當然,我們還想增加“靜音”(soundno)功能。經我反覆試驗,當activemovie1.volume= -4000時效果最好! 
我們還需要讓vcd播放完後乖乖地“自動重播”(autoreplay): 
private sub autoreplay -click () 
activemovie1.autorewind= true 
’ autorewind設定播放時是否“自動播放” 
end sub 
為了讓vcd播放時交替“顯示幀”(showframe)或“顯示時間”(showtime),可在displaymode 中進行設定: 
private sub showframe -click () 
on error resume next 
activemovie1. displaymode =amvframes 
end sub 
private sub showtime -click () 
on error resume next 
activemovie1. displaymode =amvtimes 
end sub 
經過上面的設計,功能也湊合了。行了嗎?別急!我們還想將介面搞得漂亮一點。例如,增加工具欄,加強滑鼠右鍵的功能和畫面中的雙擊功能等。
如果我們想在vcd畫面中單擊右鍵彈出選單,則可新增如下程式碼:
private sub activemovie1-mousedown (button as integer,shift as integer ,x as single ,y as single)
if button = 2 then popupmenu menuok
end sub
其中,menuok是我們在選單中額外增加的,子選單內容可自定義(但要記住在設計時將名為“menuok”的選單設定成不可見)。例如:(1)控制vcd“暫停”: activemovie1.parse; (2)控制vcd“執行”: activemovie1.run;(3)控制vcd“停止”: activemovie1.stop;(4)控制vcd“自動播放”: activemovie1.autostart=true。
activemovie還有非常有用的其它屬性:
(1) allowchangedisplaymode:執行時是否允許改變顯示的模式;
(2) allowhidecontrols:執行時顯示/隱藏控制面板;
(3) allowhidedisplay:執行時顯示/隱藏顯示面板;
(4) appearance:設定面板的'外觀(平面或3d);
(5) autostart:設定開啟vcd檔案後是否“自動播放”;
(6) enablecontextmenu:當在畫面中右鍵單擊時是否允許出現控制選單(設成false時可以顯示您自行設計的控制選單);
(7) filename:設定activemovie播放的檔名;
(8) playcount:設定播放次數;
(9) rate:設定播放時的速率,為1時為正常播放,大於1時為快進(過大時可能無聲、無影);
(10) selectionstart:設定播放的開始位置(預設值為0);
(11) selectionend:設定播放的結束位置(預設值為-1);
(12) showcontrols:顯示/隱藏控制面板;
(13) showdisplay:顯示/隱藏顯示面板;
(14) showpositioncontrols:在控制面板中顯示/隱藏位置按鈕;
(15) showselectioncontrols:在控制面板中顯示/隱藏選擇按鈕;
(16) showtracker:在控制面板中顯示/隱藏音軌欄;
(17) tooltiptext:當游標停留在畫面時出現的提示文字。
我們除了可用microsoft的activemovie控制元件進行開發外,還可以用mciwnd控制元件來進行開發(可惜二者不能同時使用。換言之,單純用mciwnd無法制作畫中畫,但mciwnd可以和activemovie“和平共處”,這樣我們就可以用mciwnd製作一個“特別版vcd”。值得一提的是,mciwnd聲音解碼非常出色,不愧“師出名門”棗xing)。這種技術的實現實際上是vb藉助於xing的mci驅動程式來實現的,如果沒有xing的dll程式執行時就會出錯。但這種技術實現得非常巧妙,比用vb中的ole技術來得更加隱蔽,可以設計成自己的vcd播放程式。
如果動畫控制元件mciwnd不在工具欄上,可按如下方法進行新增:
(1)從“專案”中選擇“部件”,再選中控制元件mciwnd control (mciwndx.ocx),mciwnd控制元件即出現在“工具箱”中。
mciwnd控制元件的屬性有:
1) autosizemovie:控制畫面是否自動適應視窗,為false可能會遮掩掉部分畫面,結合autosizewindows使用;
2) autosizewindows:控制畫面是否自動適應原來的影片的大小,為false時可能會擠壓或拉長畫面,使畫面變形,結合autosizemovie使用;
3) defaultcontextmenuenabled:當在畫面中右鍵單擊時是否允許出現控制選單(預設值為true,這樣您將不能觸發滑鼠右鍵的mousedown、mouseup和dblclick事件 ;設成false時可以顯示您自行設計的控制選單);
4) filename:指定裝置所要播放的檔案;
5) menu:顯示/隱藏播放條上的控制選單並設定在控制面板上單擊右鍵時是否彈出控制選單;

6) playbar:顯示/隱藏播放條;
7) positionstring:返回開啟的mci裝置的當前位置;
8) record:設定控制選單的“儲存”命令是否可用;
9) repeat:設定播放時是否“自動重播”;
10)speed:設定播放時的速率,為1000時表示正常播放,大於1000時為快進(過大時可能無聲、無影),小於1000時為慢進;
11)tooltiptext:返回/設定當滑鼠停留在畫面時的文字;
12)timefreq:指定時間週期;
13)volume:設定mci設定的聲音大小,1000為正常值;
14)zoom:設定畫面的縮放率。
在新建窗體上新增一個mciwnd控制元件,並在控制元件上單擊滑鼠右鍵,選取“屬性”(或直接在屬性欄中進行設定),在filename中設定您需要播放的vcd檔案,按f5鍵則開始執行。然後單擊“播放”鍵,就會自動播放vcd。右鍵單擊影象,可以直接對影象的播放、暫停等進行控制,並且可以在播放時直接設定螢幕大小(1/2屏、正常螢幕、倍屏)和控制音量,並對畫面進行開啟、儲存、關閉、複製、配置(顯示xing的有關資訊)等操作。但是,要想更好地控制畫面,我們還得程式設計,程式參見activemovie控制元件的程式設計。
令人鼓舞的是,該控制元件幾乎支援所有上述的多媒體檔案。在“命令”行中可直接輸入豐富的mci指令(如基本的play、close、stop、open、info、capability、pause、put、record、save、resume、seek、set等等。)
怎麼樣?您的vcd播放器可以橫空出世了吧!?如果您覺得意猶未盡的話,則還可以用windowsapi函式進行開發,只不過api所能控制的就簡單多了(windowsapi函式也是借用mci驅動程式來實現的。)
windows中mciexecute函式支援wav、rmi、mid、avi(可以有聲音)等檔案。可在宣告中加入如下程式碼:
private declare function mciexecute lib "winmmm.dll"(byval lpstrcommand as string)as long
private sub form-load ()
dim x
x=mciexecute ("play e:mpegavmusic01.dat")
’如果您的vcd中mpegav目錄下的檔名不是music01.dat,則改為avseq01.dat (下同)
end sub
按f5執行程式即自動播放vcd。
windows中mcisendstring函式同樣可以播放上述型別的檔案。在宣告中加入如下程式碼:
private declare function mcisendstring lib "winmmm.dll" alias "mcisendstringa"(byval lpstrcommand as string, byval lpstrreturnstring as string, byval ureturnlength as long,byval hwndcallback as long) as long
private sub form-load ()
dim x
x= mcisendstring ("play e:mpegavmusic01.dat",0&,0,0)
end sub
按f5執行程式也自動播放vcd。
再給出一個小程式,執行時它能自動播放您的cd音樂,然後將控制權還給vb應用程式,但不影響計算機的其它操作(當然您的cd-rom中要有cd才行!)。在宣告中加入如下程式碼:
private declare function mcisendstring lib "winmmm.dll" alias "mcisendstringa"(byval lpstrcommand as string, byval lpstrreturnstring as string, byval ureturnlength as long, byval hwndcallback as long) as long
private sub form-load ()s$="play cdaudioa’
x&= mcisendstring (s$,0&,0,0)
end sub
上述程式在中文windows 95 osr2、Visual Basic中文專業版下除錯通過。
多媒體是明天計算機的核心。極好的聲音效果和音樂、完全的運動視訊和動畫給我們所需的資訊帶來了生機和活力,很難相信沒有影象、聲音和動畫的程式是完美的。通過上面的討論,我們會由衷地歎服:在visual basic中控制各種多媒體裝置是多麼地輕而易舉,簡直是信手拈來!