2017-02-22 9 views
0

私はこれに関する多くの類似した投稿を見つけましたが、最近の問題ではなく、実際に問題に対処していません。誰かが助けてくれると願っています。これが重複していると申し訳ありません。私はWPFまたはxamlエキスパートではなく、さまざまなソースからコードをまとめました。WPFイメージオーバービデオフリッカー

シナリオ: - ない生産のため

  • キオスクスタイルアプリ、ちょうど展示会のための
  • メディアプレーヤを使用して、グリッド上の背景としてビデオを再生
  • WFPアプリは、ブラシ
  • の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アプリケーションではダブルバッファリングが問題にはなりません。 - 可視性の代わりに不透明度を使用する - 可視性が設定される前にビデオを停止する(実際の遅延タイマーがない場合はおそらく問題ありません) - Kinectは30fpsで起動していますが、一度起動すると、切り替えコードは一度しか起動しません。つまり、繰り返しエントリを停止するようにフラグが設定されています。

ほとんどの場合、ほとんどの時間はそうしません。

すべてのヘルプは

おかげで、 ジャロッドをいただければ幸いです

+0

ビデオをコントロールの背景に置くのはちょっと変わったようです。その代わりにビデオをコントロールに入れてボタンのの後ろに置きます。それができない場合は、物事を多かれ少なかれ保ちますが、子どもではなくの上にがあります。これらのいずれかがちらつきに役立つかどうかを確認してください。 –

+0

返事をありがとう。メディアの要素を使用したときに問題が発生していたことを除いて、メディアプレーヤーを使用する正確な理由を覚えていない可能性があります。ビデオを入れ替えたり、位置を合わせたりスケーリングしたりするためです。私が読んだ記事はその方法を示唆していて、ちらつき(画像を追加する最後の2回目の変更)を除いて、私にとってはうまくいきました。あなたの提案をお試しになります。画像がアプリの背景にクリッピングされていることがわかりました。私が使用している一時的な解決策は、動画の静止画をバックグラウンドに入れてクリップすることです。 –

+0

なぜ私はメディア要素を使わなかったのか覚えています。動画を切り替えるとちらつきがひどくなります。メディアプレイヤーの使用に関する私が読んだ提案は、パフォーマンスの違いに関するものだと思います。また、画像オーバーレイを移動して、背景と同じレイヤーにはいないようにしましたが、残念ながらまだクリップされていました。 @ AndrewStephenはあなたがビデオをImageコントロールに入れていると言っていましたが、私はあなたが何を意味しているのか理解できませんでしたか?それはmp4ビデオですが、Imageソースはそれを好まなかったのですか? –

答えて

0

は本当の答えを見つけることができませんでしたが、問題は、イメージが取り上げたことをビデオの背景が宇宙に通じクリッピングされたということでした。レンダリングをより安定させる方法を見つけることができませんでした。

私が使用していたビデオは比較的静的であったそれは非常に短いループだったので、私はビデオの静止フレームを取って、その背景を作った。あなたはそれがビデオとまだその時点で(あなたが探していたことを知っていれば)まだ間違っているのを見ることができますが、その違いは私の場合は無視できました。 。