2017-02-22 86 views
0

我發現了很多類似的帖子,但沒有最近或實際解決這個問題。希望有人能幫助。對不起,如果這是重複的。我不是WPF或xaml專家,並且已經拼湊出各種來源的代碼。通過視頻閃爍WPF圖像

情景: -

  • 亭風格的應用程序不用於生產,只是爲了一個展覽
  • 世界糧食計劃署的應用程序播放視頻上使用媒體播放器網格背景被拉用刷子
  • 的Kinect傳感器確定與狀態改變事件的人的位置來改變基於該人的方向的視頻的源(超出範圍,在範圍內和在看傳感器)
  • 3圖像對照(與PNG圖像與透明度作爲源)在頂部代表當前狀態的視頻。根據國家

一切工作,因爲我期待它給圖像被倒塌或可見,但有一個閃爍(固體白色或黑色背景)影像控制時,圖像的可見性改變時在視頻的頂部。如果我將視頻作爲測試隱藏起來,則不會出現閃爍現象,這表明圖像和視頻分層存在渲染/繪製問題。我從微軟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參數 - Doublebuffering似乎沒有東西可以再擁有現代化的WPF應用程序? - 使用不透明的,而不是知名度 - 設置可視性之前停止視頻(雖然可能沒有實際的延時不要緊?) - 儘管Kinect的以30fps的射擊中,「人的狀態改變」事件僅觸發一次,並且開關代碼只觸發一次,即有標誌設置爲停止重複條目

它不會做這一切的時候,只是大部分時間。

任何幫助,將不勝感激

感謝, 賈羅德

+0

將視頻放入控件的背景看起來有點不合常規!查看是否可以找到一種方法將視頻轉換爲控件,並將其放在按鈕的後面。如果不這樣做,請保持或多或少的方式,但是在之上而不是孩子時可以使用。看看這些是否有助於閃爍。 –

+0

感謝您的回覆。我不記得使用媒體播放器的確切原因,除了我在使用媒體元素時遇到問題,可能是因爲我切換視頻的方式,或者與定位和縮放有關。我讀過的一篇文章提出這種方法,除了閃爍(這是添加圖像的最後一次更改)之外,它對我而言效果很好。將嘗試你的建議。發現圖像剪輯到應用程序背景,我正在使用的一個臨時解決方案是將靜態視頻放入背景中,以便剪輯到該背景。 –

+0

我記得現在爲什麼我沒有使用媒體元素。切換視頻時出現可怕的閃爍。我認爲關於使用mediaplayer的建議是關於性能差異。我也嘗試移動圖像覆蓋圖,以便它們不在背景的同一圖層中,但不幸的是它仍然被裁剪掉。 @AndrewStephens你提到將視頻放入和圖像控制,但我不明白你的意思?這是一個MP4視頻,但圖像源不喜歡這樣嗎? –

回答

0

沒有找到一個真正的答案,但問題是,視頻後面的背景是在空間剪切通過圖像佔去了。我無法找到使渲染更穩定的方法。

我使用的視頻是相對靜態的,即這是一個非常短的循環,所以我拍了一段視頻的靜幀,並將其作爲背景。你仍然可以在視頻和靜止畫面之間看到它的彈奏(如果你知道你在找什麼),但是在我的情況中,這種差異可以忽略不計 - 它也比一段時間出現的純白色塊要好得多。