none
請問經由DirectShow攝取的Camera視窗解析度該如何調整? RRS feed

解答

  • 這篇文章呆滯多天看來此題應該是無解了!

    小弟後來的解決方法是由下面網址的CAMERA例子裡去做修改(引用他做的DLL檔)

    http://alexmogurenko.com/blog/

    來解決小弟的問題

    在此還是感謝各位大大協助

    感恩!!

    • 已標示為解答 JACK1043 2010年5月10日 上午 06:42
    2010年5月10日 上午 06:41

所有回覆

  • 看看這篇有沒有幫助:

    Setting camera resolution through DirectShow
     

    2010年4月21日 上午 06:25
  • 感謝 tihs 大大的回覆

    目前小弟明白了解析度的部分可以由DirectShow的IAMStreamConfig來做設定

    可是小弟只是用C#(新手)

    C++的程式碼很難把他轉成C#來應用

    希望各位大大可以再提供一點意見供小弟參考

    這邊還有篇有關連性的文章

    http://blog.yam.com/mobius1008/article/18852773

    2010年4月22日 下午 03:07
  • 您可以考慮用這個LIBRARY:DirectShowNET Library

    2010年4月23日 上午 07:40
  • 嗯嗯

    感謝tihs大大提供!

    這個正是目前小弟已在使用的Library

    C#的DirectShow開發似乎完全聯繫在這個Library上

    不過問題還是卡在C++轉換成C#這一塊

    還請各位大大給予協助

    2010年4月23日 上午 08:14
  • 各位大大您好

    不才小弟在DirectShow.NET的Sample裡頭找到某段設置IAMStreamConfig的物件源碼

    想取之套用

    程式碼如下:

            // 設置幀率和視頻大小
            private void SetConfigParms(ICaptureGraphBuilder2 captureGraphBuilder,

            IBaseFilter videoCaptureFilter, int iFrameRate, int iWidth, int iHeight)
            {
                int hr;
                object o;
                AMMediaType media;
                IAMStreamConfig videoStreamConfig;
                IAMVideoControl videoControl = videoCaptureFilter as IAMVideoControl;

                // 查找Stream配置界面
                hr = captureGraphBuilder.FindInterface(
                    PinCategory.Capture, MediaType.Video, videoCaptureFilter,

                    typeof(IAMStreamConfig).GUID, out o);

                videoStreamConfig = o as IAMStreamConfig;
                try
                {
                    if (videoStreamConfig == null)
                    {
                        throw new Exception("Failed to get IAMStreamConfig");
                    }

                    hr = videoStreamConfig.GetFormat(out media);
                    DsError.ThrowExceptionForHR(hr);

                    // 複製出videoinfoheader
                    VideoInfoHeader v = new VideoInfoHeader();
                    Marshal.PtrToStructure(media.formatPtr, v);

                    // 如果超出幀率就重新設定偵率
                    if (iFrameRate > 0)
                    {
                        v.AvgTimePerFrame = 10000000 / iFrameRate;
                    }

                    // 如果超過本來的寬度,設置寬度
                    if (iWidth > 0)
                    {
                        v.BmiHeader.Width = iWidth;
                    }

                    // 如果超過本來的高度,設置高度
                    if (iHeight > 0)
                    {
                        v.BmiHeader.Height = iHeight;
                    }

                    //複製媒體結構回來
                    Marshal.StructureToPtr(v, media.formatPtr, false);

                    // 設定新的幀率
                    hr = videoStreamConfig.SetFormat(media);
                    DsError.ThrowExceptionForHR(hr);

                    DsUtils.FreeAMMediaType(media);
                    media = null;

                    // Fix upsidedown video
                    if (videoControl != null)
                    {
                        VideoControlFlags pCapsFlags;

                        IPin pPin = DsFindPin.ByCategory(videoCaptureFilter, PinCategory.Capture, 0);
                        hr = videoControl.GetCaps(pPin, out pCapsFlags);
                        DsError.ThrowExceptionForHR(hr);

                        if ((pCapsFlags & VideoControlFlags.FlipVertical) > 0)
                        {
                            hr = videoControl.GetMode(pPin, out pCapsFlags);
                            DsError.ThrowExceptionForHR(hr);

                            hr = videoControl.SetMode(pPin, 0);
                        }
                    }
                }
                finally
                {
                    Marshal.ReleaseComObject(videoStreamConfig);
                }
            }

    以上

    並隨後在程式裡寫下

    SetConfigParms(captureGraphBuilder, videoCaptureFilter, 1000, pbVideo.Width, pbVideo.Height);

    來設定

    iFrameRate為1000(亂設的)

    pbVideo為picturebox

    目前偵錯後出現'System.Type' 不包含 'GUID' 的定義,也找不到擴充方法 'Guid' 來接受型別 'System.Type' 的第一個引數

    比對了一下程式碼好像也沒少using甚麼東西

    麻煩各位大大給予指教

    2010年4月24日 下午 04:20
  • 這篇文章呆滯多天看來此題應該是無解了!

    小弟後來的解決方法是由下面網址的CAMERA例子裡去做修改(引用他做的DLL檔)

    http://alexmogurenko.com/blog/

    來解決小弟的問題

    在此還是感謝各位大大協助

    感恩!!

    • 已標示為解答 JACK1043 2010年5月10日 上午 06:42
    2010年5月10日 上午 06:41