2016-08-24 25 views
1

私はC#アプリケーションで非常に単純なビデオプレーヤーが必要です。それはファイルからビデオをループするだけです。私はWPFアプリケーションを開発しているので、System.Windows.Controls.MediaElementを使用しようとしました。それは私が必要とするすべての機能を持っていますが、かなり貧弱です。私はフルHDビデオを再生しました。常に遅れていて、スパイクしています。MediaElementをAxWindowsMediaPlayerと同じように動作させるにはどうすればいいですか?

私のアプリの問題ではないことを確認するために、2つのテストアプリケーションを作成しました。 WinFormsボーダーレスの1920x1080ウィンドウの最初はAxWMPLib.AxWindowsMediaPlayerコントロールのみです。そして、同じサイズのボーダーレスウィンドウWPFウィンドウの2番目はSystem.Windows.Controls.MediaElementです。

次に、私は両方のプレイヤーで2つのビデオを実行します。ここではそのスペックです:

1:1920x1080, 12000kb/s, 25 FPS, wmv

2:1920x1080, 5730kb/s, 25 FPS, mp4

AxWindowsMediaPlayerすべてでは正常に見えます。しかし、MediaElementはいくつかのフレームを落として、垂直同期を無視しているように見えます(速いシーンの変更中に、あるフレームの一部を別のフレームに表示することは可能です)。だからこそ、それは完全に不適切で、そうすべきではありませんが、マイクロソフトの公式ドキュメントでは何も見つかりませんでした。WPFではの代わりにMediaElementを使用することが推奨されています。それがよりスムーズに動作するようにすることができますか?またはWinFormsFormAxWindowsMediaPlayerの唯一の解決策はありますか?

答えて

2

It was written over five years ago(スレッド内のJames Daileyのメッセージを参照)、いくつか改善された可能性がありますが、全体的にはまだステートメントが良好であると思います。

WPF環境は、開発者に非常に豊富な "グラフィックスファースト"環境を提供するために構築されています。 MediaElementは、他のさまざまなUIコンポーネントとビデオをシームレスにミキシングできるように設計されています。このソリューションは、ちらつきのない、あなたが探しているビデオを引き出すソリューションを提供します。最高の部分は、C#でこれをすべて行うことができることです。このソリューションの悪い点は、MediaElementが時間の影響を受けやすいメディアコンテンツを表示するように設計されていないことです。言い換えれば、MediaElementはビデオフレームの表示を中止して遅延させることで有名です。などのビデオコーデックを加速使う、などではなくHDコンテンツよりも、SDを使用して、これを最小化する方法、

もあります

残念ながら、あなたが本当にドロップしないようにWPFのMediaElementを伝えることはできませんフレーム。このクラスの問題に使用する用語は「異種クロック」です。この場合、WPFは一定のレート(クロック1)で画面を更新しています。 MediaElement(WMPベース)は、わずかに異なるレート(クロック2)でビデオフレームをクランキングします。基礎をなす技術を考えると、現在のところ、2つのクロックを同期させ、同じ速度でそれらを強制的にティックする方法はありません。表示はWPFクロックに従ってのみ更新されるため、複数のフレームのビデオがClock Tick間でWPFにMediaElementから送信される可能性があります。このため、MediaElementはフレームをドロップするように見えることがあります。これはマルチメディア開発の非常に一般的な問題であり、単純な解決策はありません。

Windows Media Playerは、高品質のビデオエクスペリエンスでメディア再生を可能にするMedia FoundationおよびDirectShow APIを使用します。

関連する問題