Ich versuche, eine einfache Hilfeanwendung zu schreiben, die den Benutzer auffordert, einen Camcorder einzuschalten, wenn kein Signal erkannt wird, was in diesem Fall bedeuten würde, dass der Camcorder ausgeschaltet ist und/oder das HDMI-Kabel nicht eingesteckt ist die PCMCIA-Aufnahmekarte. Wenn das Signal vorhanden ist, starte ich die entsprechende Aufnahmeanwendung, in diesem Fall Wirecast.Wie erkennt man, ob das HDMI-Kabel an die PCMCIA-Karte angeschlossen ist/kein Signal?
Wie könnte ich vielleicht über das Erstellen von C# in VisualStudio gehen?
aktualisieren
Ich glaube, ich bin viel jetzt näher durch einen Vorschlag in einer der Kommentare auf Basis versuchen, was darauf hindeutet, GraphEdit zu nutzen und zu sehen, was auf der Hardware zur Verfügung steht. Ich konnte innerhalb der Eigenschaften des Aufnahmegeräts ein "Signal erkannt" -Flag finden, das sich von 0 auf 1 ändert, wenn der Camcorder ein-/ausgeschaltet ist oder das HDMI-Kabel nicht angeschlossen ist, was ich will.
Nun, wie würde ich über das Zugreifen auf diese Flagge durch Code gehen? Ich denke ich bin wirklich nah dran, aber weiß nicht wie ich auf die Struktur cElems
und pElems
von caGUID
zugreifen kann. cElems
gibt den Wert 3 zurück. Dies ist die gleiche Anzahl von Registerkarten, die im unten abgebildeten GraphEdit-Eigenschaftenfenster in einem Screenshot angezeigt werden. pElems
gibt jedes Mal einen anderen Wert zurück, wenn ich die App starte, daher bin ich mir nicht sicher, was in dieser Struktur passiert. Ich würde denken, dass die Flagge, nach der ich suche, irgendwo in diesen Strukturen liegt.
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using DirectShowLib;
namespace Test
{
static class Program
{
[STAThread]
static void Main()
{
using (System.Threading.Mutex mutex = new System.Threading.Mutex(false, "Global\\" + appGuid))
{
if (!mutex.WaitOne(0, false))
{
return;
}
DsDevice[] capDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
foreach (var dev in capDevices)
{
if (dev.DevicePath == @"@device:pnp:\\?\pci#ven_1131&dev_7160&subsys_12abf50a&rev_03#6&37bccbbe&0&000800e1#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\{6f814be9-9af6-43cf-9249-c0340100021c}")
{
IFilterGraph2 m_FilterGraph = (IFilterGraph2)new FilterGraph();
IBaseFilter capFilter = null;
ICaptureGraphBuilder2 capGraph = null;
capGraph = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();
int hr;
hr = capGraph.SetFiltergraph(m_FilterGraph);
hr = m_FilterGraph.AddSourceFilterForMoniker(dev.Mon, null, dev.Name, out capFilter);
ISpecifyPropertyPages pProp = capFilter as ISpecifyPropertyPages;
FilterInfo filterInfo;
hr = capFilter.QueryFilterInfo(out filterInfo);
DsCAUUID caGUID;
hr = pProp.GetPages(out caGUID);
Console.WriteLine(caGUID.cElems);
Console.WriteLine(caGUID.pElems);
// caGUID.cElems returns '3', which is the correct number of tabs in the property pages shown in GraphEdit.
// caGUID.pElems returns a different value every time
break;
}
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
private static string appGuid = "z0a76b5a-02cd-15c5-b9d9-d303zcdde7b9";
}
}
Wenn Ihr Capture-Programm Directshow nutzt, gibt es wahrscheinlich eine COM-Schnittstelle, die Informationen über physikalische Ports auf dem Eingangs Hardware aussetzt. Ich schlage vor, das DirectShow-Programm "GraphEdit" zu betrachten, um ein Diagramm zum Lesen von Multimediaströmen von Ihrer Hardware zu erstellen und um zu sehen, was ausgesetzt ist. – Dai
http://www.codeproject.com/Articles/21503/Hardware-Helper-Library-for-C – Mikes3ds
@ Mikes3ds, glaube ich nicht, dass Bibliothek helfen würde? Die von mir verwendete PCI-Karte bleibt immer angeschlossen, aber ich muss wissen, ob das HDMI-Kabel an diese Karte angeschlossen ist und ob ein Signal vorhanden ist. Es sieht so aus, als würde diese Bibliothek nur dazu dienen, zu erkennen, ob die Karte selbst hinzugefügt oder entfernt wurde. – klcjr89