wince下用directx播放音频和视频

本文介绍在WinCE环境下使用DirectX进行音频和视频播放的方法。通过CMedia类封装,仅需几行代码即可实现多媒体文件的播放,并提供播放结束通知及资源释放等关键功能。

 //========================================================================
//TITLE:
//    wince下用directx播放音频和视频
//AUTHOR:
//    norains
//DATE:
//    Monday  14-May-2007
//Environment:
//        WinCE 5.0
//========================================================================

        虽然网上关于wince下如何使用directx播放多媒体文件的资料不多,但WinCE毕竟还属于windows,而桌面系统的directx例子网上信手拈来,并且其中directx的功能方法与之WinCE下差别不大,又本人实在没有信心比他们的轮子造得更为华丽,所以这篇文章就直接切入正题,不介绍directx的结构功能,直接来看看怎么用吧.(其实还是自己懒惰的原因大一些,恩,不过这个和本文的主题没多大关系:-)).
        
        为了方便代码的移植,所以我将directx的操作封装成CMedia类,只要直接调用该类,就可以相当简便地调用directx来播放多媒体文件了.
        
        好,闲话至此,我们以具体代码看看是如何: None.gif        //获取CMedia的实例
None.gif        CMedia *m_pMedia = CMedia::GetInstance();
None.gif        
None.gif        //设置播放的窗口
None.gif        m_pMedia->SetVideoWindow(hWnd);
None.gif        
None.gif        //打开媒体文件
None.gif        m_pMedia->Open(TEXT("A.AVI"));
None.gif        
None.gif        //播放
None.gif        m_pMedia->Play();
None.gif        
None.gif        ...
None.gif        
None.gif        //播放结束后,调用Close释放资源
None.gif        m_pMedia->Open();

        没错,就是六行代码,就这么简单,可以顺利播放媒体文件.在这里要说一下的是,因为我们播放的是视频,需要有一个窗口显示,所以需要调用SetVideoWindow()函数来设置播放窗口.这个播放视频的窗口,可以是普通的窗口,也可以是Picture控件.当然咯,如果是播放音频文件,那么则完全可以无视这个函数.
        
        还有一个最值得注意的地方,当调用Open()成功之后,一定要调用Close()来释放资源,然后才能打开另一个媒体文件.否则,不释放的资源可能会导致很多莫名其妙的后果哦.
                
        等等,代码似乎还不完美,比如说,我想在文件播放之后再接着播放另外一个文件,那么我如何知道什么时候文件已经播放完毕了呢?这时候我们就需要请出SetNotifyWindow().
        
        该函数的作用是设置一个接受消息的窗口,当directx有事件变更时,就会发送指定的消息到指定的窗口,原型如下:
        
        SetNotifyWindow(HWND hWnd, UINT wMsg,long lInstanceData)
        
        hWnd:接收消息的窗口句柄.
        
        wMsg:指定的自定义消息
        
        lInstanceData:消息的参数.
        
        
        那么,现在以接收一个视频播放结束事件的代码片段为例子: None.gif        //自定义一个消息
