首页 理论教育 VisualC++高级编程-CDigitalVideo类实现

VisualC++高级编程-CDigitalVideo类实现

时间:2023-11-16 理论教育 版权反馈
【摘要】:该函数的主要功能是在视频设备的当前位置播放视频,视频设备由CDigitalVideo类中的成员变量m_wDeviceID得到。在发送消息时直接使用类CDigitalVideo中的成员变量m_wDeviceID来指定需要停止和关闭的设备。程序清单7-6CDigitalVideo::Close()函数3. 类的功能增强函数Stop()函数。

VisualC++高级编程-CDigitalVideo类实现

1. 类的构造函数和析构函数

类的构造函数在生成类对象时自动被调用,所以通常在构造函数中对类的成员变量进行初始化。当然,在类对象被构造时,还没有打开具体的设备,m_wDeviceID没有被赋值,所以设为NULL,同时其它的成员变量设为FALSE。构造函数的实现见程序清单7-2。

程序清单7-2 构造函数

类的析构函数在类对象被删除时自动被调用,通常用来对类对象进行一些释放内存等后置处理工作。为此,析构函数调用类的Close()函数来关闭已经打开的视频设备,Close()函数在后面进行了解释。析构函数的实现见程序清单7-3。

程序清单7-3 析构函数

2. 基本功能的成员函数

(1)Open()函数。

Open()函数用来打开多媒体视频设备。该函数传入的参数包括:打开的“.avi”文件的文件名称和文件的路径,播放视频的窗口指针pWnd和播放视频文件的左上角位置(left,top)及视窗大小(width,height)。该函数返回1表示打开视频文件成功,否则返回0。该函数在结构上包括以下几个部分:

初始化CDigitalVideo类的成员变量。

判断传入的文件名及路径是否有效。

打开设备并得到设备ID。

初始化打开的设备,设置设备播放以帧为单位,从第一帧开始播放,并根据传入的left,top,width,height初始化播放视频的窗口。

Open()函数的实现见程序清单7-4。

程序清单7-4 CDigitalVideo::Open()函数

在Open()函数中采用了MCI_DGV_OPEN_PARMS结构作为打开设备的参数,指定播放的文件为“AVIVideo”类型,文件名(包含路径)为FileName.GetBuffer(0),播放窗口为pWnd->m_hWnd,设置好后发送MCI_OPEN命令消息,并获得打开设备的设备ID。在初始化设备的播放信息中,采用了MCI_SET命令消息设置播放设备以帧为单位播放视频,MCI_SEEK命令消息把视频播放视频的起始位置设为第一帧,MCI_PUT命令消息,采用MCI_DGV_PUT_PARMS结构指定视频播放的窗口的位置和大小。下面给出在Open函数中使用的结构定义及说明:

① MCI_DGV_OPEN_PARMS结构。

其结构定义如下:

其中,数据成员dwCallback 的低位指定了处理MCI_NOTIFY 消息的窗口句柄,wDeviceID用来存放指定的多媒体设备ID,是设备的惟一标识;lpstrDeviceType 指定了设备的类型;lpstrElementName和lpstrAlias可以用来指定可选设备的别名;dwStyle指定视频输出窗口的风格;hWndParent用来指定视频输出窗口的父窗口句柄。如果在打开设备之前没有获得设备的ID信息,则可先设置wDeviceID为NULL,然后调用mciSendCommand函数,当函数成功返回时,从MCI_DGV_OPEN_PARMS结构中的wDeviceID数据成员可以获得被正确打开的设备ID,这是一种安全获得设备ID的方式。

② MCI_DGV_SET_PARMS结构。

其结构定义如下:

其中,dwCallback的低位指定处理MCI_NOTIFY消息的窗口句柄;dwTimeFormat用于指定时间格式;dwAudio指定输出的声道;dwFileFormat、dwSpeed分别指定视频文件的格式和播放速度。

③ MCI_DGV_PUT_PARMS结构。

其结构定义如下:

其中,dwCallback的低位指定处理MCI_NOTIFY消息的窗口句柄;rc数据成员用来惟一确定视频播放窗口的位置和大小。

(2)Play()函数。

Play()函数用来完成视频的播放,由于大部分有关播放的初始信息都在Open()函数中实现了,所以该函数显得比较简单。该函数的主要功能是在视频设备的当前位置播放视频,视频设备由CDigitalVideo类中的成员变量m_wDeviceID得到。在该函数中可以设置播放的方式——是否需要循环播放,是否需要全屏幕播放。Play()函数的实现见程序清单7-5。

程序清单7-5 CDigitalVideo::Play()函数

