private void CloseInterface() { //그래프와 콘트롤 해제 if (pMediaControl != null) { pMediaControl.StopWhenReady(); } if (pVideoWindow != null) { pVideoWindow.put_Visible(OABool.False); pVideoWindow.put_Owner(IntPtr.Zero); } Marshal.ReleaseComObject(pSampleGrabber); pSampleGrabber = null; Marshal.ReleaseComObject(pSampleGrabberFilter); pSampleGrabberFilter = null; Marshal.ReleaseComObject(pGraphBuilder); pGraphBuilder = null; Marshal.ReleaseComObject(pMediaControl); pMediaControl = null; Marshal.ReleaseComObject(pVideoWindow); pVideoWindow = null; Marshal.ReleaseComObject(pMediaPosition); pMediaPosition = null; //this.Close(); //close this program }
// Configure the video window private void ConfigureVideoWindow(DirectShowLib.IVideoWindow videoWindow, Control hWin) { int hr; // Set the output window hr = videoWindow.put_Owner(hWin.Handle); DsError.ThrowExceptionForHR(hr); // Set the window style hr = videoWindow.put_WindowStyle((WindowStyle.Child | WindowStyle.ClipChildren | WindowStyle.ClipSiblings)); DsError.ThrowExceptionForHR(hr); // Make the window visible hr = videoWindow.put_Visible(OABool.True); DsError.ThrowExceptionForHR(hr); // Make the window visible //hr = videoWindow.put_Visible( OABool.False ); //DsError.ThrowExceptionForHR( hr ); // Position the playing location Rectangle rc = hWin.ClientRectangle; hr = videoWindow.SetWindowPosition(0, 0, rc.Right, rc.Bottom); DsError.ThrowExceptionForHR(hr); //Rectangle rc = hWin.ClientRectangle; //hr = videoWindow.SetWindowPosition( 0, 0, 0, 0 ); //DsError.ThrowExceptionForHR( hr ); }
public static Boolean TryMediaOpen(MediaTypes mediaType, String path) { Boolean ret = false; switch (mediaType) { case MediaTypes.Audio: { DirectShowLib.IGraphBuilder gb = (DirectShowLib.IGraphBuilder) new DirectShowLib.FilterGraph(); //Int32 hr = gb.RenderFile(path, null); if (gb.RenderFile(path, null) == 0) { ret = true; } Marshal.ReleaseComObject(gb); gb = null; break; } case MediaTypes.Video: { DirectShowLib.IGraphBuilder gb = (DirectShowLib.IGraphBuilder) new DirectShowLib.FilterGraph(); Int32 hr = gb.RenderFile(path, null); if (hr == 0) { DirectShowLib.IVideoWindow videoWindow = (DirectShowLib.IVideoWindow)gb; OABool lVisible; if (videoWindow.get_Visible(out lVisible) == 0) { ret = true; } videoWindow = null; } Marshal.ReleaseComObject(gb); gb = null; break; } case MediaTypes.Karaoke: { ret = true; try { Sequence sequence = new Sequence(path); sequence.Dispose(); } catch (Exception) { ret = false; } break; } default: break; } return(ret); }
private void Videotest1() { pGraphBuilder = (DirectShowLib.IGraphBuilder) new FilterGraph(); pMediaControl = (DirectShowLib.IMediaControl)pGraphBuilder; //controler pMediaEvent = (DirectShowLib.IMediaEvent)pGraphBuilder; //envent pMediaControl.RenderFile(@"C:\Users\trevor\Desktop\Videos\cctv2.wmv"); pVideoWindow = (DirectShowLib.IVideoWindow)pGraphBuilder; // renderFile을 실행 한 후 연결해줘야한다. 출력처를 알기위해서. //pVideoWindow.put_Caption("test"); // setTitle //pVideoWindow.put_FullScreenMode(OABool.True); //Video full Screen pVideoWindow.put_Owner(tabPage2.Handle); // tabPage2에 그리기. pVideoWindow.put_WindowStyle(WindowStyle.Child | WindowStyle.ClipSiblings); Rectangle rect = tabPage2.ClientRectangle; pVideoWindow.SetWindowPosition(0, 0, rect.Right, rect.Bottom); pMediaControl.Run(); // Video play pMediaEvent.WaitForCompletion(-1, out eventCode); //블로킹을 실시하는 메소드 switch (eventCode) { case 0: textBox1.Text = "TimeOut"; break; case EventCode.UserAbort: //ex) alt+f4 textBox1.Text = "User Abort"; break; case EventCode.Complete: textBox1.Text = "complete"; break; case EventCode.ErrorAbort: textBox1.Text = "Error Abort"; break; } //pVideoWindow.put_FullScreenMode(OABool.False); // !full Screen //free Marshal.ReleaseComObject(pGraphBuilder); pGraphBuilder = null; Marshal.ReleaseComObject(pMediaControl); pMediaControl = null; Marshal.ReleaseComObject(pMediaEvent); pMediaEvent = null; }
public override void Dispose() { VideoWndSwitch(false); m_MediaControl.Stop(); //IntPtr handle; /*m_hr = m_VideoWindow.get_Owner(out handle); * DsError.ThrowExceptionForHR(m_hr); * System.Windows.Forms.Form.FromHandle(handle).Dispose();*/ //m_VideoWindow.put_Owner(IntPtr.Zero); DsError.ThrowExceptionForHR(m_hr); m_VideoWindow = null; m_BasicVideo = null; base.Dispose(); }
private void InitializeGraph() { m_graph = (DirectShowLib.IGraphBuilder) new FilterGraphNoThread(); // QueryInterface for DirectShow interfaces _mediaControl = (DirectShowLib.IMediaControl)m_graph; _mediaEventEx = (DirectShowLib.IMediaEventEx)m_graph; _mediaSeeking = (DirectShowLib.IMediaSeeking)m_graph; _mediaPosition = (DirectShowLib.IMediaPosition)m_graph; // Query for video interfaces, which may not be relevant for audio files _videoWindow = m_graph as DirectShowLib.IVideoWindow; _basicVideo = m_graph as DirectShowLib.IBasicVideo; // Query for audio interfaces, which may not be relevant for video-only files _basicAudio = m_graph as DirectShowLib.IBasicAudio; // Set up event notification. var hr = _mediaEventEx.SetNotifyWindow(VideoWindowHandle, WM_GRAPHNOTIFY, IntPtr.Zero); DsError.ThrowExceptionForHR(hr); }
private void InitializeGraph(bool isDvd) { int hr = 0; _isDvd = isDvd; m_filterGraph = new FilterGraphNoThread(); m_graph = (m_filterGraph as DirectShowLib.IGraphBuilder); // QueryInterface for DirectShow interfaces _mediaControl = (DirectShowLib.IMediaControl)m_graph; _mediaEventEx = (DirectShowLib.IMediaEventEx)m_graph; _mediaSeeking = (DirectShowLib.IMediaSeeking)m_graph; _mediaPosition = (DirectShowLib.IMediaPosition)m_graph; // Query for video interfaces, which may not be relevant for audio files _videoWindow = m_graph as DirectShowLib.IVideoWindow; _basicVideo = m_graph as DirectShowLib.IBasicVideo; // Query for audio interfaces, which may not be relevant for video-only files _basicAudio = m_graph as DirectShowLib.IBasicAudio; // Set up event notification. if (isDvd) hr = _mediaEventEx.SetNotifyWindow(VideoWindowHandle, DirectShowPlayerConfiguration.WM_DVD_EVENT, IntPtr.Zero); else hr = _mediaEventEx.SetNotifyWindow(VideoWindowHandle, DirectShowPlayerConfiguration.WM_GRAPH_NOTIFY, IntPtr.Zero); DsError.ThrowExceptionForHR(hr); if (_config.PublishGraph) m_dsRot = new DsROTEntry(m_graph as IFilterGraph); }
private void CloseInterfaces() { int hr; if (m_adecOut != null) { CleanUpInterface(m_adecOut); m_adecOut = null; } if (_defaultAudioRenderer != null) { m_graph.RemoveFilter(_defaultAudioRenderer as DirectShowLib.IBaseFilter); CleanUpInterface(_defaultAudioRenderer); _defaultAudioRenderer = null; } if (_reclockAudioRenderer != null) { m_graph.RemoveFilter(_reclockAudioRenderer as DirectShowLib.IBaseFilter); CleanUpInterface(_reclockAudioRenderer); _reclockAudioRenderer = null; } if (_wasapiAR != null) { m_graph.RemoveFilter(_wasapiAR as DirectShowLib.IBaseFilter); CleanUpInterface(_wasapiAR); _wasapiAR = null; } if (_lavaudio != null) { m_graph.RemoveFilter(_lavaudio as DirectShowLib.IBaseFilter); CleanUpInterface(_lavaudio); _lavaudio = null; } if (_xyVsFilter != null) { m_graph.RemoveFilter(_xyVsFilter as DirectShowLib.IBaseFilter); CleanUpInterface(_xyVsFilter); _xyVsFilter = null; } if (_xySubFilter != null) { m_graph.RemoveFilter(_xySubFilter as DirectShowLib.IBaseFilter); CleanUpInterface(_xySubFilter); _xySubFilter = null; } if (_lavvideo != null) { m_graph.RemoveFilter(_lavvideo as DirectShowLib.IBaseFilter); CleanUpInterface(_lavvideo); _lavvideo = null; } if (_madvr != null) { m_graph.RemoveFilter(_madvr as DirectShowLib.IBaseFilter); CleanUpInterface(_madvr); _madvr = null; } if (_videoWindow != null) { // Relinquish ownership (IMPORTANT!) after hiding video window hr = _videoWindow.put_Visible(OABool.False); hr = _videoWindow.put_Owner(IntPtr.Zero); } if (_mediaEventEx != null) { hr = _mediaEventEx.SetNotifyWindow(IntPtr.Zero, 0, IntPtr.Zero); //Marshal.ReleaseComObject(_mediaEventEx); //_mediaEventEx = null; } //if (_dvdNav != null) //{ // Marshal.ReleaseComObject(_dvdNav); // _dvdNav = null; //} /* //this will double release the source filter if (dvdInfo != null) { Marshal.ReleaseComObject(dvdInfo); dvdInfo = null; } if (_mDvdControl != null) { Marshal.ReleaseComObject(_mDvdControl); } */ _mDvdControl = null; CleanUpInterface(_mPDisplay); _mPDisplay = null; CleanUpInterface(_sourceFilter); _sourceFilter = null; CleanUpInterface(_mPEvr); _mPEvr = null; CleanUpInterface(m_filterGraph); m_filterGraph = null; m_filterGraph = null; _mediaEventEx = null; _mediaSeeking = null; _mediaPosition = null; _mediaControl = null; _basicAudio = null; _basicVideo = null; m_graph = null; _videoWindow = null; _filterGraph = null; if (m_dsRot != null) m_dsRot.Dispose(); m_dsRot = null; _mSeekCaps = 0; _streams = null; GC.Collect(); }
private void CloseInterfaces() { _hiddenWindow.SizeChanged -= _hiddenWindow_SizeChanged; int hr; if (_defaultAudioRenderer != null) { m_graph.RemoveFilter(_defaultAudioRenderer as DirectShowLib.IBaseFilter); Marshal.ReleaseComObject(_defaultAudioRenderer); _defaultAudioRenderer = null; } if (_reclockAudioRenderer != null) { m_graph.RemoveFilter(_reclockAudioRenderer as DirectShowLib.IBaseFilter); Marshal.ReleaseComObject(_reclockAudioRenderer); _reclockAudioRenderer = null; } if (_lavaudio != null) { m_graph.RemoveFilter(_lavaudio as DirectShowLib.IBaseFilter); Marshal.ReleaseComObject(_lavaudio); _lavaudio = null; } if (_xyVsFilter != null) { m_graph.RemoveFilter(_xyVsFilter as DirectShowLib.IBaseFilter); Marshal.ReleaseComObject(_xyVsFilter); _xyVsFilter = null; } if (_xySubFilter != null) { m_graph.RemoveFilter(_xySubFilter as DirectShowLib.IBaseFilter); Marshal.ReleaseComObject(_xySubFilter); _xySubFilter = null; } if (_lavvideo != null) { m_graph.RemoveFilter(_lavvideo as DirectShowLib.IBaseFilter); Marshal.ReleaseComObject(_lavvideo); _lavvideo = null; } if (_madvr != null) { m_graph.RemoveFilter(_madvr as DirectShowLib.IBaseFilter); Marshal.ReleaseComObject(_madvr); _madvr = null; } if (_videoWindow != null) { // Relinquish ownership (IMPORTANT!) after hiding video window hr = _videoWindow.put_Visible(OABool.False); hr = _videoWindow.put_Owner(IntPtr.Zero); } if (_mediaEventEx != null) { hr = _mediaEventEx.SetNotifyWindow(IntPtr.Zero, 0, IntPtr.Zero); Marshal.ReleaseComObject(_mediaEventEx); _mediaEventEx = null; } if (_dvdNav != null) { Marshal.ReleaseComObject(_dvdNav); _dvdNav = null; } if (_mDvdInfo != null) { Marshal.ReleaseComObject(_mDvdInfo); _mDvdInfo = null; } if (_mDvdControl != null) { Marshal.ReleaseComObject(_mDvdControl); _mDvdControl = null; } if (_mPDisplay != null) { Marshal.ReleaseComObject(_mPDisplay); _mPDisplay = null; } if (_filterGraph != null) { Marshal.ReleaseComObject(_filterGraph); _filterGraph = null; } if (_mPEvr != null) { Marshal.ReleaseComObject(_mPEvr); _mPEvr = null; } if (_mediaEventEx != null) { Marshal.ReleaseComObject(_mediaEventEx); _mediaEventEx = null; } if (_mediaSeeking != null) { Marshal.ReleaseComObject(_mediaSeeking); _mediaSeeking = null; } if (_mediaPosition != null) { Marshal.ReleaseComObject(_mediaPosition); _mediaPosition = null; } if (_mediaControl != null) { Marshal.ReleaseComObject(_mediaControl); _mediaControl = null; } if (_basicAudio != null) { Marshal.ReleaseComObject(_basicAudio); _basicAudio = null; } if (_basicVideo != null) { Marshal.ReleaseComObject(_basicVideo); _basicVideo = null; } if (_sourceFilter != null) { Marshal.ReleaseComObject(_sourceFilter); _sourceFilter = null; } if (m_graph != null) { Marshal.ReleaseComObject(m_graph); m_graph = null; } if (_videoWindow != null) { Marshal.ReleaseComObject(_videoWindow); _videoWindow = null; } _mSeekCaps = 0; _streams = null; GC.Collect(); }
private void InitializeGraph() { m_graph = (DirectShowLib.IGraphBuilder)new FilterGraphNoThread(); // QueryInterface for DirectShow interfaces _mediaControl = (DirectShowLib.IMediaControl)m_graph; _mediaEventEx = (DirectShowLib.IMediaEventEx)m_graph; _mediaSeeking = (DirectShowLib.IMediaSeeking)m_graph; _mediaPosition = (DirectShowLib.IMediaPosition)m_graph; // Query for video interfaces, which may not be relevant for audio files _videoWindow = m_graph as DirectShowLib.IVideoWindow; _basicVideo = m_graph as DirectShowLib.IBasicVideo; // Query for audio interfaces, which may not be relevant for video-only files _basicAudio = m_graph as DirectShowLib.IBasicAudio; // Set up event notification. var hr = _mediaEventEx.SetNotifyWindow(VideoWindowHandle, WM_GRAPHNOTIFY, IntPtr.Zero); DsError.ThrowExceptionForHR(hr); }
private void SetupGraph(Control hWin, string filename) { pGraphBuilder = (DirectShowLib.IGraphBuilder) new FilterGraph(); pMediaControl = (DirectShowLib.IMediaControl)pGraphBuilder; pVideoWindow = (DirectShowLib.IVideoWindow)pGraphBuilder; pVideoFrameStep = (DirectShowLib.IVideoFrameStep)pGraphBuilder; // video frame... pMediaPosition = (DirectShowLib.IMediaPosition)pGraphBuilder; //DirectShowLib.IBaseFilter pBaseFilter = (DirectShowLib.IBaseFilter)pGraphBuilder; //pMediaSeeking = (DirectShowLib.IMediaSeeking)pGraphBuilder; //pMediaSeeking.SetPositions(5000, AMSeekingSeekingFlags.AbsolutePositioning, 6000, AMSeekingSeekingFlags.AbsolutePositioning); //test DirectShowLib.ICaptureGraphBuilder2 pCaptureGraphBuilder2; DirectShowLib.IBaseFilter pRenderer; DirectShowLib.IVMRFilterConfig9 pIVMRFilterConfig9; DirectShowLib.IVMRWindowlessControl9 pVMRWC9; pCaptureGraphBuilder2 = (DirectShowLib.ICaptureGraphBuilder2) new CaptureGraphBuilder2(); pCaptureGraphBuilder2.SetFiltergraph(pGraphBuilder); // CaptureGraph를 GraphBuilder에 붙인다. //pGraphBuilder.AddFilter(pMediaControl "SDZ 375 Source"); // GraphBuilder에 영상장치필터를 추가한다. pRenderer = (DirectShowLib.IBaseFilter) new DirectShowLib.VideoMixingRenderer9(); // 믹서 필터를 생성 한다. pIVMRFilterConfig9 = (DirectShowLib.IVMRFilterConfig9)pRenderer; // 믹서 필터의 속성을 설정한다. pIVMRFilterConfig9.SetRenderingMode(VMR9Mode.Windowless); pIVMRFilterConfig9.SetNumberOfStreams(2); pVMRWC9 = (DirectShowLib.IVMRWindowlessControl9)pRenderer; // 오버레이 평면의 속성을 설정한다. pVMRWC9.SetVideoClippingWindow(hWin.Handle); pVMRWC9.SetBorderColor(0); pVMRWC9.SetVideoPosition(null, hWin.ClientRectangle); pGraphBuilder.AddFilter(pRenderer, "Video Mixing Renderer"); // GraphBuilder에 믹스 필터를 추가한다. pCaptureGraphBuilder2.RenderStream(null, MediaType.Video, pGraphBuilder, null, pRenderer); // 영상표시를 위한 필터를 설정한다. ///test //sampleGrabber AMMediaType am_media_type = new AMMediaType(); pSampleGrabber = (DirectShowLib.ISampleGrabber) new SampleGrabber(); pSampleGrabberFilter = (DirectShowLib.IBaseFilter)pSampleGrabber; am_media_type.majorType = MediaType.Video; am_media_type.subType = MediaSubType.RGB24; am_media_type.formatType = FormatType.VideoInfo; pSampleGrabber.SetMediaType(am_media_type); //Graph에 sampleGrabber filter를 추가 pGraphBuilder.AddFilter(pSampleGrabberFilter, "Sample Grabber"); pMediaControl.RenderFile(filename); pVideoWindow.put_Owner(hWin.Handle); pVideoWindow.put_WindowStyle(WindowStyle.Child | WindowStyle.ClipSiblings); Rectangle rect = hWin.ClientRectangle; pVideoWindow.SetWindowPosition(0, 0, rect.Right, rect.Bottom); //sampleGrabber2 pSampleGrabber.GetConnectedMediaType(am_media_type); DirectShowLib.VideoInfoHeader pVideoInfoHeader = (DirectShowLib.VideoInfoHeader)Marshal.PtrToStructure(am_media_type.formatPtr, typeof(VideoInfoHeader)); String str = string.Format("size = {0} x {1}", pVideoInfoHeader.BmiHeader.Width, pVideoInfoHeader.BmiHeader.Height); Video_Width = pVideoInfoHeader.BmiHeader.Width; Video_Height = pVideoInfoHeader.BmiHeader.Height; str += string.Format("sample size = {0}", am_media_type.sampleSize); textBox1.Text = str; DsUtils.FreeAMMediaType(am_media_type); //SetBufferSamples를 실행하지 않으면 버퍼로부터 데이터를 얻을 수 없다. //불필요하게 부하를 주고싶지 않은경우 false, 데이터를 얻고싶으면 true pSampleGrabber.SetBufferSamples(true); //play time pMediaPosition = (DirectShowLib.IMediaPosition)pGraphBuilder; double Length; pMediaPosition.get_Duration(out Length); String str2 = string.Format("play time: {0}", Length); textBox1.Text = str2; pMediaPosition.put_CurrentPosition(5.0); //set current Position //2017.05.08 DirectShowLib.IVMRWindowlessControl9 windowlessCtrl = (DirectShowLib.IVMRWindowlessControl9)pRenderer; windowlessCtrl.SetVideoClippingWindow(hWin.Handle); IntPtr lpDib; windowlessCtrl.GetCurrentImage(out lpDib); BitmapInfoHeader head; head = (BitmapInfoHeader)Marshal.PtrToStructure(lpDib, typeof(BitmapInfoHeader)); int width = head.Width; int height = head.Height; int stride = width * (head.BitCount / 8); PixelFormat pixelFormat = PixelFormat.Format24bppRgb; switch (head.BitCount) { case 24: pixelFormat = PixelFormat.Format24bppRgb; break; case 32: pixelFormat = PixelFormat.Format32bppRgb; break; case 48: pixelFormat = PixelFormat.Format48bppRgb; break; default: throw new Exception("Unknown BitCount"); } Bitmap Cap = new Bitmap(width, height, stride, pixelFormat, lpDib); Cap.RotateFlip(RotateFlipType.RotateNoneFlipY); pictureBox1.Image = Cap; }
public VideoPlayItem(String path, Boolean isDemo) : base(path, isDemo) { m_VideoWindow = (DirectShowLib.IVideoWindow)m_GraphBuilder; m_BasicVideo = (DirectShowLib.IBasicVideo)m_GraphBuilder; }
private void InitializeGraph(bool isDvd) { int hr = 0; _isDvd = isDvd; if (isDvd) { _dvdGraphBuilder = new DvdGraphBuilder() as IDvdGraphBuilder; hr = _dvdGraphBuilder.GetFiltergraph(out _graph); DsError.ThrowExceptionForHR(hr); _filterGraph = _graph as IFilterGraph2; } else { _filterGraphNT = new FilterGraphNoThread(); _graph = (_filterGraphNT as DirectShowLib.IGraphBuilder); } // QueryInterface for DirectShow interfaces _mediaControl = (DirectShowLib.IMediaControl)_graph; _mediaEventEx = (DirectShowLib.IMediaEventEx)_graph; _mediaSeeking = (DirectShowLib.IMediaSeeking)_graph; _mediaPosition = (DirectShowLib.IMediaPosition)_graph; // Query for video interfaces, which may not be relevant for audio files _videoWindow = _graph as DirectShowLib.IVideoWindow; _basicVideo = _graph as DirectShowLib.IBasicVideo; // Query for audio interfaces, which may not be relevant for video-only files _basicAudio = _graph as DirectShowLib.IBasicAudio; // Set up event notification. if (isDvd) hr = _mediaEventEx.SetNotifyWindow(VideoWindowHandle, WM_DVD_EVENT, IntPtr.Zero); else hr = _mediaEventEx.SetNotifyWindow(VideoWindowHandle, WM_GRAPHNOTIFY, IntPtr.Zero); DsError.ThrowExceptionForHR(hr); if (_mbtConfig.Configuration.InternalPlayerConfiguration.PublishGraph) m_dsRot = new DsROTEntry(_graph as IFilterGraph); }