You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinUI 3 MediaPlayerElement如何捕获视频帧为SoftwareBitmap?

WinUI 3 捕获 MediaPlayerElement 当前视频帧为 SoftwareBitmap

你用RenderTargetBitmap的方法行不通,因为MediaPlayerElement的视频帧是通过硬件加速渲染在独立的合成层里,不属于常规UI元素的可捕获内容,而且如果视频带DRM保护的话这个方法完全失效。

下面是可行的实现方案,利用MediaPlayer自带的截图API:

private async void CaptureButton_Click(object sender, RoutedEventArgs e)
{
    // 确保MediaPlayer已初始化并加载视频
    if (mediaPlayerElement.MediaPlayer == null || mediaPlayerElement.MediaPlayer.Source == null)
        return;

    try
    {
        // 获取当前视频帧的PNG流
        var screenshotStream = await mediaPlayerElement.MediaPlayer.ScreenshotAsync();

        // 解码流为SoftwareBitmap
        var decoder = await BitmapDecoder.CreateAsync(screenshotStream);
        var capturedBitmap = await decoder.GetSoftwareBitmapAsync();

        // 按需转换像素格式(示例转为BGRA8预乘透明度模式)
        if (capturedBitmap.BitmapPixelFormat != BitmapPixelFormat.Bgra8 || 
            capturedBitmap.BitmapAlphaMode != BitmapAlphaMode.Premultiplied)
        {
            capturedBitmap = SoftwareBitmap.Convert(capturedBitmap, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);
        }

        // 此处可对capturedBitmap进行后续处理
    }
    catch (Exception ex)
    {
        // 处理异常:视频未就绪、DRM保护、权限问题等
        System.Diagnostics.Debug.WriteLine($"捕获失败:{ex.Message}");
    }
}

关键说明

  • ScreenshotAsync是MediaPlayer原生API,直接获取当前帧的PNG格式流,避免了硬件加速层的捕获限制
  • 若需要特定像素格式/透明度模式,使用SoftwareBitmap.Convert进行转换即可
  • 受DRM保护的视频会触发异常,需提前做判断或捕获处理
  • 调用前务必确认MediaPlayer已加载视频(Source不为空),且处于播放/暂停状态

内容的提问来源于stack exchange,提问作者Dmitrii Polianskii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 15:40:12