我正在尝试使用SharpDX.MediaFoundation(4.2.0)从WebCam捕获视频。我可以呈现默认的媒体类型,但是我希望能够在设备的不同可用格式之间进行选择。
我可以枚举设备来源,但无法获取有关视频媒体类型的信息。
var attributes = new MediaAttributes(1);
attributes.Set(CaptureDeviceAttributeKeys.SourceType.Guid, CaptureDeviceAttributeKeys.SourceTypeVideoCapture.Guid);
var mediaSource = MediaFactory.EnumDeviceSources(attributes)[0].ActivateObject<MediaSource>();
mediaSource.CreatePresentationDescriptor(out var presentationDescriptor);
for (int d = 0; d < presentationDescriptor.StreamDescriptorCount; d++)
{
presentationDescriptor.GetStreamDescriptorByIndex(d, out var isSelected, out var streamDescriptor);
for (int i = 0; i < streamDescriptor.MediaTypeHandler.MediaTypeCount; i++)
{
var type = streamDescriptor.MediaTypeHandler.GetMediaTypeByIndex(i);
if (type.MajorType == MediaTypeGuids.Video)
{
var v = type.QueryInterface<VideoMediaType>();
// contains always empty values
var x = v.VideoFormat;
}
}
}
QueryInterface无法正常工作。所以我尝试了
new VideoMediaType(type.NativePointer)
但是结果是一样的。
另外,我尝试使用SourceReader进行同样的操作
var reader = new SourceReader(mediaSource);
var mediaTypeIndex = 0;
using (var mt = reader.GetNativeMediaType(0, mediaTypeIndex))
{
if (mt.MajorType == MediaTypeGuids.Video)
{
//var vmt = new VideoMediaType(mt.NativePointer);
var v = mt.QueryInterface<VideoMediaType>();
var x = v.VideoFormat;
}
}
相同的结果。有什么建议吗?
答案 0 :(得分:1)
您应该强制转换为SharpDX MediaType,因为它对应于IMFMediaType,但是无论如何您已经在mt变量中使用了它。 IMFMediaType描述了源提供的视频和音频媒体类型。 VideoMediaType或IMFVideoMediaType不能保证可用。
您应该可以通过使用mt来访问mt中包含的视频媒体类型的不同属性:
CellReference topLeft = new CellReference(0, 0);
CellReference bottomRight = new CellReference(10, 3);
AreaReference aref = new AreaReference(topLeft, bottomRight);
CellReference pos = new CellReference(0, 0);
XSSFSheet pivotSheet = workbook.createSheet("PivotSheet");
XSSFPivotTable pivotTable = pivotSheet.createPivotTable(aref,pos,dataSheet)
pivotOrgWiseSheet.setDisplayGridlines(true);
pivotTable.addRowLabel(0);
pivotTable.addRowLabel(1);
pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 2, "Sum of column3");
pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 3, "Sum of column4");
检查SharpDX接口here(搜索IMFMediaType)。