在该播放函数中使用了MCI_PLAY命令消息,该命令消息对视频设备操作的参数由结构体MCI_DGV_PLAY_PARMS来传送。下面语句是从安全的角度来考虑的,用来防止当前的视频位置超出了视频文件的总帧数。

如果不希望在当前位置进行播放,可通过设置视频文件的当前位置为新位置来达到目的,GetFrame()和GetFrames()函数的实现将在后面讲到。

MCI_DGV_PLAY_PARMS结构定义如下:

播放命令的消息数据结构相对简单一些,dwCallback数据成员和前面MCI_DGV_OPEN_PARMS数据结构含义相同;而dwFrom和dwTo数据成员分别表示播放多媒体文件的开始位置和结束位置,通常用帧数来表示。

(3)Close()函数。

Close()函数用来关闭多媒体视频设备,在关闭之前必须先使视频设备处于停止状态。该函数分别发送MCI_STOP和MCI_CLOSE命令消息来实现这两个操作。在发送消息时直接使用类CDigitalVideo中的成员变量m_wDeviceID来指定需要停止和关闭的设备。应该注意的是,在最后必须把类的成员变量m_bOpen,m_bPause,m_bPlaying,m_wDeviceID置为FALSE或NULL,用来通知程序的其它部分设备已经关闭。Close()函数的实现见程序清单7-6。

程序清单7-6 CDigitalVideo::Close()函数

3. 类的功能增强函数

(1)Stop()函数。

Stop()函数用来发送MCI_STOP命令消息来停止视频的播放。在函数功能上,停止播放函数与暂停播放函数的区别在于:停止设备后,设备处于等待关闭状态,视频文件的指针被设置在视频文件的开始;而暂停后,设备处于等待播放状态,视频文件的指针保留在文件的当前位置。Stop()函数的实现见程序清单7-7。

程序清单7-7 CDigitalVideo::Stop()函数

(2)Pause()函数。

Pause()函数使用MCI_DGV_PAUSE_PARMS结构作为参数向设备发送MCI_PAUSE命令消息,用来暂停视频设备的播放。Pause()函数的实现见程序清单7-8。

程序清单7-8 CDigitalVideo::Pause()函数

MCI_DGV_PAUSE_PARMS结构定义如下:

(www.xing528.com)

其中,dwCallback的低位指定处理MCI_NOTIFY消息的窗口句柄。

(3)Forward()和Backward()函数。

Forward()和Backward()函数的主要功能是操纵视频设备的播放,使视频向前或向后跳过指定的帧数并继续播放。通过向视频设备发送MCI_SEEK命令消息也可以实现该功能,只是需要先获得该视频的当前位置,然后向视频设备发出MCI_SEEK命令消息,在当前位置加上或减去需要前进或后退的帧数,从所得的新位置播放视频即可达到目的。MCI专门为数字视频提供了MCI_STEP命令消息来实现前进和后退的功能,调用专门的函数会提高程序运行的稳定,在实现上会显得直观。

Forward()函数的实现见程序清单7-9。

程序清单7-9 CDigitalVideo::Forward()函数

MCI_DGV_STEP_PARMS结构定义如下:

其中,dwCallback的低位指定处理MCI_NOTIFY消息的窗口句柄;dwFrames为每次跳过的文件长度,一般用帧数来描述。

Backward()函数的实现见程序清单7-10。

程序清单7-10 CDigitalVideo::Backward()函数

4. 媒体操作成员函数

(1)SetSpeed()函数。

SetSpeed()函数通过MCI_DGV_SET_PARMS结构体向视频设备发送MCI_SET命令消息来设置播放速度。设置MCI_DGV_SET_SPEED标识,并把MCI_DGV_SET_PARMS结构体的dwSpeed成员设置为指定的参数,该参数的单位是“帧/分钟”,播放时,由于不同的计算机的性能不一样,实际播放速度不一定会和所设置的速度完全吻合,会有一些误差,但误差程度可以忍受。SetSpeed()函数的实现见程序清单7-11。

程序清单7-11 CDigitalVideo::SetSpeed()函数

(2)SeekTo()函数。

SeekTo()函数向视频设备发送MCI_SEEK命令消息,将数字视频的播放跳到任意位置。这个函数给将来的视频设计提供了灵活的手段,特别有利于实际应用中通过拖动滑动块来改变视频的播放位置。该函数对视频设备的操作是通过将参数传递给MCI_SEEK_PARMS结构体实现的,赋给该结构体dwTo成员为指定的视频播放位置,然后再通过MCI_SEEK命令消息通知视频设备。在该函数体中,如果视频的状态是正在播放,则需要先暂停,再对视频设备进行Seek操作。Seek操作结束后还原视频的初始播放状态。SeekTo()函数的实现见程序清单7-12。

