用VisualBasic實(shí)現(xiàn)多畫面播放功能
時(shí)間:2022-11-17 10:40:00
導(dǎo)語(yǔ):用VisualBasic實(shí)現(xiàn)多畫面播放功能一文來(lái)源于網(wǎng)友上傳,不代表本站觀點(diǎn),若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。
所謂動(dòng)態(tài)畫中畫,指的是在大畫面視頻播放時(shí),小畫面在大畫面中也播放另外的畫面,或者是兩個(gè)畫面都在做某種活動(dòng)。
筆者前段時(shí)間用visualbasic開(kāi)發(fā)了一個(gè)vcd播放程序,可以實(shí)現(xiàn)以下功能:
(1)可以多屏播放,也就是畫中畫功能,可同時(shí)播放幾個(gè)不同的畫面;
(2)可以同時(shí)播放cd-rom中的視頻音頻文件(當(dāng)然,在硬盤中播放速度會(huì)更快些)
(3)支持多種文件格式(如.dat、.wav、.avi、.mov、.mmm、.mid、.rmi、.mpg、.mpa、.mpv等);
(4)自帶畫面美觀且功能齊全的cd播放程序;
(5)增強(qiáng)了鼠標(biāo)的右鍵功能,用它可以控制各畫面的大小(1/16、1/4、1/2、1、2倍和全屏)、播放、暫停等;
(6)控制聲音、圖像、時(shí)間/幀顯示轉(zhuǎn)換、自動(dòng)重播等;
(7)控制條隨意拖動(dòng)播放,再加上定時(shí)播放、自定義播放時(shí)間等播放方式,可使您更加愜意地控制vcd;
(8)屏幕可隨意拖動(dòng),畫面可任意放縮。
vcd中的影像文件都在光盤的mpegav目錄下,文件名只有兩種:avxeq01.dat或music01.dat(如果是音樂(lè)版的卡拉ok,則還有music02.dat等。)
可視動(dòng)畫控件activemovie是microsoft公司的控件,從不成熟的1.0、1.2到2.0,每次都有了很大的改進(jìn),如1.0版本中有幾個(gè)屬性是只讀的(例如,displaymode只能為amvtime,而不能改為amvframes)。該控件支持音頻文件(.wav、.mid、.rmi)、影片文件(.avi、.mov、.mmm、.mpeg、.mpg、.mpa、.mpv)和vcd文件(.dat)等。播放時(shí)若用鼠標(biāo)右鍵單擊畫面,則可以直接對(duì)畫面的播放、暫停、停止等進(jìn)行控制,讀者還可以自行在“屬性”欄中對(duì)影片播放進(jìn)行控制設(shè)置,諸如設(shè)置“播放次數(shù)”、“音量”、“影片大小(1/16、1/4、1/2、1、2倍和全屏”、“面板”、“顏色”、“過(guò)濾器”等。這種技術(shù)的實(shí)現(xiàn)實(shí)際上是vb調(diào)用activemovie控制器來(lái)完成的,而activemovie控制器內(nèi)嵌了microsoftmpeg音頻解碼器和microsoftmpeg視頻解碼器。
首先,我們建立一個(gè)“項(xiàng)目”,依次選擇“項(xiàng)目/部件”,然后添加microsoftactivemoviecontrol(amovie.ocx)、microsoftcommandialogcontrol(comdlg32.ocx),控件即出現(xiàn)在“工具箱”中。將上述兩個(gè)控件加進(jìn)窗體,再單擊“菜單”工具欄,建立一個(gè)主菜單項(xiàng):“文件”(file)及其子菜單項(xiàng):“打開(kāi)a畫面”(opena)。
在opena中加入如下代碼:
privatesubopena-click()
onerrorresumenext
commondialog1.filter="videofile(*.dat)∣*.dat∣wavefile(*.wav)∣avifile(*.avi)∣(*.avi)∣moviefile(*.mov)∣(*.mov)∣mediafile(*.mmm)∣(*.mmm)∣midfile(*.mid;*.rmi)∣(*.mid;*.rmi)∣mpegfile(*.mpeg)∣(*.mpeg)∣allfile(*.*)∣*.*"
commondialog1.filterindex=1
commondialog1.showopen
activemove1.filename=commondialog1.filename
activemove1.height=form1.height
activemove1.width=form1.width
activemove1.run
endsub
這是對(duì)單個(gè)的activemovie1進(jìn)行控制。還可以在“文件”(file)中依次加入子菜單:“打開(kāi)b畫面”(openb)、“打開(kāi)c畫面”(openc),并相應(yīng)地加入activemovie2、activemovie3等多個(gè)畫面,將上述程序代碼略為改動(dòng)后加入。這樣,當(dāng)您按下f5鍵即運(yùn)行程序,打開(kāi)您想要播放的vcd文件就可以欣賞vcd了。在屏幕上單擊右鍵,還可以控制畫面呢!
現(xiàn)在是否就滿足了呢?不行!我們?cè)僭黾右粋€(gè)用鼠標(biāo)任意拖動(dòng)屏幕的功能:
privatesubactivemovie1-mousedown(buttonasinteger,shiftasinteger,xassingle,yassingle)
activemovie1.drag1
x1=x
y1=y
endsub
我們還增加了一個(gè)定義任意播放時(shí)間的主菜單項(xiàng):“時(shí)間”(time)及其子菜單項(xiàng):“畫面a時(shí)間”(settimea):
privatesubsettimea-click()
onerrorresumenext
dimrasinteger
r=inputbox("請(qǐng)輸入時(shí)間(分鐘:0-60)")
r=r*60
activemovie1.currentposition=int(r)
activemovie1.run
endsub
currentposition是控制vcd播放的時(shí)間:(1)activemovie1.currentposition=0(從頭開(kāi)始);(2)activemovie1.currentposition=900(15分鐘后);(3)activemovie1.currentpo-sition=1800(30分鐘后)。依次類推,但是不能超過(guò)60分鐘。
我們?cè)僭黾右粋€(gè)主菜單項(xiàng):“屏幕”(screen)及其子菜單項(xiàng):“全屏a”(fullscreena),用來(lái)控制屏幕大小:
privatesubfullscreena-click()
onerrorresumenext
activemovie1.fullscreenmode=true
activemovie1.run
activemovie1.moviewindowsize=amvmaximized
endsub
fullscreenmode用來(lái)控制畫面是否為全屏,當(dāng)它為true時(shí)則全屏方式播放vcd,為false時(shí)則取消全屏方式。
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。
我們可以隨意控制屏幕了。下面,讓我們?cè)侔崖曇艨刂埔幌掳桑?/p>
microsoftactivemovie控件2.0版的確比1.2、1.0改善不少!1.2、1.0版在我的創(chuàng)新awe64頂級(jí)聲卡中的表現(xiàn)很不盡人意,但2.0版卻把我拉“科達(dá)”音箱功能在創(chuàng)新awe64的驅(qū)動(dòng)下發(fā)揮得淋漓盡致!想必microsoft公司對(duì)activemovie控制器中內(nèi)嵌的mpeg音頻解碼器下了苦功!
我們?cè)诓藛沃性黾又鞑藛雾?xiàng):“聲音”及其子菜單項(xiàng)“增加”(soundadd棗快捷鍵設(shè)置為f4)和“減少”(soundduce棗快捷鍵設(shè)置為f5),分別用來(lái)控制聲音的增強(qiáng):
privatesubsoundadd-click()
activemovie1.volume=activemovie1.volume+100
endsub
privatesubsoundduce-click()
activemovie1.volume=activemovie1.volume-100
endsub
當(dāng)然,我們還想增加“靜音”(soundno)功能。經(jīng)我反復(fù)試驗(yàn),當(dāng)activemovie1.volume=-4000時(shí)效果最好!
我們還需要讓vcd播放完后乖乖地“自動(dòng)重播”(autoreplay):
privatesubautoreplay-click()
activemovie1.autorewind=true
’autorewind設(shè)置播放時(shí)是否“自動(dòng)播放”
endsub
為了讓vcd播放時(shí)交替“顯示幀”(showframe)或“顯示時(shí)間”(showtime),可在displaymode中進(jìn)行設(shè)置:
privatesubshowframe-click()
onerrorresumenext
activemovie1.displaymode=amvframes
endsub
privatesubshowtime-click()
onerrorresumenext
activemovie1.displaymode=amvtimes
endsub
經(jīng)過(guò)上面的設(shè)計(jì),功能也湊合了。行了嗎?別急!我們還想將界面搞得漂亮一點(diǎn)。例如,增加工具欄,加強(qiáng)鼠標(biāo)右鍵的功能和畫面中的雙擊功能等。
如果我們想在vcd畫面中單擊右鍵彈出菜單,則可添加如下代碼:
privatesubactivemovie1-mousedown(buttonasinteger,shiftasinteger,xassingle,yassingle)
ifbutton=2thenpopupmenumenuok
endsub
其中,menuok是我們?cè)诓藛沃蓄~外增加的,子菜單內(nèi)容可自定義(但要記住在設(shè)計(jì)時(shí)將名為“menuok”的菜單設(shè)置成不可見(jiàn))。例如:(1)控制vcd“暫停”:activemovie1.parse;(2)控制vcd“運(yùn)行”:activemovie1.run;(3)控制vcd“停止”:activemovie1.stop;(4)控制vcd“自動(dòng)播放”:activemovie1.autostart=true。
activemovie還有非常有用的其它屬性:
(1)allowchangedisplaymode:運(yùn)行時(shí)是否允許改變顯示的模式;
(2)allowhidecontrols:運(yùn)行時(shí)顯示/隱藏控制面板;
(3)allowhidedisplay:運(yùn)行時(shí)顯示/隱藏顯示面板;
(4)appearance:設(shè)置面板的外觀(平面或3d);
(5)autostart:設(shè)置打開(kāi)vcd文件后是否“自動(dòng)播放”;
(6)enablecontextmenu:當(dāng)在畫面中右鍵單擊時(shí)是否允許出現(xiàn)控制菜單(設(shè)成false時(shí)可以顯示您自行設(shè)計(jì)的控制菜單);
(7)filename:設(shè)置activemovie播放的文件名;
(8)playcount:設(shè)置播放次數(shù);
(9)rate:設(shè)置播放時(shí)的速率,為1時(shí)為正常播放,大于1時(shí)為快進(jìn)(過(guò)大時(shí)可能無(wú)聲、無(wú)影);
(10)selectionstart:設(shè)置播放的開(kāi)始位置(缺省值為0);
(11)selectionend:設(shè)置播放的結(jié)束位置(缺省值為-1);
(12)showcontrols:顯示/隱藏控制面板;
(13)showdisplay:顯示/隱藏顯示面板;
(14)showpositioncontrols:在控制面板中顯示/隱藏位置按鈕;
(15)showselectioncontrols:在控制面板中顯示/隱藏選擇按鈕;
(16)showtracker:在控制面板中顯示/隱藏音軌欄;
(17)tooltiptext:當(dāng)光標(biāo)停留在畫面時(shí)出現(xiàn)的提示文字。
我們除了可用microsoft的activemovie控件進(jìn)行開(kāi)發(fā)外,還可以用mciwnd控件來(lái)進(jìn)行開(kāi)發(fā)(可惜二者不能同時(shí)使用。換言之,單純用mciwnd無(wú)法制作畫中畫,但mciwnd可以和activemovie“和平共處”,這樣我們就可以用mciwnd制作一個(gè)“特別版vcd”。值得一提的是,mciwnd聲音解碼非常出色,不愧“師出名門”棗xing)。這種技術(shù)的實(shí)現(xiàn)實(shí)際上是vb借助于xing的mci驅(qū)動(dòng)程序來(lái)實(shí)現(xiàn)的,如果沒(méi)有xing的dll程序運(yùn)行時(shí)就會(huì)出錯(cuò)。但這種技術(shù)實(shí)現(xiàn)得非常巧妙,比用vb中的ole技術(shù)來(lái)得更加隱蔽,可以設(shè)計(jì)成自己的vcd播放程序。
如果動(dòng)畫控件mciwnd不在工具欄上,可按如下方法進(jìn)行添加:
(1)從“項(xiàng)目”中選擇“部件”,再選中控件mciwndcontrol(mciwndx.ocx),mciwnd控件即出現(xiàn)在“工具箱”中。
mciwnd控件的屬性有:
1)autosizemovie:控制畫面是否自動(dòng)適應(yīng)窗口,為false可能會(huì)遮掩掉部分畫面,結(jié)合autosizewindows使用;
2)autosizewindows:控制畫面是否自動(dòng)適應(yīng)原來(lái)的影片的大小,為false時(shí)可能會(huì)擠壓或拉長(zhǎng)畫面,使畫面變形,結(jié)合autosizemovie使用;
3)defaultcontextmenuenabled:當(dāng)在畫面中右鍵單擊時(shí)是否允許出現(xiàn)控制菜單(缺省值為true,這樣您將不能觸發(fā)鼠標(biāo)右鍵的mousedown、mouseup和dblclick事件;設(shè)成false時(shí)可以顯示您自行設(shè)計(jì)的控制菜單);
4)filename:指定設(shè)備所要播放的文件;
5)menu:顯示/隱藏播放條上的控制菜單并設(shè)置在控制面板上單擊右鍵時(shí)是否彈出控制菜單;
6)playbar:顯示/隱藏播放條;
7)positionstring:返回打開(kāi)的mci設(shè)備的當(dāng)前位置;
8)record:設(shè)置控制菜單的“保存”命令是否可用;
9)repeat:設(shè)置播放時(shí)是否“自動(dòng)重播”;
10)speed:設(shè)置播放時(shí)的速率,為1000時(shí)表示正常播放,大于1000時(shí)為快進(jìn)(過(guò)大時(shí)可能無(wú)聲、無(wú)影),小于1000時(shí)為慢進(jìn);
11)tooltiptext:返回/設(shè)置當(dāng)鼠標(biāo)停留在畫面時(shí)的文本;
12)timefreq:指定時(shí)間周期;
13)volume:設(shè)置mci設(shè)置的聲音大小,1000為正常值;
14)zoom:設(shè)置畫面的縮放率。
在新建窗體上添加一個(gè)mciwnd控件,并在控件上單擊鼠標(biāo)右鍵,選取“屬性”(或直接在屬性欄中進(jìn)行設(shè)置),在filename中設(shè)置您需要播放的vcd文件,按f5鍵則開(kāi)始運(yùn)行。然后單擊“播放”鍵,就會(huì)自動(dòng)播放vcd。右鍵單擊圖像,可以直接對(duì)圖像的播放、暫停等進(jìn)行控制,并且可以在播放時(shí)直接設(shè)置屏幕大小(1/2屏、正常屏幕、倍屏)和控制音量,并對(duì)畫面進(jìn)行打開(kāi)、保存、關(guān)閉、復(fù)制、配置(顯示xing的有關(guān)信息)等操作。但是,要想更好地控制畫面,我們還得編程,程序參見(jiàn)activemovie控件的編程。
令人鼓舞的是,該控件幾乎支持所有上述的多媒體文件。在“命令”行中可直接輸入豐富的mci指令(如基本的play、close、stop、open、info、capability、pause、put、record、save、resume、seek、set等等。)
怎么樣?您的vcd播放器可以橫空出世了吧!?如果您覺(jué)得意猶未盡的話,則還可以用windowsapi函數(shù)進(jìn)行開(kāi)發(fā),只不過(guò)api所能控制的就簡(jiǎn)單多了(windowsapi函數(shù)也是借用mci驅(qū)動(dòng)程序來(lái)實(shí)現(xiàn)的。)
windows中mciexecute函數(shù)支持wav、rmi、mid、avi(可以有聲音)等文件。可在聲明中加入如下代碼:
privatedeclarefunctionmciexecutelib"winmmm.dll"(byvallpstrcommandasstring)aslong
privatesubform-load()
dimx
x=mciexecute("playe:\mpegav\music01.dat")
’如果您的vcd中mpegav目錄下的文件名不是music01.dat,則改為avseq01.dat(下同)
endsub
按f5運(yùn)行程序即自動(dòng)播放vcd。
windows中mcisendstring函數(shù)同樣可以播放上述類型的文件。在聲明中加入如下代碼:
privatedeclarefunctionmcisendstringlib"winmmm.dll"alias"mcisendstringa"(byvallpstrcommandasstring,byvallpstrreturnstringasstring,byvalureturnlengthaslong,byvalhwndcallbackaslong)aslong
privatesubform-load()
dimx
x=mcisendstring("playe:\mpegav\music01.dat",0&,0,0)
endsub
按f5運(yùn)行程序也自動(dòng)播放vcd。
再給出一個(gè)小程序,運(yùn)行時(shí)它能自動(dòng)播放您的cd音樂(lè),然后將控制權(quán)還給vb應(yīng)用程序,但不影響計(jì)算機(jī)的其它操作(當(dāng)然您的cd-rom中要有cd才行!)。在聲明中加入如下代碼:
privatedeclarefunctionmcisendstringlib"winmmm.dll"alias"mcisendstringa"(byvallpstrcommandasstring,byvallpstrreturnstringasstring,byvalureturnlengthaslong,byvalhwndcallbackaslong)aslong
privatesubform-load()
s$="playcdaudioa’
x&=mcisendstring(s$,0&,0,0)
endsub
上述程序在中文windows95osr2、VisualBasic中文專業(yè)版下調(diào)試通過(guò)。
多媒體是明天計(jì)算機(jī)的核心。極好的聲音效果和音樂(lè)、完全的運(yùn)動(dòng)視頻和動(dòng)畫給我們所需的信息帶來(lái)了生機(jī)和活力,很難相信沒(méi)有圖像、聲音和動(dòng)畫的程序是完美的。通過(guò)上面的討論,我們會(huì)由衷地嘆服:在visualbasic中控制各種多媒體設(shè)備是多么地輕而易舉,簡(jiǎn)直是信手拈來(lái)!