None.gif        #define WM_GRAPHNOTIFY        (WM_USER + 13)
None.gif        
None.gif        //设置接收消息窗口和消息
None.gif        m_pMedia->SetVideoWindow(hWnd,WM_GRAPHNOTIFY,NULL);
None.gif        
None.gif        ...
None.gif        
None.gif        //这个是消息循环函数
None.gif        LRESULT CMainWnd::WndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
ExpandedBlockStart.gifContractedBlock.gif        ...{
InBlock.gif            switch(wMsg)
ExpandedSubBlockStart.gifContractedSubBlock.gif            ...{
InBlock.gif            
InBlock.gif                ...
InBlock.gif            
InBlock.gif                case WM_GRAPHNOTIFY:
ExpandedSubBlockStart.gifContractedSubBlock.gif                ...{
InBlock.gif                    LONG evCode,evParam1,evParam2;
InBlock.gif                    
InBlock.gif                    //获取此时的directx事件
InBlock.gif                    if(m_pMedia->GetEvent(&evCode,&evParam1,&evParam2) == TRUE)
ExpandedSubBlockStart.gifContractedSubBlock.gif                    ...{
InBlock.gif                        if(evCode == EC_COMPLETE)
ExpandedSubBlockStart.gifContractedSubBlock.gif                        ...{
InBlock.gif                            MessageBox(NULL,TEXT("播放完毕"),TEXT(""),MB_OK);
ExpandedSubBlockEnd.gif                        }
ExpandedSubBlockEnd.gif                    }
InBlock.gif                    return 0;
ExpandedSubBlockEnd.gif                }
ExpandedSubBlockEnd.gif            }
InBlock.gif            
InBlock.gif            ...
InBlock.gif            
ExpandedBlockEnd.gif        }

        
        好了,知道播放完毕,就这么简单.恩,还很复杂..?呵呵,我觉得已经很简单了.
        
        文章的最后,让我们再来看看CMedia的其它几个有用的函数吧:
        
        CheckVisibility()
        描述:判断文件的种类
        当返回值为TRUE时,为视频文件;反之为只是音频文件.
        
        
        SetVolume(LONG lVolume, LONG lBalance)
        描述:设置音量.
        lVolume:设置音量的大小,范围为–10,000 到 0.
        lBalance:设置左右音量的均衡,范围是–10,000 到 10,000,默认是0.
        
        
        SetDisplayMode(DISPLAYMODE mode)
        描述:设置播放模式.
        DISP_FIT:按比例拉伸至视屏窗口.
        DISP_STRETCH:不按比例拉伸至视屏窗口.
        DISP_NATIVE:如果视频原本尺寸小于屏幕,则以原视频文件大小播放.否则,将和DISP_FIT相同
        DISP_FULLSCREEN:全屏

b.gif/////////////////////////////////////////////////////////////////////        
None.gif//Media.h: interface for the CMedia class.
None.gif//
None.gif//Version:
None.gif//    1.2.0
None.gif//Date:
None.gif//    2007.05.08
ExpandedBlockStart.gifContractedBlock.gif/**///////////////////////////////////////////////////////////////////////
None.gif#ifndef MEDIA_H
None.gif#define    MEDIA_H
None.gif
None.gif
None.gif#include <mmsystem.h>
None.gif#include <streams.h>
None.gif
None.gif//--------------------------------------------------------------------
None.gif//Macro define
None.gif
None.gif//The volume value
None.gif#define MAX_VOLUME                    0
None.gif#define MIN_VOLUME                    -10000
None.gif
None.gif//The balance value
None.gif#define MAX_BALANCE                    10000
None.gif#define MIN_BALANCE                    -10000
None.gif
None.gif//--------------------------------------------------------------------
None.gif//Enum value
None.gif
None.gifenum DISPLAYMODE
ExpandedBlockStart.gifContractedBlock.gif...{    
InBlock.gif    //Fit to the play window size. How wide (height) the window is, how
InBlock.gif    //is the move. Keep aspect ratio.
InBlock.gif    DISP_FIT,
InBlock.gif
InBlock.gif    //Stretch to the play window size. Don't keep the aspect ratio.
InBlock.gif    DISP_STRETCH,
InBlock.gif
InBlock.gif    //Full screen play.
InBlock.gif    DISP_FULLSCREEN,
InBlock.gif
InBlock.gif    //When the size of video is smaller than the play window, it displayes
InBlock.gif    //as the video size. If it's bigger , it just like the DISP_FIT mode.
InBlock.gif    DISP_NATIVE
ExpandedBlockEnd.gif};
None.gif//--------------------------------------------------------------------
None.gif
None.gif//The media file property
None.giftypedef struct
ExpandedBlockStart.gifContractedBlock.gif...{
InBlock.gif    //The volume range is –10,000 to 0.
InBlock.gif    //Divide by 100 to get equivalent decibel value (for example –10,000 = –100 dB).
InBlock.gif    LONG lVolume;
InBlock.gif
InBlock.gif    //The value from –10,000 to 10,000 indicating the stereo balance
InBlock.gif    //As with the Volume property, units correspond to .01 decibels (multiplied by –1 when plBalance is a positive value).
InBlock.gif    //For example, a value of 1000 indicates –10 dB on the right channel and –90 dB on the left channel.
InBlock.gif    LONG lBalance;
InBlock.gif
InBlock.gif    //Width of the video  

转载于:https://www.cnblogs.com/googlegis/archive/2008/11/28/2979221.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值