Edited at

Vlc.DotNet.Wpfつかいかたメモ

最近ちょっと調査してたのでメモ

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()などで再生コントロール。SppedRaio()で再生速度をコントロールしたり。


映像・音声情報など

フォーマットやトラック内容など

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