Как получить VideoMediaType из MediaType в MediaFoundation с помощью SharpDX

Я пытаюсь захватить видео с веб-камеры с помощью 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;
     }
 }

Тот же результат. Какие-нибудь советы?


person DanielB    schedule 16.11.2018    source источник
comment
Привет, удалось сделать снимок с веб-камеры? У вас есть образец кода?   -  person Nicke Manarin    schedule 15.05.2020
comment
@NickeManarin Нет, но я переключился на UWP API из Windows.Media.Capture, чтобы выполнить захват.   -  person DanielB    schedule 17.05.2020
comment
Спасибо, думаю, я тоже перейду на это, так как у меня возникают проблемы с изображением захвата: stackoverflow.com/questions/61830428/   -  person Nicke Manarin    schedule 17.05.2020


Ответы (1)


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

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

using (var mt = reader.GetNativeMediaType(0, mediaTypeIndex))
{
    UnpackLong(mt.Get(MediaTypeAttributeKeys.FrameSize), out var width, out var height);
}

//Gets two integers from a long.
private void UnpackLong(long value, out int left, out int right)
{
    left = (int)(value >> 32);
    right = (int)(value & 0xffffffffL);
}

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

person VuVirt    schedule 17.11.2018