Also, ich beschäftige mich jetzt schon einige Wochen mit DirectShow. Ich kann zwar mittlerweile auf verschiedenste Weisen mein VideoCaptureDevice einbinden und sowohl ein Videofile speichern mit gleichzeitiger Preview anzeigen lassen. Aber dabei kann ich weder berücksichtigen, dass von der Audioquelle mit aufgezeichnet wird, noch dass ich das Video in MPEG2 abgespeichert wird. Ich weiß nur, dass ich eine Filterkette erstellen muss.
Ich dachte, dass ich da bei GraphEdit vielleicht ein Codebeispiel bekomme, wie genau das geht. Immerhin kann ich da Filterketten testen und mir die ClassID etc. anzeigen lassen um diese dann entsprechend einbinden zu können. Eigentlich finde ich das DirectShowLib-2005.dll inklusive Samples ganz hilfreich. Aber ich habe das Gefühl, dass ich damit bei meinem Video/Audio-Projekt nicht mehr weiterkomme. Ich weiß nur, dass es ohne Filterkette nicht geht. Aber Infos dazu sind recht spärlich und verwirrend.
Hier mal der Quelltext mit dem Anfang der Filterkette:
Ich hoffe, dass ich jetzt niemanden überfordere
Gibt es vielleicht bezüglich DirectShow eine verständlichere Documentation als das MSDN oder vielleicht gute Lektüre?
Ich dachte, dass ich da bei GraphEdit vielleicht ein Codebeispiel bekomme, wie genau das geht. Immerhin kann ich da Filterketten testen und mir die ClassID etc. anzeigen lassen um diese dann entsprechend einbinden zu können. Eigentlich finde ich das DirectShowLib-2005.dll inklusive Samples ganz hilfreich. Aber ich habe das Gefühl, dass ich damit bei meinem Video/Audio-Projekt nicht mehr weiterkomme. Ich weiß nur, dass es ohne Filterkette nicht geht. Aber Infos dazu sind recht spärlich und verwirrend.
Hier mal der Quelltext mit dem Anfang der Filterkette:
VB.NET-Quellcode
- Imports System.Drawing
- Imports System.Collections
- Imports System.ComponentModel
- Imports System.Windows.Forms
- Imports System.Data
- Imports System.Runtime.InteropServices
- Imports System.Diagnostics
- Imports DirectShowLib
- Public Class Form1
- Implements ISampleGrabberCB
- Implements IDisposable
- Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
- Dim hr As Integer
- Dim m_graphBuilder As IFilterGraph2 = Nothing
- Dim m_mediaCtrl As IMediaControl = Nothing
- Dim m_videoWindow As IVideoWindow = Nothing
- Dim m_videoWidth As Integer = Panel1.Width
- Dim m_videoHeight As Integer = Panel1.Height
- Dim AllVideoInputDevices As DsDevice() = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice)
- Dim VideoInput As DsDevice = AllVideoInputDevices(0)
- Dim capFilter As IBaseFilter = Nothing
- Dim capGraph As ICaptureGraphBuilder2 = Nothing
- m_graphBuilder = DirectCast(New FilterGraph(), IFilterGraph2)
- m_mediaCtrl = DirectCast(m_graphBuilder, IMediaControl)
- capGraph = DirectCast(New CaptureGraphBuilder2(), ICaptureGraphBuilder2)
- m_videoWindow = DirectCast(m_graphBuilder, IVideoWindow)
- hr = capGraph.SetFiltergraph(DirectCast(m_graphBuilder, IGraphBuilder))
- hr = m_graphBuilder.AddSourceFilterForMoniker(VideoInput.Mon, Nothing, VideoInput.Name, capFilter)
- ' Microsoft MPEG2 Encoder-Filter erstellen
- Dim MPEG2EncoderGuid As Guid = New Guid("5F5AFF4A-2F7F-4279-88C2-CD88EB39D144")
- Dim t As Type = Type.GetTypeFromCLSID(MPEG2EncoderGuid)
- Dim encoder As IBaseFilter = DirectCast(Activator.CreateInstance(t), IBaseFilter)
- Dim encoderIn1 As IPin = Nothing
- Dim encoderIn2 As IPin = Nothing
- Dim encoderOut As IPin = Nothing
- hr = encoder.FindPin("In", encoderIn1)
- hr = encoder.FindPin("In", encoderIn2)
- hr = encoder.FindPin("Out", encoderOut)
- hr = m_graphBuilder.AddFilter(encoder, "Microsoft MPEG-2 Encoder")
- ' File Writer erstellen
- Dim pinInfo As PinInfo = Nothing
- Dim fetched As Integer = 0
- Dim fileWriterIn As IPin = Nothing
- Dim pin As IPin = Nothing
- Dim pins As IEnumPins = Nothing
- Dim FileWriterGuid As Guid = New Guid("8596E5F0-0DA5-11D0-BD21-00A0C911CE86")
- t = Type.GetTypeFromCLSID(FileWriterGuid)
- Dim fileWriter As IBaseFilter = DirectCast(Activator.CreateInstance(t), IBaseFilter)
- Dim sink As IFileSinkFilter = DirectCast(fileWriter, IFileSinkFilter)
- Dim MT As AMMediaType = New AMMediaType()
- MT.majorType = MediaType.Stream
- MT.subType = MediaSubType.RGB24
- MT.formatType = FormatType.MpegStreams
- sink.SetFileName("D:\newTest.mpg", MT)
- hr = m_graphBuilder.AddFilter(fileWriter, "File Writer")
- fileWriter.EnumPins(pins)
- pins.Next(1, fileWriterIn, fetched)
- ' Hole Video Capture Out
- Dim videoCaptureOut As IPin = Nothing
- While (fetched > 0)
- pins.Next(1, pin, fetched)
- If (fetched > 0) Then
- pin.QueryPinInfo(pinInfo)
- If pinInfo.dir = PinDirection.Output Then
- videoCaptureOut = pin
- End If
- End If
- End While
- ' Verbinde die Filterkette
- m_graphBuilder.Connect(videoCaptureOut, encoderIn1)
- m_graphBuilder.Connect(encoderOut, fileWriterIn)
- hr = capGraph.RenderStream(PinCategory.Preview, MediaType.Video, capFilter, Nothing, Nothing)
- If hr > 0 Then MsgBox(hr.ToString)
- ' VideoWindow initialisieren
- hr = m_videoWindow.put_Top(0)
- hr = m_videoWindow.put_Left(0)
- hr = m_videoWindow.put_Width(m_videoWidth)
- hr = m_videoWindow.put_Height(m_videoHeight)
- hr = m_videoWindow.put_WindowStyle(WindowStyle.Visible)
- hr = m_videoWindow.put_Owner(Panel1.Handle)
- m_mediaCtrl.Run()
- End Sub
- Public Function BufferCB(ByVal SampleTime As Double, ByVal pBuffer As System.IntPtr, ByVal BufferLen As Integer) As Integer Implements DirectShowLib.ISampleGrabberCB.BufferCB
- End Function
- Public Function SampleCB(ByVal SampleTime As Double, ByVal pSample As DirectShowLib.IMediaSample) As Integer Implements DirectShowLib.ISampleGrabberCB.SampleCB
- End Function
- End Class
Ich hoffe, dass ich jetzt niemanden überfordere
![;(](https://www.vb-paradise.de/wcf/images/smilies/crying.png)
Gibt es vielleicht bezüglich DirectShow eine verständlichere Documentation als das MSDN oder vielleicht gute Lektüre?
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Radium“ ()