2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🎥 第4回:【動画再生編】LibVLCSharpで動画プレイヤーをC#に組み込む

Posted at

はじめに:C#で動画を再生するにはどうしたらいい?

友人からの要望「区間で動画を分割したい」を実現するには、まず 動画を再生できる環境 が必要でした。
再生しないと、どこからどこまで分割したいかが分かりません。

C#で動画再生といえば、色々な方法がありますが、
私は生成AI(Copilot)にこう尋ねました:

💬「C#のWinFormsで、複数フォーマット対応の動画再生ビューを作りたい」
Copilot:「LibVLCSharp.WinFormsを使えば、VLCと同じ高機能な再生ができます」


LibVLCSharpとは?

LibVLCSharpは、VLCメディアプレイヤーの再生機能をC#に組み込むためのラッパーライブラリです。
そのままでは重くなりがちな動画プレイヤーも、このライブラリを使えば 非常に軽快かつ高性能な再生ビューを導入できます。

対応フォーマットはVLC準拠なので、.mp4/.mov/.mkv/.aviなど一通り安心。
生成AIに聞けば、インストールや再生方法まで一式コードで教えてくれます。


インストール方法(NuGet)

Visual StudioのNuGetから、以下のパッケージをインストール:

LibVLCSharp.WinForms

インストールすると、次のDLLが bin\Release フォルダに出力されます:

  • LibVLCSharp.dll
  • LibVLCSharp.WinForms.dll

これらは実行に必要であり、最終的な配布ファイルにも含めます。


DLL以外に必要な依存ファイル

Copilotに「LibVLCを使うには何を一緒に配布する必要があるか?」と聞いた結果、以下の構成が必要だと分かりました:

libvlc/
├─ libvlc.dll
├─ libvlccore.dll
└─ plugins/(audio_output, video_output など)

VLC公式サイトから ZIP版をダウンロードし、必要なDLLと plugins フォルダを抽出。
filebunkatsu.exe と一緒に libvlc/ フォルダとして配置すれば、他の環境でも再生可能になります。


フォーム上に動画再生ビューを配置する

Designer.cs 上で、以下のように記述:

videoView = new LibVLCSharp.WinForms.VideoView();
videoView.Location = new Point(20, 70);
videoView.Size = new Size(640, 360);
tabTool.Controls.Add(videoView);

そして、Form1.cs 側でLibVLCを初期化し、MediaPlayerを設定します:

Core.Initialize();
_libVLC = new LibVLC();
_mediaPlayer = new MediaPlayer(_libVLC);
videoView.MediaPlayer = _mediaPlayer;

これだけで、再生ビューの準備完了です。


動画の読み込み処理

再生前に動画を選ぶ必要があるので、OpenFileDialog を使ってファイル選択します。

private void BtnOpenVideo_Click(object sender, EventArgs e)
{
    using (var ofd = new OpenFileDialog
    {
        Title = "動画ファイルを選択",
        Filter = "動画ファイル|*.mp4;*.mov;*.avi;*.mkv"
    })
    {
        if (ofd.ShowDialog() == DialogResult.OK)
        {
            txtVideoPath.Text = ofd.FileName;
            lblFileName.Text = "読み込みファイル:" + Path.GetFileName(ofd.FileName);

            using (var media = new Media(_libVLC, new Uri(ofd.FileName)))
            {
                _mediaPlayer.Play(media);
            }
        }
    }
}

Copilotには「OpenFileDialogで動画選択して、Mediaで読み込んでPlayして」と指示しただけです。
返ってくるコードは、C# 7.3対応まで自動で整えてくれます。


再生・一時停止・停止ボタンの制御

ユーザー操作に対応するため、以下の処理をそれぞれイベントとして登録:

private void BtnPlay_Click(object sender, EventArgs e)
{
    if (!_mediaPlayer.IsPlaying && File.Exists(txtVideoPath.Text))
        using (var media = new Media(_libVLC, new Uri(txtVideoPath.Text)))
            _mediaPlayer.Play(media);
}

private void BtnPause_Click(object sender, EventArgs e)
{
    if (_mediaPlayer.IsPlaying)
        _mediaPlayer.Pause();
    else
        _mediaPlayer.SetPause(false);
}

private void BtnStop_Click(object sender, EventArgs e)
{
    _mediaPlayer.Stop();
    slider.Value = 0;
    lblTime.Text = "0:00:00 / 0:00:00";
    markerOverlay.Invalidate();
}

💡 ボタンが潰れないように Location.Y = 485 と調整したのは第3回で紹介した通りです。


再生位置の更新:スライダーと時間表示

Timerを使って、再生中に現在の時間とスライダー位置を更新します:

private void UpdateSlider(object sender, EventArgs e)
{
    if (_mediaPlayer.IsPlaying)
    {
        int currentSec = (int)(_mediaPlayer.Time / 1000);
        int maxSec = (int)(_mediaPlayer.Length / 1000);
        slider.Maximum = maxSec;
        slider.Value = Math.Min(maxSec, currentSec);

        lblTime.Text = $"{TimeSpan.FromSeconds(currentSec):h\\:mm\\:ss} / {TimeSpan.FromSeconds(maxSec):h\\:mm\\:ss}";
        markerOverlay.Invalidate();
    }
}

この処理によって、動画の現在再生位置が常に表示され、ジョブ設定にも使える情報になります。


スライダーを手動操作する場合の処理

ユーザーがスライダーを動かしたら再生位置をその位置にジャンプさせます:

private void Slider_Scroll(object sender, EventArgs e)
{
    _mediaPlayer.Time = slider.Value * 1000;
    markerOverlay.Invalidate();
}

Copilotに「スクロール時に再生位置を更新したい」と伝えるだけで、これだけ簡潔なコードを返してくれます。


まとめ:再生機能はLibVLCSharpとCopilotで完璧に構築できる

この回で得られた学び:

機能 使用技術 実装のポイント
動画再生ビュー LibVLCSharp.WinForms VideoViewMediaPlayer を割り当てる
ファイル選択 OpenFileDialog プロンプトで生成AIに指示するだけでOK
再生制御 Play, Pause, Stop Media生成のタイミングに注意
再生位置表示 slider, lblTime Timerを使って定期更新
C# 7.3対応 using (...) {} AIに指示すれば自動変換できる

生成AIがいることで、慣れていないC#でもここまでの再生環境を整えることができました。
理解と実装を繰り返せば、未知の技術も「一緒に試してくれる仲間」がいる感覚で進められます。


次回:第5回【マーカー描画編】

動画再生とシークバーが完成したら、次は「指定区間をバーに描画する」機能です。

  • 開始のみなら線
  • 開始+終了なら塗りつぶし
  • 分割ジョブをDataGridViewと連携して反映
  • C# 7.3対応の描画コードと最適な構造

可視化されることで、視認性と操作性が大幅にアップします。

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?