2

WPFMediaElementを使用して一連のビデオを再生する単純なビデオプレーヤーがあります。ビデオは一緒に静止画像の周りを移動する1つの連続したフィルムを形成します。各ビデオの終わりに、現在再生中のビデオの最後のフレームで動きがフリーズします。ボタンを押すと、次のビデオが再生され、静止画像の周りを動き続けます。これは私がスピーチをするために使用するアプリケーションです。事実上、各ビデオの最後のフレームが次のビデオの最初のフレームと同じである一連のビデオがあります。

WPF MediaElementを使用していて、ユーザーがマウスをクリックしたときにSourceプロパティを変更しています。

私が抱えている問題は、Sourceプロパティを変更すると、次のビデオがロードされるときにMediaElementが透過的になることです。これは、ビデオ間にちらつきがあることを意味します。このちらつきを防ぐ方法はありますか?他にどのような戦略を使用できますか?

ここにいくつかのコードがあります:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        this.x_MediaElement.MouseLeftButtonDown += x_MediaElement_MouseLeftButtonDown;
        this.MouseLeftButtonDown += MainWindow_MouseLeftButtonDown;


        this.WindowStyle = WindowStyle.None;
        this.WindowState = WindowState.Maximized;
    }

    void MainWindow_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        MoveNext();   
    }

    private void MoveNext()
    {
        _sourceIndex++;
        if (_sourceIndex >= _sources.Length)
            _sourceIndex = 0;

        Debug.WriteLine(string.Format("Playing {0}", _sources[_sourceIndex]));

        this.x_MediaElement.Source = new Uri(_sources[_sourceIndex]);
        this.x_MediaElement.Play();

    }

    private int _sourceIndex = -1;

    private string[] _sources = new string[] {
        //SOURCE GO HERE
    };

    void x_MediaElement_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        MoveNext();
        e.Handled = true;
    }
}
4

1 に答える 1

4

私はあなたに正直になります。MediaElementには、指で数えることができるよりも多くのバグがあります。それから、mediaElementは20本のビデオを再生した後に爆発します(MediaEndedイベントがなくなると、クラッシュするか、そのようなものになります)。そしてもちろんパフォーマンス。垂直同期と同期されていません。そのため、ビデオは実際には遅れているように見えるかもしれません。

DirectShowテクノロジ(基本的にWPFのベースですが、ラグを回避するレンダラーを切り替えることができます)を調べることをお勧めします。プロフェッショナルなアプリケーションを開発しないことを考えると、MediaElementは問題ないと思います。

ただし、MediaElementは最も単純なオプションであり、それが機能する場合は、引き続き使用してください。あなたの問題に関しては、私はいくつかの可能な解決策があると思います:

  • 2つのMediaElementを用意し、それらを切り替えます。1つのビデオが終了した場合、2番目のmediaElementで最初のフレームを再生し、最初のmediaElementを非表示にし、その逆の場合は、別のMediaElementで別のビデオを開始します。位置、およびおそらくMediaStartedイベントをポーリングできます。このようにして、ちらつきに気付くことはほとんど不可能になります。
  • ちらつきのない流暢なビデオ再生が必要な場合は、GMFPlayがあります。あなたはそれをチェックすることができます。MediaElementではありませんが。しかし、ちらつきなしで同時にビデオを再生することができます。
  • 最後のフレームのスクリーンショットを撮り(WPFでスクリーンショットを撮ることができます)、MediaElementが密かに読み込まれている間に画像として表示します。
于 2012-09-02T09:55:12.120 に答える