Всем привет! Пытаюсь писать видео с web-камеры в файл avi. Код такой: | Код | IBaseFilter muxFilter = null; IBaseFilter videoCompressorFilter = null; private IBaseFilter capFilter; private IGraphBuilder graphBuilder; private ICaptureGraphBuilder2 capGraphBuilder; private IVideoWindow videoWin; private IMediaControl mediaCtrl; private IMediaEventEx mediaEvt; //процедура выбора видеоустройства //... //процедура выбора кодека //... bool StartupVideo( UCOMIMoniker mon ) { int hr; try { if( ! CreateCaptureDevice( mon ) ) return false; if( ! GetInterfaces() ) return false; if( ! SetupGraph() ) return false; if( ! SetupVideoWindow() ) return false; hr = mediaCtrl.Run(); if( hr < 0 ) Marshal.ThrowExceptionForHR( hr ); return true; } catch( Exception ee ) { MessageBox.Show( this, "Could not start video stream\r\n" + ee.Message, "DirectShow.NET", MessageBoxButtons.OK, MessageBoxIcon.Stop ); return false; } } bool CreateCaptureDevice( UCOMIMoniker mon ) { object capObj = null; try { Guid gbf = typeof( IBaseFilter ).GUID; mon.BindToObject( null, null, ref gbf, out capObj ); capFilter = (IBaseFilter) capObj; capObj = null; return true; } catch( Exception ee ) { MessageBox.Show( this, "Could not create capture device\r\n" + ee.Message, "DirectShow.NET", MessageBoxButtons.OK, MessageBoxIcon.Stop ); return false; } finally { if( capObj != null ) Marshal.ReleaseComObject( capObj ); capObj = null; } } bool GetInterfaces() { try { graphBuilder = (IGraphBuilder)Activator.CreateInstance(Type.GetTypeFromCLSID(Clsid.FilterGraph, true)); Guid clsid = Clsid.CaptureGraphBuilder2; Guid riid = typeof(ICaptureGraphBuilder2).GUID; capGraphBuilder = (ICaptureGraphBuilder2)DsBugWO.CreateDsInstance(ref clsid, ref riid); mediaCtrl = (IMediaControl) graphBuilder; videoWin = (IVideoWindow) graphBuilder; mediaEvt = (IMediaEventEx) graphBuilder; return true; } catch( Exception ee ) { MessageBox.Show( this, "Could not get interfaces\r\n" + ee.Message, "DirectShow.NET", MessageBoxButtons.OK, MessageBoxIcon.Stop ); return false; } finally { } } bool SetupGraph() { int hr; IFileSinkFilter sink = null; try { hr = capGraphBuilder.SetFiltergraph(graphBuilder); if( hr < 0 ) Marshal.ThrowExceptionForHR( hr ); #if DEBUG DsROT.AddGraphToRot(graphBuilder, out rotCookie); #endif hr = graphBuilder.AddFilter( capFilter, "Ds.NET Video Capture Device" ); if( hr < 0 ) Marshal.ThrowExceptionForHR( hr ); Guid sub = MediaSubType.Avi; hr = capGraphBuilder.SetOutputFileName(ref sub, fileName, out muxFilter, out sink); if (hr < 0) Marshal.ThrowExceptionForHR(hr); if (videoCompressorFilter != null) { hr = graphBuilder.AddFilter(videoCompressorFilter, "Video Compressor"); if (hr < 0) Marshal.ThrowExceptionForHR(hr); } Guid cat = PinCategory.Capture; Guid med = MediaType.Video; hr = capGraphBuilder.RenderStream(ref cat, ref med, capFilter, videoCompressorFilter, muxFilter); if( hr < 0 ) Marshal.ThrowExceptionForHR( hr ); cat = PinCategory.Preview; med = MediaType.Video; hr = capGraphBuilder.RenderStream(ref cat, ref med, capFilter, null, null); if (hr < 0) Marshal.ThrowExceptionForHR(hr); return true; } catch( Exception ee ) { MessageBox.Show( this, "Could not setup graph\r\n" + ee.Message, "DirectShow.NET", MessageBoxButtons.OK, MessageBoxIcon.Stop ); return false; } finally { if( sink != null ) Marshal.ReleaseComObject( sink ); sink = null; } }
|
При попытке запустить реденринг потока с указанным кодеком hr = capGraphBuilder.RenderStream(ref cat, ref med, capFilter, videoCompressorFilter, muxFilter); получаю ошибку (hr<0) если вместо videoCompressorFilter указать null, то проглатывает и пишет в файл без компрессии. В чём может быть дело, что неправильно делаю? C DirectShow работаю только несколько дней, так что сильно не ругайтесь  Да, на всякий случай отмечу, что есть екзешник проги, написанной на С# с использованием той же DirectShow.Net, что юзаю я, которая цепляет эту же камеру и тот же кодек, который пытаюсь использовать я, и нормально записывает сжатое видео в файл. Может есть у кого исходники простейшего (рабочего  ) примера записи с использованием кодека: установить граф, задать файл для вывода и кодек и начать запись, чтобы без лишних наворотов? Заранее благодарен!
|