我正在使用带有 C# 的 DirectShow 库 (DirectShowLib-2005.dll) 来捕获摄像机图像。当我定义捕获对象的大小时,我有以下参数:
const int VIDEOWIDTH = 640; // Depends on video device caps
const int VIDEOHEIGHT = 480; // Depends on video device caps
const int VIDEOBITSPERPIXEL = 24; // BitsPerPixel values determined by device
capture = new Capture(0, VIDEOWIDTH, VIDEOHEIGHT, VIDEOBITSPERPIXEL, pictureBox1);
我正在使用这个循环来获取设备的名称。我可以以某种方式读取每个摄像头的所有可能分辨率吗?
DsDevice[] capDevices;
capDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
if (capDevices.Length == 0)
{
//Could not found camera
}
else
{
for (var i = 0; i < capDevices.Length; i++)
{
myCamerName = capDevices[i].Name.ToString();
}
}
最佳答案
在网上搜索,最后我找到了一个代码片段,使用 IPin.EnumMediaTypes
private List<string> GetAllAvailableResolution(DsDevice vidDev)
{
try
{
int hr, bitCount = 0;
IBaseFilter sourceFilter = null;
var m_FilterGraph2 = new FilterGraph() as IFilterGraph2;
hr = m_FilterGraph2.AddSourceFilterForMoniker(vidDev.Mon, null, vidDev.Name, out sourceFilter);
var pRaw2 = DsFindPin.ByCategory(sourceFilter, PinCategory.Capture, 0);
var AvailableResolutions = new List<string>();
VideoInfoHeader v = new VideoInfoHeader();
IEnumMediaTypes mediaTypeEnum;
hr = pRaw2.EnumMediaTypes(out mediaTypeEnum);
AMMediaType[] mediaTypes = new AMMediaType[1];
IntPtr fetched = IntPtr.Zero;
hr = mediaTypeEnum.Next(1, mediaTypes, fetched);
while (fetched != null && mediaTypes[0] != null)
{
Marshal.PtrToStructure(mediaTypes[0].formatPtr, v);
if (v.BmiHeader.Size != 0 && v.BmiHeader.BitCount != 0)
{
if (v.BmiHeader.BitCount > bitCount)
{
AvailableResolutions.Clear();
bitCount = v.BmiHeader.BitCount;
}
AvailableResolutions.Add(v.BmiHeader.Width +"x"+ v.BmiHeader.Height);
}
hr = mediaTypeEnum.Next(1, mediaTypes, fetched);
}
return AvailableResolutions;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return new List<string>();
}
}
关于c# - VideoCamera 获得支持的分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20414099/