2013-12-06 7 views
1

Я использую библиотеку DirectShow (DirectShowLib-2005.dll) с C# для захвата изображения видеокамеры. Когда я definig размера объекта захвата, я эти параметры:VideoCamera получает поддерживаемые разрешения

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(); 
    } 
} 

ответ

0

Источник видео может быть гибким, чтобы поддержать любое решение вы запрашиваете (например, в определенных пределах), поэтому список резолюций не то, что необходимое условие для работы фильтра. Есть два способа получения разрешения, предложенное видеоисточником, резолюция она рекламирует поддержку:

  1. использования IAMStreamConfig.GetStreamCaps метода на выход (захват) штифте фильтра. Вот как MSDN предлагает разработчикам реализовать его: Exposing Capture and Compression Formats, и вы можете запросить возможности соответственно. Обратите внимание, что перечисленная возможность, полученная таким образом, может быть не конкретным разрешением, а диапазоном поддерживаемых разрешений для конкретного формата пикселей.

  2. Другим методом является использование IPin.EnumMediaTypes и список доступных типов носителей (и разрешений).

Смотрите также:

2

Поиск по Сети, наконец, я нашел фрагмент кода, используя 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>(); 
    } 
}