盾怪网教程:是一个免费提供流行杀毒软件教程、在线学习分享的学习平台!

使用ATL完成QuickTime多媒体文件播放

时间:2024/11/27作者:未知来源:盾怪网教程人气:

[摘要]!m_hViewWnd) return FALSE; VIDEO_STATUE oldState = m_enState; if ( strlen ((c...
!m_hViewWnd)

         return FALSE;



     VIDEO_STATUE oldState = m_enState;

     

     if ( strlen ((char*)fullPath ) != 0)

     {

         OSErr                   err;

         short                   nTheFile = 0;

         long               lControllerFlags = 0L;

         FSSpec                   sfFile;

         short                   nMovieResFile;

         short                   nMovieResId;

         char               theFullPath[255];



         // Close any previously opened movie

          CloseMovie();

     

         // make a copy of our full path name

         strcpy ( (char *)theFullPath, (const char *) fullPath );        

     

         // convert theFullPath to pstring

          c2pstr( (char*)theFullPath );



         // Make a FSSpec with a pascal string filename

          FSMakeFSSpec(0,0L,(unsigned char*)theFullPath, &sfFile);

         

         // Set the port

          SetGWorld((CGrafPtr)GetHWNDPort(m_hViewWnd), nil);



         // Open the movie file

         err = OpenMovieFile(&sfFile, &nMovieResFile, fsRdPerm);

         if (err == noErr)

         {

              // Get the Movie from the file

              nMovieResId = 0;

              err = NewMovieFromFile(&m_Movie,nMovieResFile,

                                          &nMovieResId,

                                          nil,

                                          newMovieActive, /* flags */

                                          nil);

         

              // Close the movie file

              CloseMovieFile(nMovieResFile);           



              if (err == noErr)

              {

                   SetMovieTimeScale(m_Movie,1000);

                   

                   m_bBegineDownload = TRUE;



                   // Create the movie controller

                      CreateNewMovieController(m_hViewWnd,m_Movie,&m_MC);

                   p2cstr((unsigned char*)theFullPath);



                   if(m_MC)

                   {

                       return TRUE;

                   }

                   

              }                   

         }

     }



     CloseMovie();

         

     return FALSE;

}



如果是URL文件,调用OpenURLMovie,该函数跟OpenLocalMovie区别主要在于不用NewMovieFromFile而用NewMovieFromDataRef来得到句柄。



     一般电影在创建完Movie Controller后最好调用PrePrerollMovie。

void CQuickTime::CreateNewMovieController(HWND hwnd, Movie theMovie, MovieController *theMC)

{

     ……

PrePrerollMovie(theMovie, GetMovieTime(theMovie, NULL), GetMoviePreferredRate(theMovie), NewMoviePrePrerollCompleteProc(QTPrePrerollCompleteProc), (void *)m_hViewWnd);

}



3.2.3关闭电影

     void CQuickTime::CloseMovie(void)

{

    if (m_MC)

    {

        DisposeMovieController(m_MC);

    }

         if (m_Movie)

          {

              DisposeMovie(m_Movie);

          }

          m_Movie = NULL;

          m_MC = NULL;

}



3.2.4建立和取消电影窗口关联

int CQuickTime::OnMovieWindowCreate(HWND hWnd, CREATESTRUCT *lpCreateStruct)

{



     if ( hWnd != NULL)

     {

          m_hViewWnd = hWnd;                     // the view's hwnd

         

         // Create GrafPort <-> HWND association

          CreatePortAssociation(m_hViewWnd, NULL, kQTMLHandlePortEvents);  

     }



     return 0;

}

void CQuickTime::OnMovieWindowDestroy()

{

     if(m_Movie)

          AbortPrePrerollMovie(m_Movie,noErr);

     



     CGrafPtr     windowPort = NULL;

     

     // close any movies   before destroying PortAssocation

     CloseMovie();



     // Destroy the view's GrafPort <-> HWND association

     if (m_hViewWnd)

          windowPort = (CGrafPtr)GetHWNDPort(m_hViewWnd);

     

     if (windowPort)

          DestroyPortAssociation(windowPort);



}



3.2.5控制电影播放

笔者用控制MCDoAction来控制播放,这样可以得到播放的状态,当然也可以调用StartMovie、StopMovie等api函数。例如,

void CQuickTime::Play()

{

if(m_Movie)

{

     MCDoAction (m_MC, mcActionPlay, (void *)GetMoviePreferredRate(m_Movie));

     long     controllerFlags;

     MCGetControllerInfo(m_MC,&controllerFlags);

     if((controllerFlags&mcInfoIsPlaying))             

          //Now this is playing state.

}

}



4 综述

  通过上面较为详细的讨论对于建立一个QuickTime的窗口,打开和控制QuickTime电影文件的播放的基本概念和基本过程,我认为QuickTime Player在Windows的平台的应用将更为宽广。同时为Apple公司在多媒体播放上的努力而致敬。

关键词:运用ATL完成QuickTime多媒体文件播放




Copyright © 2012-2018 盾怪网教程(http://www.dunguai.com) .All Rights Reserved 网站地图 友情链接

免责声明:本站资源均来自互联网收集 如有侵犯到您利益的地方请及时联系管理删除,敬请见谅!

QQ:1006262270   邮箱:kfyvi376850063@126.com   手机版