我发现了很多关于这个的类似帖子,但没有一个是最近的或实际上解决了这个问题。希望有人可以提供帮助。对不起,如果这是重复的。我不是WPF或xaml专家,并拼凑了各种来源的代码。
场景: -
一切正常,因为我期待它,但当图像的可见性在视频顶部发生变化时,图像控件上会出现闪烁(纯白色或黑色背景)。如果我将视频隐藏为测试,则没有闪烁,这向我建议了图像和视频分层的渲染/绘图问题。我开始借用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;
我看了很多东西 - 在图像上设置cachemode - 使用现代WPF应用程序,Doublebuffering似乎不再适用了吗? - 使用不透明度而不是可见性 - 在设置可见性之前停止视频(尽管在没有实际延迟计时器的情况下可能并不重要?) - 虽然Kinect以30fps的速度射击,但是人状态改变了#34;事件只被触发一次,切换代码只触发一次,即有标志设置为停止重复输入
在大多数情况下,它并不是一直都这么做。
任何帮助将不胜感激
谢谢, 贾罗德
答案 0 :(得分:0)
没有找到真正的答案,但问题是视频背后的背景是在图像占据的空间中剪裁。我无法找到使渲染更稳定的方法。
我使用的视频是相对静态的,即它是一个非常短的循环,所以我拍摄了视频的静止帧并将其作为背景。你仍然可以看到它在视频和静止之间轻弹(如果你知道你在寻找什么),但在我的情况下差异可以忽略不计 - 它也比一秒钟出现的纯白色块好得多。