【问题标题】:WPF image over video flicker视频闪烁的WPF图像
【发布时间】:2017-02-22 13:23:13
【问题描述】:

我发现了很多关于此的类似帖子,但没有一个是最近发布的或实际上解决了这个问题。希望有人可以提供帮助。对不起,如果这是重复的。我不是 WPF 或 xaml 专家,我将各种来源的代码拼凑在一起。

场景:-

  • Kiosk 风格的应用程序不用于生产,仅用于展览
  • WPF 应用使用通过画笔绘制的媒体播放器在网格上播放视频作为背景
  • Kinect 传感器通过状态更改事件确定人的位置,从而根据人的方向(超出范围、范围内和注视传感器)更改视频源
  • 3 图像控件(以具有透明度的 PNG 图像为源)位于视频顶部,代表人员当前状态。图片根据状态折叠或可见

一切都按我的预期工作,但是当图像的可见性在视频顶部发生变化时,图像控件上会出现闪烁(纯白色或黑色背景)。如果我隐藏视频作为测试,则没有闪烁,这表明图像和视频的分层存在渲染/绘图问题。我首先从 Microsoft Kinect V2 示例中借用,然后从那里构建,但我认为 Kinect 本身不会导致问题。我一直在测试的所有 PC 都表现出这种行为,并且都是最新的强大机器,可以毫无问题地运行更复杂的应用程序。

基本视频设置代码(因为我在某处读到过,所以我自己没有想到)

MediaPlayer mp = new MediaPlayer();
mp.ScrubbingEnabled = true;
mp.MediaEnded += MediaElement_MediaEnded;
mp.MediaOpened += MediaElement_MediaOpened;
VideoDrawing vd = new VideoDrawing();
vd.Player = mp;
vd.Rect = new Rect(0, 0, 1920, 1080);
DrawingBrush db = new DrawingBrush(vd);
grid.Background = db;

XAML

<Window x:Class="IgnoreYou.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Kinect 2 Face HD (.NET)"
    Height="735" Width="770" Loaded="Window_Loaded" Closed="Window_Closing"
    WindowState="Maximized" WindowStyle="None" ResizeMode="NoResize"  
WindowStartupLocation="CenterScreen"
    Topmost="True"
    MouseMove="Window_MouseMove">

<Grid Name="grid">
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Bottom">
        <WrapPanel Margin="0,0,0,30">
            <Image Name="noPerson" Source="images/noone.png" Stretch="None" >
            </Image>
            <Image Name="seenPerson" Source="images/can_you_see.png" Stretch="None" Visibility="Collapsed" >
            </Image>
            <Image Name="ignorePerson" Source="images/ignored.png" Stretch="None" Visibility="Collapsed" >
            </Image>
        </WrapPanel>
    </StackPanel>
</Grid>

切换图像示例代码(有 3 种变体):-

noPerson.Visibility = Visibility.Collapsed;
ignorePerson.Visibility = Visibility.Visible;
seenPerson.Visibility = Visibility.Collapsed;

我看过各种各样的东西 - 在图像上设置缓存模式 - 现代 WPF 应用程序似乎不再需要双缓冲? - 使用不透明度而不是可见性 - 在设置可见性之前停止视频(尽管没有实际的延迟计时器可能无关紧要?) - 虽然 Kinect 以 30fps 的速度触发,但“人物状态更改”事件仅触发一次,切换代码仅触发一次,即设置了停止重复条目的标志

它不会一直这样做,只是大部分时间。

任何帮助将不胜感激

谢谢, 贾罗德

【问题讨论】:

  • 将视频放到控件的背景中似乎有点不合常规!看看您是否可以找到将视频放入 控件的方法,并将其放在 按钮后面。如果做不到这一点,请或多或少地保持现状,但将 放在 之上,而不是作为一个孩子。看看这些是否有助于闪烁。
  • 感谢您的回复。我不记得使用媒体播放器的确切原因,除了我在使用媒体元素时遇到问题,可能是因为我切换视频的方式或与定位和缩放有关。我读过的一篇文章建议了这种方法,它对我来说效果很好,除了闪烁(这是添加图像的最后一秒更改)。会尝试你的建议。发现图像正在剪辑到应用程序背景,我正在使用的临时解决方案是将视频的静止图像放在背景中,以便剪辑到那个。
  • 我现在记得为什么我没有使用媒体元素。切换视频时有可怕的闪烁。我读到的关于使用媒体播放器的建议是关于性能差异的。我还尝试移动图像叠加层,使它们与背景不在同一层,但不幸的是它仍然被剪裁了。 @AndrewStephens 您提到将 Video 放入和 Image 控件中,但我不明白您的意思?这是一个 mp4 视频,但图片来源不喜欢吗?
  • 我可能对图像有点具体,抱歉。我真正想说的是,您应该尝试将视频嵌入到它自己的控件中,按钮 StackPanel 之后。这是为了验证闪烁可能是由于视频被用作网格背景的理论。也许重绘这个自定义背景和孩子(StackPanel、Buttons)需要更多的资源,而不是视频只是在它们后面。

标签: wpf rendering kinect


【解决方案1】:

没有找到真正的答案,但问题是视频背后的背景在图像占据的空间中被剪掉了。我找不到使渲染更稳定的方法。

我使用的视频是相对静态的,即它是一个非常短的循环,所以我拍摄了视频的静止帧并将其作为背景。你仍然可以看到它在视频和静止图像之间滑动(如果你知道你在寻找什么),但在我的情况下差异可以忽略不计 - 它也比出现一瞬间的纯白色块要好得多.

【讨论】:

  • 谢谢!这个问题已经困扰了我好几年了,我从来没有找到一个关于如何解决它或发生了什么的像样的答案——我希望有一个更好的解决方案(例如老派双缓冲例如,但我认为这不是 WPF 渲染的工作方式)。尽管如此,我会尝试一下你的建议,因为我有一个类似的场景 - 短视频重复循环。我会拍一张静止的照片并将其作为背景。谢谢一百万!
  • 很高兴我能在 2 年后帮助某人。我有点惊讶,在这个现代计算时代,这样的事情会成为一个问题。我与它斗争了一段时间,但最终解决方案经受住了考验。无论如何只需要让它运行几个星期,所以c'est la vie。
猜你喜欢
  • 2018-11-30
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
  • 2020-04-12
  • 2010-10-29
相关资源
最近更新 更多