內容提要
可視動畫控件ActiveMovie是Microsoft公司開發的ActiveX控件,從開始的1.0版、1.2版到現在的2.0版,功能上已經有了很大的改進。由於該控件內嵌了Microsoft MPEG音頻解碼器和Microsoft MPEG視頻解碼器,所以能夠很好地支持音頻文件和視頻文件,用其播放的VCD效果就很好。另外,播放時若用鼠標右鍵單擊畫面,可以直接對畫面的播放、暫停、停止等進行控制,讀者還可以自行在"屬性"欄中對影片播放進行控制設置,用起來非常方便。 在Microsoft公司推出的VC++6.0中已經包含了ActiveMovie控件的2.0版,本文將介紹在VC++6.0下利用這個控件實現自動連續播放多媒體。
關鍵詞:VC++ ActiveMovie 多媒體 連續播放
隨著計算機技術的發展,人們不僅使用單一的文字作為信息的載體,還可以通過各種各樣的媒體來傳遞、存儲信息。我們通常所說的"媒體"(Media)包括其中的兩點含義。一是指信息的物理載體(即存儲和傳遞信息的實體),如書本、掛圖、磁盤、光盤、磁帶以及相關的播放設備等;另一層含義是指信息的表現形式(或者說傳播形式),如文字、聲音、圖像、動畫等。多媒體計算機中所說的媒體,是指後者而言,即計算機不僅能處理文字、數值之類的信息,而且還能處理聲音、圖形、電視圖像等各種不同形式的信息。
對各種信息媒體的"處理",是指計算機能夠對它們進行獲取、編輯、存儲、檢索、展示、傳輸等各種操作。一般而言,具有對多種媒體進行處理能力的計算機可稱為多媒體計算機。
多媒體的英文單詞是Multimedia,它由media和multi兩部分組成。一般理解為多種媒體的綜合。多媒體技術不是各種信息媒體的簡單復合,它是一種把文本(Text)、圖形(Graphics)、圖像(Images)、動畫(Animation)和聲音(Sound)等形式的信息結合在一起,並通過計算機進行綜合處理和控制,能支持完成一系列交互式操作的信息技術。多媒體技術的發展改變了計算機的使用領域,使計算機由辦公室、實驗室中的專用品變成了信息社會的普通工具,廣泛應用於工業生產管理、學校教育、公共信息咨詢、商業廣告、軍事指揮與訓練,甚至家庭生活與娛樂等領域。
我們可以利用MCI控件開發此項目,但現在介紹一種更簡便的方法,用ACTIVEMOVIE CONTROL OBJECT控件來實現的方法。
一、 常見多媒體格式
可視動畫控件ActiveMovie Control Object 是Microsoft公司開發的ActiveX控件,為程序員提供了在該層次上控制媒體設備接口的能力。它包含一組高層次的獨立於設備的命令,可以控制音頻和視頻外設,我們不必關心具體的設備便可以對CD、視盤機、波形音頻設備、視頻播放設備和MIDI設備等媒體設備進行控制,也可以理解成設備面板上的一排按鍵,通過選擇不同的按鍵(發送不同的命令)即可讓設備完成各種功能,而不必關心設備的內部實現,它是一種主要實現音頻播放的方法。
1、 波形音頻
波形音頻是一種電子數字化聲音,是計算機播放音頻的一種重要的形式,它存儲的聲音的波形信息,特點是:當播放播形音頻時,不管播放文件的設備是何種類型,都會得到相似的聲音。波形音頻文件通常以.wav作為文件擴展名。由於采用波形音頻存儲電子需要大量的存儲空間,因此它一般只用於短時間的聲音播放。
2、 MIDI音樂
MIDI(Musical Instrument Digital Interface)在多媒體音頻中占有重要的位置,是播放和錄制音樂的國際標准,它確定了連接音樂設備的電纜線、硬件和通信協議。多媒體計算機只需具有MIDI接口聲卡和MIDI合成器,就具有處理MIDI的功能。
MIDI在處理音樂時是將MIDI音樂設備上產生的活動編碼記錄下來,將這些數據傳遞到MIDI合成器上就能中現原來的演奏。MIDI的消息有兩種類型:狀態字節和數字字節。狀態字節描述發送的類別(動作和函數),數字字節總是跟在狀態字節後,表示發送消息的實際值。數值字節的個數取決於狀態字節表示的消息類型。MIDI通過通道字節最高位區別這兩種類型。最高位為1表示狀態字節,最高位為0表示數字字節。
3、 CD音頻
CD音頻采用紅皮書標准,通過CD-ROM驅動器來播放CD音頻。CD音頻需要的存儲量大,一張光盤大約能夠存儲10首歌,70分鐘音頻左右。
在一般情況下,整個光盤都用來存儲CD音頻數據,並劃分為多個音軌,軌道的具體長度可以不定,通常一個音軌對應一首曲目。CD音頻的長度由分、秒、幀的形式來衡量,最小的單位為幀,每一幀為1/75秒,一分等於60秒。
4、 數字視頻
數字視頻(Digital Video)使用數據信息在計算機上實現動畫的效果,它是利用人眼睛的視覺暫留形成的,使人們連續圖像效果所需的最低播放速度是24幅/秒,播放速度越快,數字視頻給人的視覺連續性效果越好。存儲視頻影像需要巨大的磁盤空間,一般來講,1秒鐘全屏視頻信號需要大約28MB的空間。為了實現連續的視頻播放,不僅需要有足夠的空間來存儲視頻音像信息,還需要保證硬盤有28MB/秒的傳播速度。
Audio_Video_Interleaved(AVI)文件格式是由微軟提出的在WINDOWS下存儲視頻信息的標准。AVI文件以一系列的位圖來村存儲視頻信息,並同時在文件中假如一數字形式存儲數字化視頻信息,它實際上由一組信息流組成的文件。
二、ACTIVEMOVIE CONTROL OBJECT的常用屬性
1、播放文件的函數:
void CActiveMovie3::Run()
{
InvokeHelper(0x60020001, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}
2、暫停播放的函數:
void CActiveMovie3::Pause()
{
InvokeHelper(0x60020002, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}
4、停止播放的函數:
void CActiveMovie3::Stop()
{
InvokeHelper(0x60020003, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}
5、獲得文件的函數:
CString CActiveMovie3::GetFileName()
{
CString result;
InvokeHelper(0xb, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
return result;
}
6、設置文件的函數:
void CActiveMovie3::SetFileName(LPCTSTR lpszNewValue)
{
static BYTE parms[] = VTS_BSTR;
InvokeHelper(0xb, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,
lpszNewValue);
}
7、獲得播放位置的函數:
double CActiveMovie3::GetCurrentPosition()
{
double result;
InvokeHelper(0xd, DISPATCH_PROPERTYGET, VT_R8, (void*)&result, NULL);
return result;
}
8、設置播放位置的函數:
void CActiveMovie3::SetCurrentPosition(double newValue)
{
static BYTE parms[] = VTS_R8;
InvokeHelper(0xd, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
9、獲得音量的函數:
long CActiveMovie3::GetVolume()
{
long result;
InvokeHelper(0x13, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}
10、設置音量的函數:
void CActiveMovie3::SetVolume(long nNewValue)
{
static BYTE parms[] = VTS_I4;
InvokeHelper(0x13, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, nNewValue);
}
11、設置自動開始播放的函數:
void CActiveMovie3::SetAutoStart(BOOL bNewValue)
{
static BYTE parms[] = VTS_BOOL;
InvokeHelper(0x28, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, bNewValue);
}
三、 建立工程
利用 VC++6.0的AppWizard生成一個基於對話框的工程Player,去掉對話框上的"確定" 和"取消"按鈕,並加入ActiveMovie控件(通常情況下ActiveMovie控件並不出現在控件面板中,可在菜單中依次選擇"project- >Add To Project- >Components And Controls",在出現的"Components And Controls Gallery"對話框中打開"Registered Active Controls"文件夾,選中"ActiveMovie Control Object"選項,按"Insert"後關閉該對話框,ActiveMovie控件便出現在控件面板中),調整好控件在對話框中的位置。為了能夠控制控件的操作,應為對話框設計三個按鈕("選擇曲目"、"循環播放"、"關閉"),一個列表框。
四、添加代碼
首先利用ClassWizard為ActiveMovie控件聲明一個變量m_ActiveMovie。然後為 "選擇曲目"按鈕聲明一個變量m_ChoiceFile,為"循環播放"按鈕聲明一個變量m_Play,為"關閉"按鈕聲明一個變量m_Close,為一個列表框聲明一個變量m_list。
1、 為了將所需播放的文件加入列表框,我們采用OnChoiceFile()函數來顯示"打開"對話框,通過該對話框選擇要執行的文件。以便為以後調用作准備。代碼如下:
void Cplayer::OnChoiceFile( )
{
// TODO: Add your command handler code here
CFileDialog fileDialog( TRUE,"*.OCX",NULL,NULL,"|所有文件(*.*)|*.*||");
if (fileDialog.DoModal() == IDOK)
{
//選擇文件
Cstring m_FileName=fileDialog.GetPathName();
m_list.AddString(m_FileName); //加入到列表框。
}
}
2、 為了循環播放,我們利用定時器來工作,采用OnPlay()函數來激活定時器,代碼如下:
void Cplayer::OnPlay()
{
// TODO: Add your command handler code here
//設置定時器
SetTimer(0,500,NULL);
}
void CMy1Dlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CString m_filename; //定義文件變量
double CurPos=m_ActiveMovie.GetCurrentPosition(); //獲得播放位置
if(CurPos= = 0)
{
//選擇列表框的第一個文件
m_list.SetCurSel(0);
m_list.GetText(0,m_filename);
//設置自動播放
m_ActiveMovie.SetAutoStart(1);
//設置文件
m_ActiveMovie.SetFileName(m_filename);
//播放
m_ActiveMovie.Run();
m_list.GetCurSel();
//插入列表框最後
m_list.InsertString(-1,m_filename);
//刪除用過的文件
m_list.DeleteString(0);
}
CDialog::OnTimer(nIDEvent);
}
3、 關閉播放,我們可以利用函數OnClose()來實現,代碼如下:
void Cplayer::OnClose()
{
// TODO: Add your command handler code here
//設置定時器
KillTimer(0);
m_ActiveMovie.Stop();
}
四、結束語我們知道:
目前很多程序介紹的播放器,只能播放單個音頻文件,很少講述多個文件播放,本文試著通過控件,介紹連續播放音頻文件的方法。我們還可以根據上述提供函數常用屬性,解決程序中間的暫停、設置音量,還可以設置平衡、全屏播放等,希望通過本文給大家一個啟示。
參考文獻:1、美 Paul Perry 陳向群 等譯《多媒體開發指南》 清華大學出版社
2、 美 Peter Norton, Rob McGregor 孫鳳英 等譯《MFC開發Windows95/NT4應用程序》 清華大學出版社 1998
3、周敬利 《多媒體聲卡技術及應用》 電子工業出版社 1998