2013-05-07 3 views
0

Я пытаюсь захватить изображение с веб-камеры, используя DirectShow.NET и IBasicVideo CetCurrentImage. Но я получаю катастрофический отказ при втором вызове GetCurrentImage. Что я делаю в частности: IBasicVideo CetCurrentImage катастрофический сбой (DirectShow.NET)

IBasicVideo bv = (IBasicVideo)graph; 
IntPtr bvp = new IntPtr(); 
int size = 0; 
int hr = bv.GetCurrentImage(ref size, IntPtr.Zero); 
DsError.ThrowExceptionForHR(hr); 
bvp = Marshal.AllocCoTaskMem(size); 
hr = bv.GetCurrentImage(ref size, bvp); 
DsError.ThrowExceptionForHR(hr); 
Bitmap image = new Bitmap(480, 320, 480 * (24/8), System.Drawing.Imaging.PixelFormat.Format24bppRgb, bvp); 
image.Save(path); 

Что я делаю неправильно?

Prety много всего у меня есть:

IGraphBuilder graph = null; 
IMediaEventEx eventEx = null; 
IMediaControl control = null; 
ICaptureGraphBuilder2 capture = null; 
IBaseFilter srcFilter = null; 
public IVideoWindow videoWindow = null; 
IntPtr videoWindowHandle = IntPtr.Zero; 

public void GetPreviewFromCam() 
{ 
    graph = (IGraphBuilder)(new FilterGraph()); 
    capture = (ICaptureGraphBuilder2)(new CaptureGraphBuilder2()); 
    eventEx = (IMediaEventEx)graph; 
    control = (IMediaControl)graph; 
    videoWindow = (IVideoWindow)graph; 
    videoWindowHandle = hVideoWindow; 
    eventEx.SetNotifyWindow(hVideoWindow, WM_GRAPHNOTIFY, IntPtr.Zero); 

    int hr; 

    // Attach the filter graph to the capture graph 
    hr = capture.SetFiltergraph(graph); 
    DsError.ThrowExceptionForHR(hr); 

    // Find capture device and bind it to srcFilter 
    FindCaptureDevice(); 

    // Add Capture filter to our graph. 
    hr = graph.AddFilter(srcFilter, "Video Capture"); 
    DsError.ThrowExceptionForHR(hr); 

    // Render the preview pin on the video capture filter 
    // Use this instead of graph->RenderFile 
    hr = capture.RenderStream(PinCategory.Preview, MediaType.Video, srcFilter, null, null); 
    DsError.ThrowExceptionForHR(hr); 

    hr = control.Run(); 
    DsError.ThrowExceptionForHR(hr); 
} 
+0

Похоже, этот метод работает, если я просто визуализирую видеофайл, но с захватом камеры это не так. Какие-либо предложения? – WatTheCat

ответ

0

IBasicVideo::GetCurrentImage не должны безоговорочно успеха. То, что он делает, - это пересылка вызова визуализатору видео в ваш график (сбой, если у вас его нет, или у вас есть странный фильтр без рендеринга, который неожиданно реализует интерфейс), тогда рендер попытается получить изображение , Средство рендеринга может выйти из строя, если оно работает в несовместимом режиме (без оконных видеоресурсов нет IBasicVideo - может произойти сбой здесь), или рендер еще не получил какой-либо видеокадр, чтобы получить копию, доставленную вам, то есть вызов преждевременен ,

Кроме того, может быть несколько других проблем, связанных с очевидными ошибками - вы не помещали график в активный режим, вы находитесь под неправильным впечатлением о топологии, которую вы имеете, вы используете неправильный интерфейс, ваш код имеет резьбу вопросы и т. д.

С призраком возможных причин этого широкого, начните с простого вопроса: во время разговора у вас есть визуальный кадр, уже представленный вам визуально?

+0

Спасибо за ответ. И да, я могу видеть предварительный просмотр с камеры, когда я вызываю код выше. – WatTheCat

+0

Одним из быстрых обходных решений, которые вы можете попробовать, является точное определение фильтра визуализации видео, запрос его 'IBasicVideo' и вызов GetCurrentImage на нем. Этот фильтр может также реализовывать другой интерфейс с поддержкой GetCurrentImage. Трудно сказать, делает ли это именно потому, что вы не предоставляете достаточно подробностей. –

+0

О, я могу предоставить любые детали, которые вам нужны. На самом деле, это весь код, который у меня есть (я отправляю его в основное сообщение). – WatTheCat

Смежные вопросы