Wpf 通过DirectShow枚举可用的相机分辨率

Wpf 通过DirectShow枚举可用的相机分辨率,wpf,directshow,Wpf,Directshow,我试图使用从WPF通过COM访问的DirectShow枚举USB摄像头的视频分辨率。 我有以下测试代码 var videoOutPin = this.BaseFilterObject.GetPin(PinDirection.Output, 0); var streamConfig = (IAMStreamConfig)videoOutPin; var piCount = 0; var piSize = 0; if (streamConfig.GetNumberOfCapabilities(

我试图使用从WPF通过COM访问的DirectShow枚举USB摄像头的视频分辨率。 我有以下测试代码

var videoOutPin = this.BaseFilterObject.GetPin(PinDirection.Output, 0);

var streamConfig = (IAMStreamConfig)videoOutPin;

var piCount = 0;
var piSize = 0;

if (streamConfig.GetNumberOfCapabilities(ref piCount, ref piSize) != 0)
{
    return;
}

this.mediaTypes = new Collection<AMMediaType>();

var resolutions = new Collection<string>();

var ptr = Marshal.AllocCoTaskMem(piSize);

for (var i = 0; i < piCount; i++)
{
    var mediaType = new AMMediaType();
    if (streamConfig.GetStreamCaps(i, ref mediaType, ptr) != 0)
    {
        continue;
    }

    var header = (VideoInfoHeader)Marshal.PtrToStructure(mediaType.FormatPtr, typeof(VideoInfoHeader));

    var resolution = header.BmiHeader.BitCount + " bits : " + header.BmiHeader.Width + " * " + header.BmiHeader.Height;

    this.mediaTypes.Add(mediaType);
    resolutions.Add(resolution);
}
然后按如下方式修改代码:

 for (var i = 0; i < piCount; i++)
        {
            var mediaType = new AMMediaType();
            if (streamConfig.GetStreamCaps(i, ref mediaType, ptr) != 0)
            {
                continue;
            }

           if (mediaType.FormatType != VideoInfo)
            {
                continue;
            }

            Marshal.PtrToStructure(mediaType.FormatPtr, typeof(VideoInfoHeader));

            var header = (VideoInfoHeader)Marshal.PtrToStructure(mediaType.FormatPtr, typeof(VideoInfoHeader));

            var resolution = header.BmiHeader.BitCount + " bits : " + header.BmiHeader.Width + " * "
                             + header.BmiHeader.Height;

            this.mediaTypes.Add(mediaType);
            resolutions.Add(resolution);
        }
for(变量i=0;i
上述更改似乎有效,例如,它正在我的测试相机上工作。这看起来对吗。这个代码还有什么我应该担心的吗

我相信mediaType正在学习一些音频和视频功能。[……]

如何仅列举视频功能并消除音频

即使可能,视频和音频功能以及媒体类型在特定pin上混合的可能性也很小。也就是说,列举正确,你得到的只是视频的,或只是音频的取决于引脚


您可以随时将枚举与GraphiEdit或所示的媒体类型进行比较。

谢谢您的建议。我用一些数据更新了我的问题。我不确定为什么会有未知的功能….???好的,那么你有一半是
格式视频信息
,另一半是
格式视频信息2
。您需要检查
键入
字段以区分不同的字段。谢谢,我已经修改了代码并更新了我的问题。它似乎和我的测试相机一起工作。我认为我只需要处理两种格式FORMAT\u VideoInfo和FORMAT\u VideoInfo2对吗?是的,跳过您不想处理的格式是可以的。
 for (var i = 0; i < piCount; i++)
        {
            var mediaType = new AMMediaType();
            if (streamConfig.GetStreamCaps(i, ref mediaType, ptr) != 0)
            {
                continue;
            }

           if (mediaType.FormatType != VideoInfo)
            {
                continue;
            }

            Marshal.PtrToStructure(mediaType.FormatPtr, typeof(VideoInfoHeader));

            var header = (VideoInfoHeader)Marshal.PtrToStructure(mediaType.FormatPtr, typeof(VideoInfoHeader));

            var resolution = header.BmiHeader.BitCount + " bits : " + header.BmiHeader.Width + " * "
                             + header.BmiHeader.Height;

            this.mediaTypes.Add(mediaType);
            resolutions.Add(resolution);
        }