在HoloLens上设置MediaStreamProperties不起作用

时间:2019-11-18 15:28:08

标签: c# uwp hololens

我正在为UloLens开发UWP应用,以从设备相机读取单帧。我想使用最低分辨率的相机模式。

我查看了以下链接和示例,并试图创建一个最小的工作应用程序:

这是MainPage.xaml.cs中的代码段:

  public async Task<int> Start()
        {
            // Find the sources 
            var allGroups = await MediaFrameSourceGroup.FindAllAsync();
            var sourceGroups = allGroups.Select(g => new
            {
                Group = g,
                SourceInfo = g.SourceInfos.FirstOrDefault(i => i.SourceKind == MediaFrameSourceKind.Color)
            }).Where(g => g.SourceInfo != null).ToList();

            if (sourceGroups.Count == 0)
            {
                // No camera sources found
                return 0;
            }
            var selectedSource = sourceGroups.FirstOrDefault();

            // Initialize MediaCapture
            _mediaCapture = new MediaCapture();
            var settings = new MediaCaptureInitializationSettings()
            {
                SourceGroup = selectedSource.Group,
                SharingMode = MediaCaptureSharingMode.ExclusiveControl,
                StreamingCaptureMode = StreamingCaptureMode.Video,
                MemoryPreference = MediaCaptureMemoryPreference.Cpu
            };
            await _mediaCapture.InitializeAsync(settings);


            // Query all properties of the device 
            IEnumerable<StreamResolution> allVideoProperties = _mediaCapture.VideoDeviceController.GetAvailableMediaStreamProperties(MediaStreamType.VideoRecord).Select(x => new StreamResolution(x));

            // Order them by resolution then frame rate
            allVideoProperties = allVideoProperties.OrderBy(x => x.Height * x.Width).ThenBy(x => x.FrameRate);

            await _mediaCapture.VideoDeviceController.SetMediaStreamPropertiesAsync(MediaStreamType.VideoRecord, allVideoProperties.ElementAt(0).EncodingProperties);

            // Create the frame reader
            MediaFrameSource frameSource = _mediaCapture.FrameSources[selectedSource.SourceInfo.Id];

            _reader = await _mediaCapture.CreateFrameReaderAsync(frameSource, MediaEncodingSubtypes.Bgra8);
            _reader.FrameArrived += ColorFrameReader_FrameArrivedAsync;
            await _reader.StartAsync();

            return 1;
        }


 private async void ColorFrameReader_FrameArrivedAsync(MediaFrameReader sender, MediaFrameArrivedEventArgs args)
        {

            var frame = sender.TryAcquireLatestFrame();
            if (frame != null)
            {
                var inputBitmap = frame.VideoMediaFrame?.SoftwareBitmap;         
            }
        }

在我的本地计算机(具有Bootcamp分区的MacBookPro)上,此代码可使用网络摄像头工作。它检测三种支持的视频模式。我可以通过在以下位置将索引从0更改为1或2来更改FrameArrivedAsync中位图图像的分辨率:

_mediaCapture.VideoDeviceController.SetMediaStreamPropertiesAsync(MediaStreamType.VideoRecord, allVideoProperties.ElementAt(0).EncodingProperties);

在HoloLens上,此代码不起作用。它可以检测不同的模式,如此处(https://docs.microsoft.com/en-us/windows/mixed-reality/locatable-camera)所述。但是设置MediaStreamProperties不会更改与接收到的位图图像有关的任何内容。位图始终为1280x720。

1 个答案:

答案 0 :(得分:0)

以防万一,我们想分享我们如何设置捕获配置文件,您可以参考以下代码并添加注释以修改您的项目以进行测试。如有疑问,请随时添加评论。

        private async void SetupAndStartMediaCapture()
        {
            string deviceId = string.Empty;
            _mediaCapture = new MediaCapture();

            DeviceInformationCollection devices = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);

            foreach (var device in devices)
            {
                if(MediaCapture.IsVideoProfileSupported(device.Id))
                {
                    deviceId = device.Id; 
                    break; // The video device for which supported video profile support is queried.
                }
            }

            MediaCaptureInitializationSettings mediaCapSettings = new MediaCaptureInitializationSettings
            {
                VideoDeviceId = deviceId
            };

            IReadOnlyList<MediaCaptureVideoProfile> profiles = MediaCapture.FindAllVideoProfiles(deviceId); 

            var profileMatch = (
                from profile in profiles
                from desc in profile.SupportedRecordMediaDescription
                where desc.Width == 896 && desc.Height == 504 && desc.FrameRate == 24     // HL1
                select new { profile, desc }
).FirstOrDefault();// Select the Profile with the required resolution from all available profiles.

            if (profileMatch != null)
            {
                mediaCapSettings.VideoProfile = profileMatch.profile;
                mediaCapSettings.RecordMediaDescription = profileMatch.desc;
            }

            await _mediaCapture.InitializeAsync(mediaCapSettings); //Initializes the MediaCapture object.
        }