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: 1AM_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
:
- Daten:
- 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
- Typ:
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 ???
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
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. –
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