WPF图像通过视频闪烁

问题描述 投票:0回答:1

我发现了很多关于这个的类似帖子,但没有一个是最近的或实际上解决了这个问题。希望有人可以提供帮助。对不起,如果这是重复的。我不是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发射,但“人状态更改”事件仅触发一次,切换代码仅触发一次,即设置标志以停止重复输入

它并不是一直都是这样,只是大部分时间。

任何帮助,将不胜感激

谢谢,Jarrod

wpf rendering kinect
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.