現在的位置: 首頁 > 編程語言 > 正文

用VisualBasic實現多畫面播放功能

2020年02月19日 編程語言 ⁄ 共 7474字 ⁄ 字型大小 評論關閉
文章目錄

作者:何發武

  所謂動態畫中畫,指的是在大畫面視頻播放時,小畫面在大畫面中也播放另外的畫面,或者是兩個畫面都在做某種活動。

筆者前段時間用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:\mpegav\music01.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:\mpegav\music01.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中控制各種多媒體設備是多麼地輕而易舉,簡直是信手拈來!

本欄文章均來自於互聯網,版權歸原作者和各發布網站所有,本站收集這些文章僅供學習參考之用。任何人都不能將這些文章用於商業或者其他目的。( xuebuyuan.com )

以上就上有關用VisualBasic實現多畫面播放功能的全部內容,學步園全面介紹編程技術、操作系統、資料庫、web前端技術等內容。

抱歉!評論已關閉.