如何使用SharpDX从MediaFoundation中的MediaType检索VideoMediaType

时间:2018-11-16 16:44:55

标签: c# ms-media-foundation sharpdx

我正在尝试使用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;
     }
 }

相同的结果。有什么建议吗?

1 个答案:

答案 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)。