我正在尝试在通过 MediaElement 显示视频的 WinRT 应用程序中实现屏幕截图功能。我有以下代码,它保存了一个 MediaElement 大小的屏幕截图,但图像是空的(完全黑色)。尝试使用各种类型的媒体文件。如果我在 Surface RT 上执行 Win Key + Vol Down,则屏幕截图包括媒体帧内容,但如果我使用以下代码,则周围一片漆黑:(
private async Task SaveCurrentFrame()
{
RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
await renderTargetBitmap.RenderAsync(Player);
var pixelBuffer = await renderTargetBitmap.GetPixelsAsync();
MultimediaItem currentItem = (MultimediaItem)this.DefaultViewModel["Group"];
StorageFolder currentFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
var saveFile = await currentFolder.CreateFileAsync(currentItem.UniqueId + ".png", CreationCollisionOption.ReplaceExisting);
if (saveFile == null)
return;
// Encode the image to the selected file on disk
using (var fileStream = await saveFile.OpenAsync(FileAccessMode.ReadWrite))
{
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, fileStream);
encoder.SetPixelData(
BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Ignore,
(uint)renderTargetBitmap.PixelWidth,
(uint)renderTargetBitmap.PixelHeight,
DisplayInformation.GetForCurrentView().LogicalDpi,
DisplayInformation.GetForCurrentView().LogicalDpi,
pixelBuffer.ToArray());
await encoder.FlushAsync();
}
}
这里的 MultimediaItem 是我的 View Model 类,其中有一个 UniqueId 属性,它是一个字符串。
“播放器”是媒体元素的名称。
代码有什么问题,或者这种方法有问题,我必须用 C++ 进入战壕吗?
PS 我只对 WinRT API 感兴趣。
更新 1看起来 RenderTargetBitmap 不支持这一点,MSDN 文档澄清了它http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.media.imaging.rendertargetbitmap。我将不胜感激有关如何使用 DirectX C++ 执行此操作的任何指示。这对我来说是一项重大任务,所以我会以一种或另一种方式破解这个问题并报告解决方案。