はじめに: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 |
VideoView に MediaPlayer を割り当てる |
ファイル選択 | OpenFileDialog | プロンプトで生成AIに指示するだけでOK |
再生制御 |
Play , Pause , Stop
|
Media生成のタイミングに注意 |
再生位置表示 |
slider , lblTime
|
Timerを使って定期更新 |
C# 7.3対応 | using (...) {} |
AIに指示すれば自動変換できる |
生成AIがいることで、慣れていないC#でもここまでの再生環境を整えることができました。
理解と実装を繰り返せば、未知の技術も「一緒に試してくれる仲間」がいる感覚で進められます。
次回:第5回【マーカー描画編】
動画再生とシークバーが完成したら、次は「指定区間をバーに描画する」機能です。
- 開始のみなら線
- 開始+終了なら塗りつぶし
- 分割ジョブをDataGridViewと連携して反映
- C# 7.3対応の描画コードと最適な構造
可視化されることで、視認性と操作性が大幅にアップします。