[摘要]!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多媒体文件播放