【发布时间】: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)需要更多的资源,而不是视频只是在它们后面。