• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            VC++ 6.0下自制媒體播放器&實現AVI文件的圖像截取

            VC++ 6.0下自制媒體播放

              可視動畫控件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++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。然后為菜單文件添加兩個菜單項打開文件和退出,并分別添加函數OnOpen()和OnExit(),代碼如下:
            void Cplayer::OnOpen()

            { // TODO: Add your command handler code here char szFilter[] =

            " 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 (*.*)∣*.* ";

            //用于設置FileDialog的文件類型

            CFileDialog FileDlg( TRUE, NULL, NULL, OFN_HIDEREADONLY, szFilter ); 

            if( FileDlg.DoModal() == IDOK ) { CString PathName = FileDlg.GetPathName(); 

            PathName.MakeUpper();

                    m_ActiveMovie.SetFileName(PathName);

               }

            }  

              OnOpen()函數的作用是顯示“打開”對話框,通過該對話框選擇要執行的文件。 
             
            利用Visual C++實現AVI文件的圖像截取 
             
            劉 濤  yesky

             

              AVI文件就是我們所說的多媒體文件,所謂的AVI圖像就是視頻圖像,該文件是一個RIFF說明文件,它用于獲取、編輯、演示音頻、視頻序列。一般的AVI文件包含音頻流和視頻流,有的特殊的AVI還包含一個控制路徑或MIDI路徑作為附加的數據流。

              現在播放AVI文件的軟件很多,但大多無法從AVI視頻文件中讀取一幀圖像并生成BMP格式的文件。筆者在使用AVI文件開發項目過程中對AVI文件的操作積累了一些經驗,對于如何實現從AVI視頻流中獲取任意幀的圖像數據并存儲成BMP文件,其中最關鍵的是要從AVI文件中獲取具體某一幀的圖像數據,為此我利用Windows提供的API函數實現了自定義的CAvi類,用于操作AVI文件。

              在使用API函數操作AVI文件時,一定要注意用AVIFileInit()來初始化AVI庫,程序結束時用AVIFileExit()釋放AVI庫,否則API函數無法使用。現以操作包含真彩色圖像的AVI文件為例,給出Cavi類的部分函數的具體實現,其中CaviCreate()函數用于讀取AVI文件信息并初始化Cavi類的成員,例如根據AVI文件信息定義每幀圖像的寬、高、每幀圖像的信息頭結構等等;函數AviRead(int mFrame)用于從AVI文件中讀取第mFrame幀。實現代碼顯示如下:

            //Cavi類頭文件定義;
            class CAvi file://AVI類,處理AVI文件
            {
             public:
             int cy;//圖象高
             int cx;//圖象寬
             file://long m_maxFrame;
             BYTE *pData;//寸儲圖象數據
             BITMAPINFO *m_pBMI;//位圖文件信息頭
             PAVISTREAM pavi;//AVI流
             PAVIFILE pfile;//AVI文件指針
             AVIFILEINFO * pfi; file://AVI信息
             BOOL AviRead(int mFrame);//讀AVI文件的第mFrame幀
             CAvi();//標準構造函數
             CAviCreate(CString &string);//用文件名初始化AVI類的成員
             virtual ~CAvi();
            }; 
            //Cavi類文件實現部分;
            CAvi::CAvi()
            { AVIFileInit();//初始化AVI庫
             cx=0;//定義圖象寬、高、等成員
             cy=0;
             m_pBMI=NULL;
             pData=NULL;
             file://m_maxFrame=0;
             pfi=NULL;
            }
            CAvi::~CAvi()//析構、釋放指針
            {
             // AVIFileClose(pfile);
             AVIFileExit();
             if(pData!=NULL)
              delete pData;
              pData=NULL;

             if(m_pBMI!=NULL)
              delete m_pBMI;
              m_pBMI=NULL;
              if(pfi!=NULL)
               delete pfi;
               pfi=NULL;
            }
            CAvi::CAviCreate(CString &string)//讀文件初始化該類

             HRESULT hr;
             pfi=new AVIFILEINFO;
             hr = AVIFileOpen(&pfile, // returned file pointer
             string, // file name
             OF_READ, // mode to open file with
             NULL);
             hr= AVIFileInfo(pfile, file://獲取AVI信息,放入pfi中
             pfi, 
             sizeof(AVIFILEINFO) 
            );
            cx=pfi->dwWidth;//圖象寬、高
            cy=pfi->dwHeight;
            hr=AVIFileGetStream(//將AVI變成視頻流
            pfile, 
            &pavi, 
            streamtypeVIDEO, 
            0//LONG lParam 
            );
            m_pBMI=new BITMAPINFO;//定義BMP信息頭
            m_pBMI->bmiHeader.biBitCount=24;
            m_pBMI->bmiHeader.biClrImportant=0;
            m_pBMI->bmiHeader.biClrUsed=0;
            m_pBMI->bmiHeader.biCompression=BI_RGB;
            m_pBMI->bmiHeader.biHeight=cy;
            m_pBMI->bmiHeader.biWidth=cx;
            m_pBMI->bmiHeader.biPlanes=1;
            m_pBMI->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
            m_pBMI->bmiHeader.biXPelsPerMeter=0;
            m_pBMI->bmiHeader.biYPelsPerMeter=0;
            m_pBMI->bmiHeader.biSizeImage=cx*cy*3;
            pData=(BYTE*)new char[cx*cy*3];//根據AVI中BMP圖象的信息定義緩沖區
            }
            BOOL CAvi::AviRead(int mFrame)//將AVI文件的M幀數據讀入PData緩沖區
            {
            HRESULT hr;
            hr= AVIStreamRead( pavi, 
            mFrame, 
            1, 
            pData, 
            cx*cy*3, 
            NULL, 
            NULL
            );
            if(hr==0)
            return TRUE;
            else
            return FALSE;
            }
             
              上述Cavi類實現部分所涉及到的API函數可以參考微軟提供的MSDN。Cavi類中的pData緩沖區存放AVI文件中的具體某一幀圖像數據,同時Cavi類的m_pBMI為BMP圖像文件信息結構,這時可以根據圖像的大小定義BMP圖像文件頭結構,關于BMP文件的存儲,由于篇幅的原因,我不在多講了,有興趣的讀者可以參見筆者的拙作"Visual C++6.0開發灰度位圖處理"(天極網軟件欄目2001.9.10發表),該文里面講述了如何存取BMP文件。以上程序在Windows2000、Visual C++6.0環境下順利編譯通過,運行正常。

            posted on 2008-09-10 19:30 wrh 閱讀(1074) 評論(0)  編輯 收藏 引用

            導航

            <2010年10月>
            262728293012
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            統計

            常用鏈接

            留言簿(19)

            隨筆檔案

            文章檔案

            收藏夾

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            一本色道久久88综合日韩精品| 精品国产日韩久久亚洲| 久久精品国产亚洲77777| 久久精品aⅴ无码中文字字幕重口| 久久狠狠色狠狠色综合| 久久青青草原精品国产软件| 亚洲欧美日韩中文久久| 91久久精品无码一区二区毛片| 久久只有这精品99| 久久久久国产精品| 亚洲精品乱码久久久久66| 欧美一区二区精品久久| 久久99国产精品久久99小说 | 久久亚洲中文字幕精品有坂深雪 | 中文字幕久久欲求不满| 久久综合九色综合网站| 久久久99精品一区二区| 成人综合久久精品色婷婷| 潮喷大喷水系列无码久久精品 | 久久99国产精品成人欧美| 国产激情久久久久久熟女老人| 国产精品美女久久久久av爽| 亚洲国产精品久久电影欧美| 日本精品久久久久影院日本| 免费观看成人久久网免费观看| 少妇久久久久久久久久| 蜜桃麻豆WWW久久囤产精品| 久久久久人妻一区精品果冻| 色成年激情久久综合| 韩国三级大全久久网站| 日韩av无码久久精品免费| 亚洲午夜精品久久久久久浪潮| 精品国产青草久久久久福利 | 中文精品99久久国产| 久久毛片免费看一区二区三区| 香蕉久久一区二区不卡无毒影院| 亚洲精品国精品久久99热一| 久久久久久亚洲精品成人| 久久久精品2019免费观看| 国内精品久久久久久久97牛牛| 77777亚洲午夜久久多喷|