Невозможно изменить разрешение захвата видео с помощью С#

Я пытаюсь изменить разрешение веб-камеры по умолчанию с помощью DirectShowNet в С#, из того, что я понимаю, мне нужно изменить его с вызова встроенного класса VideoInfoHeader в Windows win32 api dll для захвата avi. У меня есть следующий код из DirectShowNet:

        hr = capGraph.SetFiltergraph( graphBuilder );
        if( hr < 0 )
            Marshal.ThrowExceptionForHR( hr );

        AMMediaType media = new AMMediaType();
        media.majorType = MediaType.Video;
        media.subType = MediaSubType.RGB24;
        media.formatType = FormatType.VideoInfo;        // ???
        hr = sampGrabber.SetMediaType(media);
        if (hr < 0)
            Marshal.ThrowExceptionForHR(hr);

        hr = graphBuilder.AddFilter( capFilter, "Ds.NET Video Capture Device" );
        if( hr < 0 )
            Marshal.ThrowExceptionForHR( hr );

        DsUtils.ShowCapPinDialog( capGraph, capFilter, this.Handle );

        Guid sub = MediaSubType.Avi;
        hr = capGraph.SetOutputFileName( ref sub, fileName, out mux, out sink );
        if( hr < 0 )
            Marshal.ThrowExceptionForHR( hr );

        Guid cat = PinCategory.Capture;
        Guid med = MediaType.Video;
        hr = capGraph.RenderStream( ref cat, ref med, capFilter, null, mux ); // stream to file 
        if( hr < 0 )
            Marshal.ThrowExceptionForHR( hr );


        media = new AMMediaType();
        hr = sampGrabber.GetConnectedMediaType(media);
        if (hr < 0)
            Marshal.ThrowExceptionForHR(hr);
        if ((media.formatType != FormatType.VideoInfo) || (media.formatPtr == IntPtr.Zero))
            throw new NotSupportedException("Unknown Grabber Media Format");

        videoInfoHeader = (VideoInfoHeader)Marshal.PtrToStructure(media.formatPtr, typeof(VideoInfoHeader));
        Marshal.FreeCoTaskMem(media.formatPtr); media.formatPtr = IntPtr.Zero;

Дело в том, что я не могу получить доступ к videoInfoHeader, потому что в этой строке: hr = sampGrabber.GetConnectedMediaType(media); он идет и говорит, что hr меньше 0, поэтому выдает эту ошибку: интерфейс имеет слишком много методов для запуска событий (исключение из HRESULT: 0x80040209)

Он не будет читать бит VideoInfoHeader, поэтому я не могу изменить разрешение захвата веб-камеры, кто-нибудь знает лучший способ сделать это или как это исправить?


person James    schedule 10.12.2010    source источник
comment
Получите список разрешений, поддерживаемых камерой: stackoverflow.com /вопросы/20414099/   -  person Pranesh Janarthanan    schedule 20.05.2016


Ответы (2)


Убедитесь, что при поиске кодов ошибок отдела кадров вы используете ссылку Список ошибок и кодов успеха DirectShow, а не общий список кодов HR. Из этого списка вы увидите, что фактическое значение 0x80040209:

VFW_E_NOT_CONNECTED Операция не может быть выполнена, так как контакты не подключены.

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

person heavyd    schedule 10.12.2010
comment
Дело в том, что я не могу передать свой образец захвата в RenderStream, он ожидает IbaseFilter, поэтому я привожу свой образец захвата к IBasefilter и пытаюсь заменить им переменную мультиплексора в приведенном выше коде, но эта переменная мультиплексора выходит из SetOutFileName. () вызов, поэтому я должен использовать это, вы знаете какой-нибудь способ? - person James; 11.12.2010
comment
Передайте устройство захвата сэмплов в качестве промежуточного фильтра (параметр null). - person heavyd; 11.12.2010

Правильный способ изменить разрешение веб-камеры — запросить ее выходной контакт интерфейса IAMStreamConfig. Он может перечислить доступные форматы и разрешение и выбрать один. Если вы запустите GraphEditPlus и щелкните правой кнопкой мыши выходной контакт фильтра камеры, вы сможете увидеть этот список. и сделать выбор разрешения. Затем вы можете сгенерировать код (через меню «Файл») и посмотреть, как это делается в C#.

person Dee Mon    schedule 13.12.2010