Я пытаюсь написать простое вспомогательное приложение, которое используется, чтобы побудить пользователя включить видеокамеру, если сигнал не обнаружен, что в данном случае означает, что видеокамера выключена и/или кабель HDMI не подключен в карту захвата PCMCIA. Если сигнал присутствует, я запускаю соответствующее приложение для записи, в этом случае Wirecast.
Как я могу, возможно, начать создавать это с помощью С# в VisualStudio?
Update
Я думаю, что теперь я намного ближе, попробовав предложение, основанное на одном из комментариев, предлагающем использовать GraphEdit и видя, что доступно на аппаратном обеспечении. Я смог найти в свойствах устройства захвата, флаг "Signal Detected", который изменяется от 0 до 1, если видеокамера включена/выключена, или кабель HDMI отсоединен, и это то, что я хочу.
Теперь, как мне получить доступ к этому флагу через код? Я думаю, что я действительно близко, но не знаю, как получить доступ к структуре cElems
и pElems
из caGUID
. cElems
возвращает значение 3, равное количеству вкладок, отображаемых в окне свойств GraphEdit, показанном ниже на скриншоте. pElems
возвращает другое значение при каждом запуске приложения, поэтому я не уверен, что происходит в этой структуре. Я думаю, что флаг, который я ищу, лежит где-то внутри этих структур.
код:
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";
}
}