1. 程式人生 > 其它 >win10 uwp 相機的解析度設定方法

win10 uwp 相機的解析度設定方法

技術標籤:UWP# UWP 入門c#C#dotnetUWP

本文來告訴大家如何在 UWP 中修改相機的解析度設定以及如何使用相機的功能

在 UWP 中可以使用 WinRT 提供的 Win10 特有的 API 用來捕獲攝像機的內容,支援很多格式的硬體解碼,效能會比 Win32 好特別多。我使用了 UWP 版本的和 WPF 基於 DirectShow 的版本進行效能對比

發現在使用 WPF 的版本,在我的裝置上,大概 CPU 能到百分之十,而完全沒有用到 Video Decode 的 GPU 加速。而在使用 UWP 時,可以發現 CPU 佔用小於百分之一,同時可以使用上 Video Decode 的 GPU 加速功能。當然了能否使用 Video Decode 也和相機編碼格式相關,我的這個相機只支援 MJPEG 和 YUV 兩個格式。本身 YUV 是不需要解碼的,只是清晰度比較渣。上面測試使用的是 MJPEG 格式

在開始之前,咱需要了解在 UWP 中開啟相機需要哪些步驟?第一步是新增許可權,第二步是加上播放器,第三步是加上相機捕獲

新增許可權的方法是 Package.appxmanifest 裡面新增照相機和手機許可權,也可以編輯此檔案,新增下面程式碼

  <Capabilities>
      <Capability Name="internetClient" />
      <DeviceCapability Name="webcam"/>
      <DeviceCapability Name="Microphone"/>
  </Capabilities>

接著新增一個相機播放器了,使用 CaptureElement 來作為播放器,在 MainPage 新增下面程式碼

      <CaptureElement Name="PreviewControl" Stretch="Uniform"/>

接著在 Loaded 事件裡面新增捕獲相機的程式碼

        private async void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {

                _mediaCapture = new MediaCapture();
                await _mediaCapture.InitializeAsync();
            }
            catch (UnauthorizedAccessException)
            {
            	// 沒有申請許可權,或者使用者點選不允許訪問相機
                // This will be thrown if the user denied access to the camera in privacy settings
                return;
            }

            try
            {
                PreviewControl.Source = _mediaCapture;
                await _mediaCapture.StartPreviewAsync();
            }
            catch (System.IO.FileLoadException)
            {

            }

        }

        MediaCapture _mediaCapture;

此時可以看到的相機使用的編碼以及解析度完全取決於相機,但是咱可以自己來進行設定。相機會告訴系統他支援的所有格式和解析度和重新整理率等,咱需要將這些列舉出來,讓使用者選擇

先在 MainPage 新增一個 ComboBox 用於給使用者選擇

<ComboBox x:Name="ComboBox" Margin="10,10,10,10" HorizontalAlignment="Right" VerticalAlignment="Top" SelectionChanged="ComboBox_OnSelectionChanged"></ComboBox>

在剛才的 MainPage_Loaded 方法裡面獲取當前相機支援的有哪些格式,將這些作為內容放入到 ComboBox 選項

        private async void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {
                _mediaCapture = new MediaCapture();
                await _mediaCapture.InitializeAsync();

                try
                {
                    var comboBox = ComboBox;

                    var availableMediaStreamProperties = _mediaCapture.VideoDeviceController.GetAvailableMediaStreamProperties(MediaStreamType.VideoRecord).ToList().OfType<VideoEncodingProperties>()
                        //.OrderByDescending(x => x.Height * x.Width).ThenByDescending(x => x.FrameRate);
                        .ToList() ;

                    // Populate the combo box with the entries
                    foreach (VideoEncodingProperties property in availableMediaStreamProperties)
                    {
                        ComboBoxItem comboBoxItem = new ComboBoxItem();
                        comboBoxItem.Content = property.Width + "x" + property.Height + " " + property.FrameRate + "FPS " + property.Subtype;
                        comboBoxItem.Tag = property;
                        comboBox.Items.Add(comboBoxItem);
                    }
                }
                catch (Exception)
                {

                }
            }
            catch (UnauthorizedAccessException)
            {
                // This will be thrown if the user denied access to the camera in privacy settings
                return;
            }

            try
            {
                PreviewControl.Source = _mediaCapture;
                await _mediaCapture.StartPreviewAsync();
            }
            catch (System.IO.FileLoadException)
            {

            }

        }

在使用者選擇格式的時候,將會觸發 ComboBox_OnSelectionChanged 方法,在這個方法裡面執行設定相機格式,包括解析度的方法

        private async void ComboBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            try
            {
                var selectedItem = (sender as ComboBox).SelectedItem as ComboBoxItem;
                var encodingProperties = (selectedItem.Tag as VideoEncodingProperties);
                await _mediaCapture.VideoDeviceController.SetMediaStreamPropertiesAsync(MediaStreamType.VideoRecord, encodingProperties);
            }
            catch (Exception)
            {
              
            }
        }

在 UWP 中不能直接設定相機的解析度,而是需要先通過 MediaCapture.VideoDeviceController.GetAvailableMediaStreamProperties 方法獲取相機能支援的哪些格式,從裡面選出想要的解析度等設定,通過 MediaCapture.VideoDeviceController.SetMediaStreamPropertiesAsync 設定相機的格式

本文程式碼放在 github 歡迎小夥伴訪問

我搭建了自己的部落格 https://blog.lindexi.com/ 歡迎大家訪問,裡面有很多新的部落格。只有在我看到部落格寫成熟之後才會放在csdn或部落格園,但是一旦釋出了就不再更新

如果在部落格看到有任何不懂的,歡迎交流,我搭建了 dotnet 職業技術學院 歡迎大家加入

如有不方便在部落格評論的問題,可以加我 QQ 2844808902 交流

知識共享許可協議
本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發布,但務必保留文章署名林德熙(包含連結:http://blog.csdn.net/lindexi_gd ),不得用於商業目的,基於本文修改後的作品務必以相同的許可釋出。如有任何疑問,請與我聯絡。