所謂動態畫中畫,指的是在大畫面視頻播放時,小畫面在大畫面中也播放另外的畫面,或者是兩個畫面都在做某種活動。
筆者前段時間用VB 5.0開發了一個VCD播放程序,可以實現以下功能:
(1)可以多屏播放,也就是畫中畫功能,可同時播放幾個不同的畫面;
(2)可以同時播放CD-ROM中的視頻音頻文件(當然,在硬盤中播放速度會更快些);
(3)支持多種文件格式(如.dat、.wav、.avi、.mov、.mmm、.mid、.rmi、.mpeg、.mpg、.mpa、.mpv等);
(4)自帶畫面美觀且功能齊全的CD播放程序;
(5)增強了鼠標的右鍵功能,用它可以控制各畫面的大小(1/16、1/4、1/2、1、2倍和全屏)、播放、暫停等;
(6)控制聲音、圖像、時間/幀顯示轉換、自動重播等;
(7)控制條隨意拖動播放,再加上定時播放、自定義播放時間等播放方式,可使您更加愜意地控制VCD;
(8)屏幕可隨意拖動,畫面可任意放縮。
VCD中的影像文件都在光盤的MPEGAV目錄下,文件名只有兩種:AVSEQ01.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 ActiveMovie Control(Amovie.OCX)、Microsoft Commondialog Control(COMDLG32.OCX),控件即出現在“工具箱”中。將上述兩個控件加進窗體,再單擊“菜單”工具欄,建立一個主菜單項:“文件”(FILE)及其子菜單項:“打開A畫面”(OPENA)。
在OPENA中? 如下代碼:
Private Sub OPENA_Click()
On Error Resume Next
CommonDialog1.Filter = "Video File (*.dat)|*.dat|Wave File (*.wav)|*.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
ActiveMovie1.filename = CommonDialog1.filename
ActiveMovie1.Height = Form1.Height
ActiveMovie1.Width = Form1.Width
ActiveMovie1.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.CurrentPosition = 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.MovieWindowSize = amvMaximized;(2)正常大小:ActiveMovie1.MovieWindowSize = amvOriginalSize;(3)倍屏:ActiveMovie1.MovieWindowSize = amvDoubleOriginalSize;(4)1/2屏:
ActiveMovie1.MovieWindowSize = amvOneHalfScreen;(5)1/4屏:ActiveMovie1.MovieWindowSize = amvOneFourthScreen;(6)1/16屏:ActiveMovie1.MovieWindowSize = amvOneSixteenthScreen。
我們可以隨意控制屏幕,下面讓我們再把聲音控制一下吧!
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 = amvTime
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.PAUSE;(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)從“項目”中選擇“部件”,再選中控件MCIWndX Control(MCIWndx.ocx) ,MCIWnd控件即出現在“工具箱”中。
MCIWnd控件的屬性有:
1)AutosizeMovie :控制畫面是否自動適應窗口,為False可能會遮掩掉部分畫面,結合Auotsizewindows使用;
2)Auotsizewindows:控制畫面是否自動適應原來影片的大小,為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)TimerFreq :指定時間周期;
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播放器可以橫空出世了吧!?如果您覺得意猶未盡的話,則還可以用Windows API 函數進行開發,只不過API所能控制的就簡單得多了(Windows API 函數也是借用MCI驅動程序來實現的。)。
Windows 中mciExecute 函數支持wav、rmi、mid、avi(可以有聲音)等文件。可在聲明中加入如下代碼:
Private Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long
Private Sub Form_Load()
Dim x
x = mciExecute("Play e:mpegavmusic01.dat")
如果您的VCD中MPEGAC目錄下的文件名不是MUSIC01.DAT,則改為AVSEQ01.DAT(下同);
End Sub
按F5運行程序即自動播放VCD。
Windows 中mciSendString函數同樣可以播放上述類型的文件。在聲明中加入如下代碼:
Private Declare Function mciSendString Lib "winmm.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 "winmm.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 cdaudio "
x& = mciSendString(s$, 0&, 0, 0)
End Sub
上述程序在中文Windows 95 OSR2、VB 5.0中文專業版下調試通過。
多媒體是明天計算機的核心。極好的聲音效果和音樂、完全的運動視頻和動畫給我們所需的信息帶來了生機和活力,很難相信沒有圖像、聲音和動畫的程序是完美的。通過上面的討論,我們會由衷地嘆服:在Visual Basic中控制各種多媒體設備是多么地輕而易舉,簡直是信手拈來!