MediaCapture:照片在 Windows Phone 上有奇怪的彩色信箱
MediaCapture: Photos have odd color letterboxing on Windows Phone
我有一些代码可以在拍照时为我的 Lumia 1020 获得最高质量的视频编码属性。如下,
IEnumerable<VideoEncodingProperties> pIEeAllRes = cMCeCapture.VideoDeviceController.GetAvailableMediaStreamProperties(MediaStreamType.VideoPreview).Select(x => x as VideoEncodingProperties);
VideoEncodingProperties pVEPBestRes = pIEeAllRes.OrderByDescending(x => x.Width * x.Height).ThenByDescending(x => x.FrameRate.Numerator / (double)x.FrameRate.Denominator).FirstOrDefault();
这 returns 是我可用的仅有的 1280 x 720 分辨率之一。当我拍照时,每边都会出现奇怪的绿线。我附上了照片,知道为什么会发生这种情况以及如何避免这种情况吗?
请原谅我凌乱的脸哈哈!
典型的,只是尝试了一些东西并解决了问题,我将编码道具的类型更改为照片而不是视频预览,
IEnumerable<VideoEncodingProperties> pIEeAllRes = cMCeCapture.VideoDeviceController.GetAvailableMediaStreamProperties(MediaStreamType.Photo).Select(x => x as VideoEncodingProperties);
VideoEncodingProperties pVEPBestRes = pIEeAllRes.OrderByDescending(x => x.Width * x.Height).ThenByDescending(x => x.FrameRate.Numerator / (double)x.FrameRate.Denominator).FirstOrDefault();
和
await cMCeCapture.VideoDeviceController.SetMediaStreamPropertiesAsync(MediaStreamType.Photo,
在 Windows 手机上,您会发现三个独立的 MediaStreamTypes
:VideoPreview
、Photo
和 VideoRecord
。将这些视为来自相机的三个独立流,分别用于取景器、照片和录制视频。这些是单独的流这一事实意味着您可以分别为每个流设置分辨率 (a.k.a.MediaStreamProperties):
- 您可以运行以屏幕分辨率进行预览
- 您可以 20 MP 拍摄照片
- 您可以录制 1080p 的视频
这样你就不会 运行 设备一直处于 20 MP。
现在,即使这些是单独的引脚,也有 一些限制,您只需 运行 合二为一:捕获流(Photo、VideoRecord)需要匹配 VideoPreview 的纵横比,否则你会得到奇怪的伪影。这给你两个选择:
- 有两种独立的拍摄模式:照片和视频。在这些模式之间切换时,请确保在预览中设置与您要使用的捕获宽高比相匹配的分辨率。
- 将纵横比选择器作为顶级决策。这意味着您首先决定是否要 16:9 或 4:3 作为您的捕获分辨率,然后您根据它设置预览,然后您只允许以相同的纵横比捕获照片或视频。这样做的好处是您无需切换 'modes' 即可获得不同类型的捕获。
我有一些代码可以在拍照时为我的 Lumia 1020 获得最高质量的视频编码属性。如下,
IEnumerable<VideoEncodingProperties> pIEeAllRes = cMCeCapture.VideoDeviceController.GetAvailableMediaStreamProperties(MediaStreamType.VideoPreview).Select(x => x as VideoEncodingProperties);
VideoEncodingProperties pVEPBestRes = pIEeAllRes.OrderByDescending(x => x.Width * x.Height).ThenByDescending(x => x.FrameRate.Numerator / (double)x.FrameRate.Denominator).FirstOrDefault();
这 returns 是我可用的仅有的 1280 x 720 分辨率之一。当我拍照时,每边都会出现奇怪的绿线。我附上了照片,知道为什么会发生这种情况以及如何避免这种情况吗?
请原谅我凌乱的脸哈哈!
典型的,只是尝试了一些东西并解决了问题,我将编码道具的类型更改为照片而不是视频预览,
IEnumerable<VideoEncodingProperties> pIEeAllRes = cMCeCapture.VideoDeviceController.GetAvailableMediaStreamProperties(MediaStreamType.Photo).Select(x => x as VideoEncodingProperties);
VideoEncodingProperties pVEPBestRes = pIEeAllRes.OrderByDescending(x => x.Width * x.Height).ThenByDescending(x => x.FrameRate.Numerator / (double)x.FrameRate.Denominator).FirstOrDefault();
和
await cMCeCapture.VideoDeviceController.SetMediaStreamPropertiesAsync(MediaStreamType.Photo,
在 Windows 手机上,您会发现三个独立的 MediaStreamTypes
:VideoPreview
、Photo
和 VideoRecord
。将这些视为来自相机的三个独立流,分别用于取景器、照片和录制视频。这些是单独的流这一事实意味着您可以分别为每个流设置分辨率 (a.k.a.MediaStreamProperties):
- 您可以运行以屏幕分辨率进行预览
- 您可以 20 MP 拍摄照片
- 您可以录制 1080p 的视频
这样你就不会 运行 设备一直处于 20 MP。
现在,即使这些是单独的引脚,也有 一些限制,您只需 运行 合二为一:捕获流(Photo、VideoRecord)需要匹配 VideoPreview 的纵横比,否则你会得到奇怪的伪影。这给你两个选择:
- 有两种独立的拍摄模式:照片和视频。在这些模式之间切换时,请确保在预览中设置与您要使用的捕获宽高比相匹配的分辨率。
- 将纵横比选择器作为顶级决策。这意味着您首先决定是否要 16:9 或 4:3 作为您的捕获分辨率,然后您根据它设置预览,然后您只允许以相同的纵横比捕获照片或视频。这样做的好处是您无需切换 'modes' 即可获得不同类型的捕获。