DShow 似乎让相机忙碌

问题描述

我有一个应用程序,它可以从配置的摄像头流式传输视频。还有可选的配置属性来指定精确的分辨率。为了不破坏应用程序,我首先检查是否支持分辨率。我就是这样做的

public static List<CameraInfo> GetAllAvailableResolution(DsDevice vidDev)
    {
        try
        {
            int bitCount = 0;
            var AvailableResolutions = new List<CameraInfo>();
            VideoInfoHeader v;
            var m_Filtergraph2 = new Filtergraph() as IFiltergraph2;
            int hr = m_Filtergraph2.AddSourceFilterForMoniker(vidDev.Mon,null,vidDev.Name,out IBaseFilter sourceFilter);
            var pRaw2 = DsFindPin.ByCategory(sourceFilter,PinCategory.Capture,0);
            IAMStreamConfig videoStreamConfig = pRaw2 as IAMStreamConfig;

            videoStreamConfig.GetNumberOfCapabilities(out int iCount,out int iSize);

            IntPtr TaskMemPointer = Marshal.AllocCoTaskMem(iSize);

            for (int iFormat = 0; iFormat < iCount; iFormat++)
            {
                IntPtr ptr = IntPtr.Zero;

                videoStreamConfig.GetStreamCaps(iFormat,out AMMediaType pmtConfig,TaskMemPointer);

                v = (VideoInfoHeader)Marshal.PtrToStructure(pmtConfig.formatPtr,typeof(VideoInfoHeader));
                if (v.BmiHeader.Size != 0 && v.BmiHeader.BitCount != 0)
                {
                    if (v.BmiHeader.BitCount > bitCount)
                    {
                        AvailableResolutions.Clear();
                        bitCount = v.BmiHeader.BitCount;
                    }
                    var cameraInfo = new CameraInfo()
                    {
                        FrameRate = 10000000.0 / v.AvgTimePerFrame,Resolution = $"{v.BmiHeader.Width}x{v.BmiHeader.Height}"
                    };

                    AvailableResolutions.Add(cameraInfo);
                }
                DsUtils.FreeAMMediaType(pmtConfig);
            }

            Marshal.FreeCoTaskMem(TaskMemPointer);
            m_Filtergraph2.disconnect(pRaw2);
            m_Filtergraph2.Abort();
            return AvailableResolutions;
        }
        catch (Exception)
        {
            return new List<CameraInfo>();
        }
    }

问题在于,对于某些相机,它似乎让它保持忙碌或打开状态,或者其他任何东西,我都无法从中进行流式传输。我发现 m_Filtergraph2 是实际问题。尝试了一切来“处理”它,但没有生效。对于我有问题的相机,如果我删除对此方法调用并直接设置分辨率,一切都很好。如果重要的话,我将 ffmpeg libav 用于实际的视频流。如何处置/彻底关闭

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)