本来想用VMR9绘制到D3D的Texture上的, 试着弄了一下, 慢得真够可以的, 还是直接全屏(窗口)放得了
代码也懒得写了, 直接拿SDK里的VMRPlayer中CMovie类用就行
1: CMovie* g_movie = NULL; 2: //初始化 3: g_movie = new CMovie(g_hWnd); 4: //载入文件 5: g_movie->OpenMovie("D://TDDOWNLOAD//Movie//回梦游仙-千年缘.avi"); 6: //播放 7: g_movie->PlayMovie(); 8: //绘制 9: RECT rc; 10: ::GetClientRect(g_hWnd, &rc); 11: g_movie->PutMoviePosition(rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top); 12: g_movie->RepaintVideo(g_hWnd, ::GetDC(g_hWnd)); |
其实这个类一看就明白怎么用....
1: /* ------------------------------------------------------------------------- 2: ** CMovie - a DirectShow movie playback class. 3: ** ------------------------------------------------------------------------- 4: */ 5: enum EMovieMode 6: { 7: MOVIE_NOTOPENED = 0x00, 8: MOVIE_OPENED = 0x01, 9: MOVIE_PLAYING = 0x02, 10: MOVIE_STOPPED = 0x03, 11: MOVIE_PAUSED = 0x04 12: }; 13: 14: struct IMpegAudioDecoder; 15: struct IMpegVideoDecoder; 16: struct IQualProp; 17: 18: class CMovie 19: { 20: private: 21: // Our state variable - records whether we are opened, playing etc. 22: EMovieMode m_Mode; 23: HANDLE m_MediaEvent; 24: HWND m_hwndApp; 25: GUID m_TimeFormat; 26: 27: IFilterGraph *m_Fg; 28: IGraphBuilder *m_Gb; 29: IMediaControl *m_Mc; 30: IMediaSeeking *m_Ms; 31: IMediaEvent *m_Me; 32: IVMRWindowlessControl9 *m_Wc; 33: 34: HRESULT AddVideoMixingRendererToFG(); 35: HRESULT FindInterfaceFromFilterGraph( 36: REFIID iid, // interface to look for 37: LPVOID *lp // place to return interface pointer in 38: ); 39: 40: public: 41: CMovie(HWND hwndApplication); 42: ~CMovie(); 43: 44: HRESULT OpenMovie(TCHAR *lpFileName); 45: DWORD CloseMovie(); 46: 47: BOOL PlayMovie(); 48: BOOL PauseMovie(); 49: BOOL StopMovie(); 50: 51: OAFilterState GetStateMovie(); 52: HANDLE GetMovieEventHandle(); 53: long GetMovieEventCode(); 54: 55: BOOL PutMoviePosition(LONG x, LONG y, LONG cx, LONG cy); 56: BOOL GetMoviePosition(LONG *x, LONG *y, LONG *cx, LONG *cy); 57: BOOL GetNativeMovieSize(LONG *cx, LONG *cy); 58: BOOL CanMovieFrameStep(); 59: BOOL FrameStepMovie(); 60: 61: REFTIME GetDuration(); 62: REFTIME GetCurrentPosition(); 63: EMovieMode StatusMovie(); 64: 65: BOOL SeekToPosition(REFTIME rt,BOOL bFlushData); 66: BOOL IsTimeFormatSupported(GUID Format); 67: BOOL IsTimeSupported(); 68: BOOL SetTimeFormat(GUID Format); 69: 70: GUID GetTimeFormat(); 71: void SetFocus(); 72: BOOL ConfigDialog(HWND hwnd); 73: BOOL RepaintVideo(HWND hwnd, HDC hdc); 74: 75: HRESULT SetAppImage(VMR9AlphaBitmap* lpBmpInfo); 76: HRESULT UpdateAppImage(VMR9AlphaBitmap* lpBmpInfo); 77: void SetBorderClr(COLORREF clr); 78: 79: void DisplayModeChanged(); 80: 81: HRESULT GetCurrentImage(LPBYTE* lplpDib); 82: 83: IVMRMixerControl9 *m_pMixControl; 84: }; |