2017-08-18 9 views
0

Ich versuche, die Videoauflösungen einer USB-Kamera mit DirectShow aufzuzählen, auf die von WPF über COM zugegriffen wird. Ich habe den folgenden Testcode.Auflisten verfügbarer Kameraauflösungen über DirectShow

Ich glaube jedoch, dass mediaType einige Audio-Funktionen sowie Video abholen. Z.B. jede andere Iteration gibt mir eine header.BmiHeader.Width von 0 und eine header.BmiHeader.BitCount von 0.

Erstens, bin ich richtig im Denken, dass dies von Casting Audio-Funktionen mit VideoInfoHeader resultiert.

Wie würde ich nur die Videofunktionen aufzählen und Audio beseitigen?

==============================

EDIT

verwendete ich die Directshow-Capture-Fähigkeiten Werkzeug und wurde im Anschluss an die für den Verdächtigen Fähigkeit:

Fähigkeit: 1
  • AM_MEDIA_TYPE:
    • Daten: 76 69 64 73 00 00 10 00 80 00 00 AA 00 38 9B 71 59 55 59 32 00 00 10 00 80 00 00 AA 00 38 9B 71 01 00 00 00 00 00 00 00 00 60 09 00 A0 76 2A F7 0A EB D0 11 AC E4 00 00 C0 CC 16 BA 00 00 00 00 70 00 00 00 40 07 B3 03
    • Format Daten: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CA 08 00 00 00 00 15 16 05 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 03 00 00 00 81 26 8D 00 00 00 00 00 28 00 00 00 80 02 00 00 E0 01 00 00 01 00 10 00 59 55 59 32 00 60 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    • .subtype: FourCC YUY2
    • .bFixedSizeSamples: 1
    • .bTemporalCompression: 0
    • .lSampleSize: 614,400
    • .cbFormat: 112
    • VIDEOINFOHEADER2:
  • Unbekannt Fähigkeiten:
    • Typ: {F72A76A0-EB0A-11D0-ACE4-0000C0CC16BA}
    • Daten: A0 76 2A F7 0A EB D0 11 AC E4 00 00 C0 CC 16 BA 00 00 00 00 80 02 00 00 E0 01 00 00 80 02 00 00 E0 01 00 00 80 02 00 00 E0 01 00 00 01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 80 02 00 00 E0 01 00 00 80 02 00 00 E0 01 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 15 16 05 00 00 00 00 00 15 16 05 00 00 00 00 00 00 00 CA 08 00 00 CA 08

Hat das Sinn machen ???

==============================

EDIT # 2

Nach Roman R.‘ s Rat (wenn ich es richtig verstehe).

Ich erkläre: -

private static readonly Guid VideoInfo = 
     new Guid(0x05589F80, 0xC356, 0x11CE, 0xBF, 0x01, 0x00, 0xAA, 0x00, 0x55, 0x59, 0x5A); 

Dann ändern Sie den Code wie folgt:

for (var i = 0; i < piCount; i++) 
     { 
      var mediaType = new AMMediaType(); 
      if (streamConfig.GetStreamCaps(i, ref mediaType, ptr) != 0) 
      { 
       continue; 
      } 

      if (mediaType.FormatType != VideoInfo) 
      { 
       continue; 
      } 

      Marshal.PtrToStructure(mediaType.FormatPtr, typeof(VideoInfoHeader)); 

      var header = (VideoInfoHeader)Marshal.PtrToStructure(mediaType.FormatPtr, typeof(VideoInfoHeader)); 

      var resolution = header.BmiHeader.BitCount + " bits : " + header.BmiHeader.Width + " * " 
          + header.BmiHeader.Height; 

      this.mediaTypes.Add(mediaType); 
      resolutions.Add(resolution); 
     } 

Die obige Änderung scheint zum Beispiel zu arbeitenEs arbeitet an meiner Testkamera. Sieht das richtig aus? Gibt es noch etwas, worüber ich mich mit diesem Code sorgen sollte ???

Antwort

0

Ich glaube, dass mediaType einige Audio-Funktionen sowie Video abholen. [...]

Wie würde ich nur die Videofunktionen aufzählen und Audio beseitigen?

Auch wenn es möglich ist, ist es höchst unwahrscheinlich, dass Video- und Audiofunktionen und Medientypen an einer bestimmten PIN gemischt sind. Das heißt, listet es richtig auf und Sie erhalten nur Video-Einsen, oder nur Audio-Einsen abhängig von der PIN.

Sie können Ihre Aufzählung immer mit Medientypen vergleichen, die von GraphEdit, GraphStudioNext oder DirectShowCaptureCapabilities angezeigt werden.

+0

Vielen Dank für Ihren Rat. Ich habe meine Frage mit einigen Daten aktualisiert. Ich bin mir nicht sicher, warum es unbekannte Fähigkeiten gibt .... ??? – user3079907

+0

OK, also haben Sie eine Hälfte von 'FORMAT_VideoInfo' und die andere Hälfte ist' FORMAT_VideoInfo2'. Sie müssen das Feld "Typ" überprüfen, um es voneinander zu unterscheiden. –

+0

Danke, ich habe den Code geändert und meine Frage aktualisiert. Es scheint mit meinen Testkameras zu funktionieren. Habe ich recht damit zu denken, dass ich nur mit zwei Formaten arbeiten muss: FORMAT_VideoInfo und FORMAT_VideoInfo2? – user3079907