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:
Grundsätzlich versuche ich, in wmv statt unkomprimierte AVI (so etwas wie DivX/XviD wäre auch in Ordnung)
Dank
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
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. –