程序清单7-12 CDigitalVideo::SeekTo()函数

5. 信息查询成员函数

(1)GetFrames()函数。

GetFrames()函数用来获得视频的总帧数。判断当前滑块应处的位置、判断视频设备的总播放时间、判断视频设备是否播放结束等都需要获得视频的总帧数信息。该函数在向视频设备发送MCI_STATUS命令消息前,首先把MCI_DGV_STATUS_PARMS结构体的成员dwItem设置为MCI_STATUS_LENGTH,表示需要获得视频的总长度信息,该长度信息用视频的总帧数来描述,所得到的总帧数通过dwReturn获得。GetFrames()函数的实现见程序清单7-13。

程序清单7-13 CDigitalVideo::GetFrames()函数

MCI_DGV_STATUS_PARMS结构定义如下:其中,dwCallback的低位指定处理MCI_NOTIFY消息的窗口句柄;dwReturn用来存放指向返回信息缓冲区的指针;dwItem用来指定查询项;dwTrack指定音轨数目,该参数与视频操作无关;lpstrDrive指定可用的磁盘操作空间;dwReference指定视频文件最近的参考位置。

dwReturn返回要查询信息的值,具体是什么信息是由成员dwItem来决定。dwItem的取值和dwReturn的返回值对应关系见表7-3。

表7-3 dwItem的取值和dwReturn的返回值对应关系

(2)GetFrame()函数。

GetFrame()函数用来获得视频当前的播放位置。获得当前的播放位置是视频播放的一个非常重要的参数,它是视频其它操作必须的信息。该函数通过MCI_DGV_STATUS_PARMS结构体向视频设备发送MCI_STATUS命令消息。MCI_STATUS_POSITION表示需要查询的信息是视频设备的当前播放位置,当前播放位置用帧来描述。GetFrame()函数的实现见程序清单7-14。

程序清单7-14 CDigitalVideo::GetFrame()函数

(3)GetSpeed()函数。

GetSpeed()被用来查询视频的播放速度信息,并用来计算视频播放的时间。该函数用来得到视频的播放的速度,其单位是“帧/分钟”。函数通过MCI_DGV_STATUS_PARMS向视频设备发送MCI_STATUS命令消息,通过得到返回结构数据的数据成员dwReturn获得视频播放的速度信息。MCI_DGV_STATUS_SPEED表示要返回视频的播放速度信息。GetSpeed()函数的实现见程序清单7-15。

程序清单7-15 CDigitalVideo::GetSpeed()函数

(4)IsPlaying()函数和GetPause()函数。

IsPlaying()函数用来返回视频是否播放的状态信息,如果处于播放状态则返回TRUE,否则返回FALSE。GetPause()函数用来查询视频是否处于暂停状态,如果处于暂停状态,则返回TRUE,否则返回FALSE。这两个函数通过MCI_DGV_STATUS_PARMS向视频设备发送MCI_STATUS命令消息。MCI_STATUS_MODE表示需要查询视频的模式状态。MCI_MODE_PLAY 表示视频处于播放状态,MCI_MODE_PAUSE表示视频处于暂停状态。IsPlaying()和GetPause()函数的实现见程序清单7-16。

程序清单7-16 CDigitalVideo::IsPlaying()和GetPause()函数

在进行视频播放时,我们需要确定视频播放的位置并得到视频设备播放时的正常视频窗口大小,这样便可以在用户使用多媒体播放器的时候采用原视频窗口大小来播放视频,便于达到最好的播放效果。

(5)GetWidth()和GetHeight()函数。

GetWidth()函数用来获得视频窗口的宽度,GetHeight()函数用来获得视频的高度。两个函数都通过MCI_DGV_WHERE_PARMS结构体向视频设备发送MCI_WHERE命令消息。发送消息后,通过 MCI_DGV_WHERE_PARMS结构体中的rc成员返回视频正常播放窗口大小信息。rc.right存放宽度信息,rc.bottom存放高度信息。

GetWidth()函数的实现见程序清单7-17。

程序清单7-17 CDigitalVideo::GetWidth()函数

GetHeight()函数的实现见程序清单7-18。

程序清单7-18 CDigitalVideo::GetHeight()函数

通过以上设计,我们只要定义一个CDigitalVideo对象,就可以实现对视频设备的操作,在得到一个视频设备之后,便可以通过简单的操作得到所需要的信息。如果需要在长100,宽100的区域打开一个视频文件并播放,可以通过下面代码得到实现。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