Wpf 通过DirectShow枚举可用的相机分辨率
我试图使用从WPF通过COM访问的DirectShow枚举USB摄像头的视频分辨率。 我有以下测试代码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(
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);
}