c# - VideoCamera 获得支持的分辨率

标签 c# video directshow resolution directshow.net

我正在使用带有 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/

相关文章:

c - Visual Studio 中 Unresolved external symbol IID 和 CLSID 错误

C# 注册嵌入式 Directshow 过滤器

c++ - ISampleGrabber 可以将视频帧转换为特定的媒体类型吗?

html - Vue.js 如何绑定(bind) html5 视频元素的播放速率?

video - 从视频中删除渐变

c# - 如何不将一个类(class)暴露给除一个类(class)以外的任何其他类(class)? (C#)

c# - 使用委托(delegate)来简化函数调用

audio - 错误 : Argument 'Creation]/audio_section_working/1.mp3' provided as input filename, 但已指定 '/e/[Content'

c# - .net:为什么在命名空间中使用 int 是不合法的?

c# - 如何从实时流中播放音频