Sto provando a scrivere una semplice applicazione di supporto che viene utilizzata per richiedere all'utente di accendere una videocamera se non viene rilevato alcun segnale, che in questo caso significherebbe che il camcorder è spento e/o il cavo HDMI non è collegato a la scheda di acquisizione PCMCIA. Se il segnale è presente, avvio la rispettiva applicazione di registrazione, in questo caso Wirecast.Come rilevare se il cavo HDMI è collegato alla scheda PCMCIA/nessun segnale?
Come potrei andare a creare questo utilizzando C# in VisualStudio?
Aggiornamento
penso di essere un sacco più vicino adesso cercando un suggerimento con sede in uno dei commenti che suggeriscono di utilizzare GraphEdit e vedere cosa è disponibile l'hardware. Sono stato in grado di trovare all'interno delle proprietà del dispositivo di acquisizione, un indicatore "Signal Detected" che cambia da 0 a 1 se il camcorder è acceso/spento o il cavo HDMI è scollegato, che è quello che voglio.
Ora, come potrei fare per accedere a questo flag tramite il codice? Penso di essere molto vicino, ma non so come accedere alla struttura di cElems
e pElems
dal caGUID
. cElems
restituisce un valore di 3, che è lo stesso numero di schede visualizzate nella finestra delle proprietà GraphEdit mostrata di seguito in uno screenshot. pElems
restituisce un valore diverso ogni volta che eseguo l'app, quindi non sono sicuro di cosa sta succedendo in quella struttura. Penserei che la bandiera che sto cercando si trovi da qualche parte all'interno di quelle strutture.
Codice:
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";
}
}
Se il programma di cattura utilizza DirectShow, probabilmente c'è un'interfaccia COM che espone informazioni sulle porte fisiche disponibili sull'hardware di ingresso. Suggerisco di guardare il programma "GraphEdit" di DirectShow per costruire un grafico per la lettura di flussi multimediali dal vostro hardware e vedere cosa viene esposto. – Dai
http://www.codeproject.com/Articles/21503/Hardware-Helper-Library-for-C – Mikes3ds
@ Mikes3ds, non penso che la libreria sarebbe d'aiuto? La scheda PCI che sto usando rimane sempre collegata, ma ho bisogno di sapere se il cavo HDMI è collegato a questa scheda e se ha un segnale presente. Sembra che quella libreria sarebbe solo per rilevare se la carta stessa è stata aggiunta o rimossa. – klcjr89