在VC++中实现自动连续播放多媒体

转载 2011年10月18日 09:39:19
 内容提要

    可视动画控件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

iOS-多媒体-音视频播放、录制 | 拍照 录像

-
  • 1970年01月01日 08:00

VC++中实现自动连续播放多媒体, and DirectX和DirectInput.rar

  • 2012年05月18日 10:54
  • 421KB
  • 下载

在PPT中插入连续播放的视频

昨天准备毕业答辩ppt,突发奇想,想一边表述ppt内容,一边播放视频,以增强答辩的多媒体效果。可在网上查了好久,都只能实现单一页面视频播放,每当翻页时,视频就会重播。这当然不是我想要的功能。 有两种做...
  • baixibao
  • baixibao
  • 2018-03-25 16:04:37
  • 26

一个qt图片自动循环播放的小程序

  • 2009年12月15日 23:34
  • 27KB
  • 下载

微信语音连播的实现思路

最近有同学问到了关于微信语音连播的问题,在这里我将自己模仿微信语音连播的核心代码部分开源出来,供大家参考。仔细阅读,按照代码的思路就可以实现语音连播。 基本的思路就是:使用递归思想。点击语音消息,获...
  • qq_30513483
  • qq_30513483
  • 2016-07-09 10:58:43
  • 2277

android之播放多媒体文件一(播放音频)

android之播放多媒体文件一(播放音频) 在Android 中播放音频文件一般都是使用MediaPlayer 类来实现的,它对多种格式的音 频文件提供了非常全面的控制方法,从而使得播放音乐的工...
  • liu857279611
  • liu857279611
  • 2016-01-26 16:19:45
  • 1195

多媒体处理

如何在VC5下定制多媒体真彩封页  在自己的应用程序定制多媒体真彩封页,可以使应用程序在显示名称和版权特性时丰富程序界面,避免由于应用程序启动前进行大量数据初始化时用户进行较长时间的空等待过程,在给应...
  • u010258235
  • u010258235
  • 2013-10-22 09:09:10
  • 1323

VC++中的计时器及多媒体高精度计时器

Windows计时器是一个非常有用的编程元素,而且计时器的使用非常简单,我们只需要一个时间间隔参数来调用SetTimer函数设置和启动计时器,通过WM_TIMER消息的响应函数进行计时器控制,调用Ki...
  • margin1988
  • margin1988
  • 2015-01-05 14:44:45
  • 1660

VB 循环播放视频文件

用到的控件:commondialog,timer,windows media player
  • u010853701
  • u010853701
  • 2013-05-31 15:38:22
  • 1348

关于HTML的多媒体标签

代码示例如下: ===================================================               多媒体标签         bgso...
  • u010661782
  • u010661782
  • 2015-10-10 10:58:12
  • 529
收藏助手
不良信息举报
您举报文章:在VC++中实现自动连续播放多媒体
举报原因:
原因补充:

(最多只允许输入30个字)