2012-04-13 9 views
0

Ich benutze direkte Show, um einen Webcam-Stream in meinem vb.net-Programm zu versuchen und zu erfassen. Heres das Unterprogramm läuft, das funktioniert:DirectShow VB.net kann das Aufnahmeformat nicht ändern

Private Sub CaptureVideo() 
      Dim hr As Integer = 0 
      Dim sourceFilter As IBaseFilter = Nothing 
      Try 
       GetInterfaces() 

       hr = Me.CaptureGraphBuilder.SetFiltergraph(Me.GraphBuilder) 
       Debug.WriteLine("Attach the filter graph to the capture graph : " & DsError.GetErrorText(hr)) 
       DsError.ThrowExceptionForHR(hr) 

       sourceFilter = FindCaptureDevice() 

       hr = Me.GraphBuilder.AddFilter(sourceFilter, "Video Capture") 
       Debug.WriteLine("Add capture filter to our graph : " & DsError.GetErrorText(hr)) 
       DsError.ThrowExceptionForHR(hr) 



       hr = Me.CaptureGraphBuilder.RenderStream(PinCategory.Preview, MediaType.Video, sourceFilter, Nothing, Nothing) 
       Debug.WriteLine("Render the preview pin on the video capture filter : " & DsError.GetErrorText(hr)) 
       DsError.ThrowExceptionForHR(hr) 


       Dim pSink As DirectShowLib.IFileSinkFilter = Nothing 
       Dim pMux As DirectShowLib.IBaseFilter = Nothing 
       hr = Me.CaptureGraphBuilder.SetOutputFileName(DirectShowLib.MediaSubType.Avi, "c:\video\myvid1.avi", pMux, pSink) 
       Debug.WriteLine("Set File : " & DirectShowLib.DsError.GetErrorText(hr)) 
       DirectShowLib.DsError.ThrowExceptionForHR(hr) 


       hr = Me.CaptureGraphBuilder.RenderStream(DirectShowLib.PinCategory.Capture, DirectShowLib.MediaType.Video, sourceFilter, Nothing, pMux) 
       Debug.WriteLine("Render the capture pin on the video capture filter : " & DirectShowLib.DsError.GetErrorText(hr)) 
       DirectShowLib.DsError.ThrowExceptionForHR(hr) 

       Marshal.ReleaseComObject(sourceFilter) 

       SetupVideoWindow() 

       rot = New DsROTEntry(Me.GraphBuilder) 

       hr = Me.MediaControl.Run() 
       Debug.WriteLine("Start previewing video data : " & DsError.GetErrorText(hr)) 
       DsError.ThrowExceptionForHR(hr) 

       Me.CurrentState = PlayState.Running 
       Debug.WriteLine("The currentstate : " & Me.CurrentState.ToString) 

      Catch ex As Exception 
       MessageBox.Show("An unrecoverable error has occurred.With error : " & ex.ToString) 
      End Try 
     End Sub 

Allerdings, wenn ich die Zeile:

hr = Me.CaptureGraphBuilder.SetOutputFileName(DirectShowLib.MediaSubType.Avi, "c:\video\myvid1.avi", pMux, pSink) 

zu

hr = Me.CaptureGraphBuilder.SetOutputFileName(DirectShowLib.MediaSubType.Asf, "c:\video\myvid1.wmv", pMux, pSink) 

ich einen schwarzen Bildschirm bekommen und einen Fehler:

enter image description here

Grundsätzlich versuche ich, in wmv statt unkomprimierte AVI (so etwas wie DivX/XviD wäre auch in Ordnung)

Dank

Antwort

0

Sie müssen aufzeichnen WM ASF Writer konfigurieren, bevor Sie es RenderStream mit verbinden können, wie Sie versuchen, . Einzelheiten finden Sie unter Capturing Video to a Windows Media File.

+0

Ich dachte, ich würde das schon tun, ich habe diesen Link gelesen (danke dafür), aber ich verstehe es nicht wirklich, gibt es irgendwelche Hinweise, die du mir geben kannst? – TMB87

+0

Beachten Sie, dass dort "Weitere Informationen zum Festlegen des Profils angezeigt werden, siehe Erstellen von ASF-Dateien in DirectShow." mit einem Link http://msdn.microsoft.com/en-us/library/windows/desktop/dd375008%28v=vs.85%29.aspx Es bedeutet, dass nach 'SetOutputFileName' aber vor' RenderStream' sollten Sie '' aufrufen IConfigAsfWriter :: ConfigureFilterUsingProfile "http://msdn.microsoft.com/en-us/library/windows/desktop/dd312023%28v=vs.85%29.aspx, um Ihren neu hinzugefügten ASF-Writer zu konfigurieren. Wenn Sie beispielsweise nur Video aufnehmen, sollten Sie nur ein Video-Profil anwenden. –

Verwandte Themen