视频闪烁上的WPF图像

时间:2017-02-22 13:23:13

标签: wpf rendering kinect

我发现了很多关于这个的类似帖子,但没有一个是最近的或实际上解决了这个问题。希望有人可以提供帮助。对不起,如果这是重复的。我不是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;

我看了很多东西   - 在图像上设置cachemode   - 使用现代WPF应用程序,Doublebuffering似乎不再适用了吗?   - 使用不透明度而不是可见性   - 在设置可见性之前停止视频(尽管在没有实际延迟计时器的情况下可能并不重要?)   - 虽然Kinect以30fps的速度射击,但是人状态改变了#34;事件只被触发一次,切换代码只触发一次,即有标志设置为停止重复输入

在大多数情况下,它并不是一直都这么做。

任何帮助将不胜感激

谢谢, 贾罗德

1 个答案:

答案 0 :(得分:0)

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

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