C#のwinformsでVlc.DotNet.Formsを試す

コンピュータ
Nugetで「Vlc.DotNet.Forms」を見つけました。こちらはwinformsからvlcを実行するラッパーライブラリとのことですので試してみたいと思います。

プロジェクトの作成

mkdir プロジェクト名
cd プロジェクト名
dotnet new winfomrs -f net6.0
dotnet add package Vlc.DotNet.Forms --version 3.1.0
dotnet add package VideoLAN.LibVLC.Windows --version 3.0.18

サンプルソース

using System.Reflection;
using Vlc.DotNet.Forms;

namespace VlcCample;

public partial class Form1 : Form
{
    VlcControl _vlc = new()
    {
        Dock = DockStyle.Fill,
        AllowDrop = true,
    };
    FlowLayoutPanel _bottomPanel = new()
    {
        Dock = DockStyle.Bottom,
    };
    Button _pasueButton = new()
    {
        AutoSize = true,
        Text = "一時停止",
        Enabled = false,
    };
    Button _playButton = new()
    {
        AutoSize = true,
        Text = "停止",
        Enabled = false,
    };
    public Form1()
    {
        InitializeComponent();

        //var dirName = @"C:\Users\karet\scoop\apps\vlc\current";
        var dirName = @"F:\csharp\VlcCample\bin\Debug\net6.0-windows\libvlc\win-x64";
        var libDir = new DirectoryInfo(dirName);

        _vlc.BeginInit();
        _vlc.VlcLibDirectory = libDir;
        _vlc.EndInit();

        _bottomPanel.Controls.AddRange(new Control[]{_playButton, _pasueButton,});
        Controls.AddRange(new Control[]{_vlc, _bottomPanel});

        string? path = null;

        _vlc.DragEnter += (o, e) => {e.Effect = DragDropEffects.Copy; };
        _vlc.DragDrop += (o, e) =>
        {
            if (null == e.Data) return;
            var obj = e.Data.GetData(DataFormats.FileDrop, false);
            if (null == obj) return;
            path = ((string[])obj)[0];
            if (!File.Exists(path)) return;
            
            _pasueButton.Enabled = true;
            _playButton.Enabled = true;
            _vlc.Play(new FileInfo(path));
        };
        _pasueButton.Click += (o, e) =>
        {
            if (_vlc.IsPlaying)
            {
                _vlc.Pause();
                _pasueButton.Text = "再開";
            }
            else
            {
                _vlc.Play();
                _pasueButton.Text = "一時停止";
            }
        };
        _playButton.Click += (o, e) =>
        {
            if (_vlc.IsPlaying)
            {
                _vlc.Stop();
                _playButton.Text = "再生";
            }
            else
            {
                _vlc.Play();
                _playButton.Text = "停止";
            }
        };
    }


}

説明

libvlcを参照する必要があり、サンプルソース内ではdirNameで直接指定しています。
はじめscoopでインストールしたvlcのディレクトリを指定したところ動作することが確認出来ました。
その後、libvlcはVideoLAN.LibVLC.Windowsパッケージを追加するとbinフォルダ下に作成されることが確認できました。
実行環境によってwin-x64とwin-x86のいずれかを使うことになりますので、環境に合わせてパスを生成してあげるとよさそうです。
参考にしたサイトではAssembly.GetEntryAssembly()からディレクトリを取得し、IntPtrのサイズが4の場合「win-x86」環境、それ以外は「win-x64」と判定してました。
Vlc.DotNet/src/Samples at develop · ZeBobo5/Vlc.DotNet
.NET control that hosts the audio/video capabilities of the VLC libraries - ZeBobo5/Vlc.DotNet

実行

実行するとフォームが表示されますので、そちらに再生したい動画をドラッグアンドドロップすると動画が再生されます。

とりあえず「再生」「一時停止」ボタンは用意してみましたが、文字の表示が矛盾することがあります。

コメント