最近ちょっと調査してたのでメモ
Vlc.DotNet.Wpfは.netに付属するMediaElementに次いで簡単に映像を扱えるような気がします。
ただMediaElementはWindowsMediaPlayerと同じコアを使っているようで、WMPが対応していない(WMPが認識出来るコーデックがインストールされていない)場合はMediaElementでの再生も出来ないので、なんも考えずに色々再生させたいなって場合はこっちのほうが便利かもしれません。
インストール
Vlc.DotNet.Wpf自体はNuGetで入手できます。
依存関係のある以下のものも必要となります。
Vlc.DotNet.Core
Vlc.DotNet.Core.Interops
上記はラッパーライブラリなのでVLCライブラリ本体も必要です。
VideoLAN.LibVLC.Windows
この4つをNugetで探して入れます。
入れたら使えるようになってます。
使い方
Vlc.DotNet.Wpfをはじめとしたエクステンション群を開発しているZeBobo5氏のGithubにエクステンションのソースとサンプルコードがあります。
https://github.com/ZeBobo5/Vlc.DotNet
https://github.com/ZeBobo5/Vlc.DotNet/tree/develop/src/Samples
最低限のコードに抑えており分かりやすいです(逆にこういうときどうすんの?みたいなのがないのでフィーリングになりがち)。
またWpfだけじゃなくWinFormsもあるのでそっちを使う方も役に立つかも。
ライブラリパス設定
VideoLAN.LibVLC.Windowsを入れるとビルド時に出力フォルダへVLCのDLLをまるっとコピーしてくれます。
で、CraterPlayerの起動時にライブラリのパスをそこに設定して起動するようなカタチ。上記の作者のサンプルはそれを前提に書いてます。
https://github.com/ZeBobo5/Vlc.DotNet/blob/develop/src/Samples/Samples.Wpf.Advanced/MainWindow.xaml.cs
スレッドについて
ボタンなどのUI(メイン)スレッドとライブラリが動作しているスレッドが違うので、ライブラリからのイベントでUI操作をする場合はDispatcher.BeginInvoke()なりでUIスレッドに戻して書く必要があります。
VlcControl.SourceProvider.MediaPlayerの操作も少なくともawait Task.Run()などで非同期にしておかないとすぐにデッドロックします。
基本のコントロール
基本的な操作はVlcControl.SourceProvider.MediaPlayerから操作出来ます。SetMedia()で再生したいファイルを選択、Play()やPause()などで再生コントロール。SpeedRatio()で再生速度をコントロールしたり。
映像・音声情報など
フォーマットやトラック内容など
VlcControl.SourceProvider.MediaPlayer.Audio
VlcControl.SourceProvider.MediaPlayer.Video
VlcControl.SourceProvider.MediaPlayer.Track
などに色々入っているので適宜参照
早送り、早戻し、位置指定
VlcControl.SourceProvider.MediaPlayer.Timeにmsec単位で入っているので、適宜+したり-したり直で入れたり。
現在再生位置、ファイルの再生時間長
msecで入っているので、適宜変換します。
v3.0.0現在、msecの更新が遅く1秒単位での表示が無難だと思います💦
private void UpdateDurationTime()
{
Dispatcher.BeginInvoke(new Action(() =>
{
var media = VlcControl.SourceProvider.MediaPlayer; // 操作したいコントロールね
var duration = TimeSpan.FromMilliseconds(media.Length);
var time = TimeSpan.FromMilliseconds(media.Time);
// ここでtime/durationを表示するなど
}));
}
スナップショット
VlcControl.SourceProvider.MediaPlayer.TakeSnapshot()で画像を保存出来ます。
ただ、指定したパスにファイル保存するインターフェースしかないので、加工を前提とする場合
VlcControl.SourceProvider.VideoSourceを使うと良いと思います。ImageSourceオブジェクトなので、lockしてあげればキレイに画像取得出来ます。
シークバーなど
syu5s氏のユーザーコントロールが簡潔で参考になるかと思います。
http://blog.firefly-vj.net/2015/12/11/uwpmovieplayback_and_seek.html