如何在 Windows 8.1 中捕获高分辨率视频并从中捕获照片。我在尝试时遇到了 UI 跳跃效果

Posted

技术标签:

【中文标题】如何在 Windows 8.1 中捕获高分辨率视频并从中捕获照片。我在尝试时遇到了 UI 跳跃效果【英文标题】:How to capture high resolution video and capture photo from it in windows 8.1. I am having a UI jumping effect while tried it 【发布时间】:2014-05-22 13:37:53 【问题描述】:

我的相机捕捉应用程序习惯于使用在使用CaptureElement 的视图中实现的相机拍摄连续照片。当它连续捕捉照片时,UI 来回移动似乎是一种跳跃效果。这就是我面临的问题。

使用的代码如下

var cameras = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
MediaCaptureInitializationSettings settings=new MediaCaptureInitializationSettings  VideoDeviceId = cameras[0].Id, StreamingCaptureMode = StreamingCaptureMode.Video ;
var_mediaCapture = new MediaCapture();
await _mediaCapture.InitializeAsync(settings);
if (null != videoCapture) videoCapture.Source = _mediaCapture;
            await _mediaCapture.StartPreviewAsync();

设置高分辨率

int max = 0;
var resolutions = videoController.GetAvailableMediaStreamProperties(MediaStreamType.Photo);
            for (var i = 0; i < resolutions.Count; i++)
            
                ImageEncodingProperties res = resolutions[i] as ImageEncodingProperties;
                if (null == res) continue;


                if (res.Width * res.Height < max)
                
                    max = (int)(res.Width * res.Height);
                    _imageEncodingProperties = res;
                
            

     await videoController.SetMediaStreamPropertiesAsync(MediaStreamType.Photo, _imageEncodingProperties);

并使用

从视频帧中捕获照片
    using (var photoStream = new InMemoryRandomAccessStream())
                                        
                    await _mediaCapture.CapturePhotoToStreamAsync(_imageEncodingProperties, photoStream);
                    await photoStream.FlushAsync(); 
                

我通过设置不同的视频分辨率来测试捕捉。

var videoController = _mediaCapture.VideoDeviceController;

首先我为 videoController 设置默认 preview resolution [640x480] 并且捕获过程正在发生,没有任何问题。之后,我通过在 Surface 平板电脑中设置 High resolution [1200x800] 来检查它,在这种情况下,视频控件上会出现一个相框,并且它的每一侧都有一些小宽度。感觉就像相机视图中的放大/缩小效果[后退向前跳跃]。

在 Windows 8.1 中为视频媒体元素视频控制器设置高分辨率时,有人遇到过这个问题吗?如果有人能解释它的原因,那就太好了。

谢谢

编辑: 我分析了一下情况,发现了以下几点

有许多可用的分辨率 640 x 360 , 1280x720 , 1280x800 , 640x480 等

我发现在宽高比为 1.777778 的分辨率下根本不会出现这个问题。比率小于 1.777 的所有其他分辨率都有问题。

也就是说,640x360、1280x720分辨率不存在问题,另外两个有跳跃效果。我认为最后两个的比率分别为 1.6 和 1.33。

我还检查了default camera app 并通过设置 1280x800 分辨率拍摄照片,我看到窗口中相机元素的两侧都有黑色边框。

结论:

问题在于纵横比。当我设置高分辨率 [1280x800] 来自可用的相机分辨率 保持表面设备的纵横比 [1366x768],以便 图像正试图融入屏幕,并感受到跳跃效果 用户。所以我设置了维护设备的最高分辨率 纵横比,1280x720,问题解决了。

【问题讨论】:

我也有同样的问题。我试图通过“GetAvailableMediaStreamProperties”获得设备的可用分辨率。但它也提供了不受支持的分辨率... @Arun 是的。然后您必须过滤并设置保持设备纵横比的最高分辨率。 【参考方案1】:

实际上问题在于纵横比。当我设置高 分辨率 [1280x800] 来自可用的相机分辨率,即 不保持表面设备的纵横比 [1366x768],因此 图像正试图适应屏幕并感觉到跳跃效果 由用户。所以我设置了保持 设备纵横比,1280x720,问题解决了。

【讨论】:

以上是关于如何在 Windows 8.1 中捕获高分辨率视频并从中捕获照片。我在尝试时遇到了 UI 跳跃效果的主要内容,如果未能解决你的问题,请参考以下文章

Windows Phone 8.1 Media Foundation H264 最大分辨率

在 Windows Phone 8.1 XAML 中获取设备屏幕分辨率

在 Windows 8.1 平板电脑上的 Web 应用程序中捕获图像

如何使用 opencv 和多线程 (logitech c920) 在 python 中捕获视频

Windows 8.1 中高分辨率屏幕上的 Eclipse 界面图标非常小

并非总是可以在“干净”的 Windows 8.1 上捕获 WoW64 上的 SEH