Как извлечь VideoMediaType из MediaType в MediaFoundation с SharpDX - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь захватить видео с веб-камеры, используя SharpDX.MediaFoundation (4.2.0).Я могу отобразить тип носителя по умолчанию, но я хочу иметь возможность выбирать между различными доступными форматами устройства.

Я могу перечислять источники устройства, но не могу получить информацию отипы мультимедиа.

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 голосов
/ 17 ноября 2018

Вместо этого вы должны привести к SharpDX MediaType, так как он соответствует IMFMediaType , но в любом случае он уже есть в переменной mt. Это IMFMediaType, который описывает типы видео и аудио, предоставляемые источниками. VideoMediaType или IMFVideoMediaType не гарантированно будут доступны.

Вы должны иметь возможность доступа к различным свойствам типа мультимедиа, содержащегося в mt, используя его следующим образом:

mt.Get(MediaTypeAttributeKeys.FrameSize), out VideoWidth, out VideoHeight);

Проверьте интерфейсы SharpDX здесь (поиск IMFMediaType).

...