【C#】動画再生の実装方法|Windowsアプリで動画プレイヤーを作る手順を初心者向けに解説

はじめに

C#でWindowsアプリに動画再生機能を実装したい場合、まず候補になるのがWPFのMediaElementです。MediaElementを使うと、C#とXAMLだけで動画ファイルを読み込み、再生・一時停止・停止・音量調整・シークバー操作などを比較的シンプルに実装できます。

この記事では、「c# 動画再生」で調べている初心者向けに、Windowsアプリで動画プレイヤーを作る手順を解説します。WPFを中心に、Windows Formsで実装する方法や、LibVLCSharpなどの外部ライブラリを使う選択肢も紹介します。

最終的には、以下のような基本機能を持つ動画プレイヤーを作れるようになることを目指します。

  • 動画ファイルを開く

  • 動画を再生する

  • 一時停止する

  • 停止する

  • 音量を変更する

  • シークバーで再生位置を移動する

  • 再生時間を表示する

  • 再生速度を変更する

C#で動画再生を実装する方法はいくつかありますが、初心者が最初に試すならWPFのMediaElementが扱いやすいです。まずは基本を理解し、そのうえで本格的な動画プレイヤーに発展させていきましょう。

1. C#で動画再生を実装する前に知っておきたいこと

1-1. この記事で作るWindows向け動画プレイヤーの完成イメージ

この記事で作る動画プレイヤーは、Windows上で動作するデスクトップアプリです。画面上部に動画表示エリアを配置し、下部に操作ボタンやスライダーを並べます。

完成イメージは次のような構成です。

+--------------------------------------+
| |
| 動画表示エリア |
| |
+--------------------------------------+
| 開く | 再生 | 一時停止 | 停止 |
| 再生位置スライダー |
| 00:01:23 / 00:05:00 |
| 音量スライダー | 再生速度 |
+--------------------------------------+

シンプルな構成ですが、動画プレイヤーとして必要な基本操作はひと通り含まれています。まずはローカルに保存されているmp4ファイルなどを読み込み、再生できるアプリを作成します。

1-2. 「c# 動画再生」で検索する人が知りたいこと

「c# 動画再生」で検索する人が知りたい内容は、大きく分けると次のようなものです。

まず、C#だけで動画を再生できるのかという疑問があります。結論からいうと、Windows向けアプリであれば、WPFのMediaElementやWindows FormsのWindows Media Playerコントロールを使って動画再生を実装できます。

次に、どの方法を選べばよいかという疑問があります。簡単な動画再生ならWPFのMediaElementで十分です。一方で、多くの動画形式に対応したい場合や、字幕、ストリーミング、細かい再生制御が必要な場合は、LibVLCSharpなどの外部ライブラリを検討します。

また、実装時には「動画が再生されない」「音声だけ流れて映像が出ない」「ファイルパスが正しいのに読み込めない」といったトラブルもよく発生します。この記事では、基本実装だけでなく、よくあるエラーの対処法もあわせて解説します。

1-3. C#で動画を再生する主な方法

C#で動画再生を実装する代表的な方法は、主に次の3つです。

1つ目は、WPFのMediaElementを使う方法です。WPFアプリケーションに標準で用意されているメディア再生用のコントロールで、XAMLに配置してC#コードから操作できます。Microsoftのドキュメントでも、MediaElementの再生、一時停止、停止、音量、速度制御の方法が紹介されています。

2つ目は、Windows FormsでWindows Media Playerコントロールを使う方法です。Windows Media PlayerのActiveXコントロールをフォームに配置し、C#コードから動画ファイルを読み込んで再生します。Microsoftのドキュメントでは、Windows Media Player ActiveXコントロールをフォームに追加して動画ウィンドウとして使う手順が説明されています。

3つ目は、LibVLCSharpなどの外部ライブラリを使う方法です。LibVLCSharpはVideoLANのLibVLCをベースにした.NET向けのマルチメディアAPIで、WPFやWindows Formsなどから利用できます。NuGetでもWPF向け、WinForms向けのパッケージが提供されています。

1-4. 初心者にはWPFのMediaElementがおすすめな理由

初心者にWPFのMediaElementがおすすめな理由は、実装がシンプルだからです。XAMLにMediaElementを配置し、C#コードからPlay()Pause()Stop()を呼び出すだけで、基本的な動画再生を実装できます。

また、WPFはUIをXAMLで定義できるため、動画表示エリア、ボタン、スライダー、テキスト表示などを整理しやすいです。Windows Formsよりもレイアウトの自由度が高く、動画プレイヤーの画面を作り込みやすい点もメリットです。

ただし、MediaElementは万能ではありません。対応する動画形式やコーデックは実行環境に依存することがあります。そのため、特定のmp4ファイルは再生できても、別の動画ファイルでは再生できないケースがあります。幅広い形式に対応したい場合は、外部ライブラリの利用も視野に入れましょう。

2. C#で動画再生を実装する方法の選び方

2-1. WPFのMediaElementを使う方法

WPFのMediaElementを使う方法は、C#で動画再生を試すうえで最も始めやすい方法です。WPFプロジェクトを作成し、画面にMediaElementを配置して、動画ファイルのパスをSourceに指定します。

基本的な流れは次のとおりです。

1. WPFアプリケーションを作成する
2. XAMLにMediaElementを配置する
3. Sourceに動画ファイルを指定する
4. LoadedBehaviorをManualにする
5. C#コードからPlay()を呼び出す

再生、一時停止、停止などをボタンで操作したい場合は、LoadedBehavior="Manual"を設定することが重要です。Microsoftのドキュメントでも、対話的に再生・一時停止・停止を制御するにはLoadedBehaviorManualに設定する必要があると説明されています。

2-2. Windows FormsでWindows Media Playerコントロールを使う方法

Windows Formsで動画再生を行う場合は、Windows Media Playerコントロールを利用する方法があります。Visual StudioのツールボックスにWindows Media Playerコントロールを追加し、フォーム上に配置して使います。

Windows Formsに慣れている人にとっては、ドラッグ&ドロップでコントロールを配置できるため直感的です。URLプロパティに動画ファイルのパスを指定すれば、動画を読み込めます。

ただし、Windows Media PlayerコントロールはActiveXコントロールを利用する方法です。新しくアプリを作る場合は、WPFや外部ライブラリを使う構成のほうが扱いやすいこともあります。

2-3. LibVLCSharpなど外部ライブラリを使う方法

LibVLCSharpは、VLCメディアプレイヤーで知られるVideoLANのLibVLCを.NETから利用するためのライブラリです。WPF、Windows Forms、.NET MAUIなど複数の環境で利用でき、標準コントロールよりも幅広い動画形式に対応しやすい点が特徴です。

外部ライブラリを使うメリットは、対応形式や機能を拡張しやすいことです。たとえば、さまざまなコーデック、ネットワークストリーミング、字幕表示などを扱いたい場合は、MediaElementよりもLibVLCSharpのほうが向いているケースがあります。

一方で、NuGetパッケージの追加、ネイティブライブラリの配置、ライセンス確認など、初心者には少し難しい要素も増えます。まずはMediaElementで基本を理解し、必要に応じてLibVLCSharpへ進むのがおすすめです。

2-4. 初心者向け・本格開発向けの使い分け

C#で動画再生を実装する方法は、目的によって使い分けるとよいです。

学習目的や簡単な社内ツールであれば、WPFのMediaElementがおすすめです。標準機能で実装でき、コード量も少なく済みます。

既存のWindows Formsアプリに動画再生機能を追加したい場合は、Windows Media Playerコントロールが候補になります。既存画面に動画表示エリアを追加しやすいからです。

本格的な動画プレイヤーを作りたい場合は、LibVLCSharpなどの外部ライブラリを検討しましょう。対応形式、再生制御、ストリーミング、字幕、細かいオプションが必要になるほど、標準機能だけでは限界が出やすくなります。

2-5. 対応できる動画形式と注意点

MediaElementで再生できる動画形式は、Windows環境やインストールされているコーデックに影響されます。一般的にはmp4、wmv、aviなどが候補になりますが、すべてのファイルが必ず再生できるわけではありません。

特に注意したいのは、拡張子が.mp4でも中身の映像コーデックや音声コーデックが異なる場合がある点です。同じmp4ファイルに見えても、ある動画は再生でき、別の動画は再生できないことがあります。

初心者が検証する場合は、まず短いmp4ファイルを1つ用意し、それを使って動作確認しましょう。動画再生の処理が正しく動くことを確認してから、他の形式に対応させるほうがトラブルを切り分けやすくなります。

3. 開発環境を準備する

3-1. Visual Studioをインストールする

C#でWindowsアプリを作るには、Visual Studioを使うのが一般的です。インストール時には、ワークロードとして「.NET デスクトップ開発」を選択します。

このワークロードを入れておくと、WPFアプリケーションやWindows Formsアプリケーションを作成できます。この記事では、WPFアプリケーションを使って動画プレイヤーを作成します。

Visual Studioを起動したら、新しいプロジェクトを作成する画面からWPFアプリケーションを選択します。プロジェクト名は、たとえばSimpleVideoPlayerなどにするとわかりやすいです。

3-2. WPFアプリケーションのプロジェクトを作成する

Visual StudioでWPFアプリケーションを作成する手順は次のとおりです。

1. Visual Studioを起動する
2. 「新しいプロジェクトの作成」を選択する
3. 「WPF アプリケーション」を検索する
4. C#のWPFアプリケーションを選択する
5. プロジェクト名を入力する
6. 作成ボタンを押す

プロジェクトが作成されると、主に次のファイルが生成されます。

SimpleVideoPlayer
├─ App.xaml
├─ App.xaml.cs
├─ MainWindow.xaml
└─ MainWindow.xaml.cs

画面レイアウトはMainWindow.xamlに記述し、ボタンを押したときの処理や動画再生の制御はMainWindow.xaml.csに記述します。

3-3. 動画ファイルを用意する

動作確認用の動画ファイルを用意します。最初は短いmp4ファイルがおすすめです。ファイル名は日本語や空白を避け、たとえばsample.mp4のようなシンプルな名前にするとトラブルを減らせます。

動画ファイルは、次のいずれかの方法で扱います。

1. プロジェクト外の任意フォルダに置いて、ファイル選択ダイアログから開く
2. プロジェクト内にVideosフォルダを作成して配置する
3. 実行ファイルと同じフォルダに配置する

初心者には、まずファイル選択ダイアログから動画を開く方法がおすすめです。ファイルパスの問題を確認しやすく、後から複数ファイル対応にも発展させやすいからです。

3-4. プロジェクト内で動画ファイルを扱うときの注意点

プロジェクト内に動画ファイルを置く場合は、ビルド後に実行フォルダへコピーされるかを確認する必要があります。

Visual Studioで動画ファイルをプロジェクトに追加したら、ファイルのプロパティで次のように設定します。

ビルドアクション: Content
出力ディレクトリにコピー: 新しい場合はコピーする

この設定をしておくと、デバッグ実行時に動画ファイルが出力先フォルダへコピーされます。逆に、この設定を忘れると、開発中は存在しているように見えても、実行時にファイルが見つからないことがあります。

3-5. 実装前に確認しておきたいフォルダ構成

この記事では、最終的に次のような構成を想定します。

SimpleVideoPlayer
├─ App.xaml
├─ App.xaml.cs
├─ MainWindow.xaml
├─ MainWindow.xaml.cs
└─ Videos
└─ sample.mp4

ただし、実用的な動画プレイヤーでは、アプリ内に動画ファイルを固定で入れるより、ユーザーが任意の動画ファイルを選択できるようにするほうが自然です。

そのため、基本実装ではSourceに固定パスを指定する方法を紹介し、その後に「動画ファイルを開く」機能を追加します。

4. WPFで動画を再生する基本実装

4-1. MediaElementを画面に配置する

まず、MainWindow.xamlMediaElementを配置します。MediaElementは動画や音声を再生するためのWPFコントロールです。

以下は、画面いっぱいに動画を表示する最小構成の例です。

XML
<Window x:Class="SimpleVideoPlayer.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Simple Video Player"
Width="800"
Height="450">
<Grid>
<MediaElement x:Name="VideoPlayer"
LoadedBehavior="Manual"
UnloadedBehavior="Stop"
Stretch="Uniform" />
</Grid>
</Window>

Stretch="Uniform"を指定すると、動画の縦横比を保ったまま表示できます。動画を無理に引き伸ばしたくない場合に便利です。

4-2. Sourceプロパティで動画ファイルを指定する

MediaElementで動画を読み込むには、Sourceプロパティに動画ファイルのURIを指定します。XAMLに直接書くこともできますが、実際のアプリではC#コードから指定することが多いです。

XAMLで直接指定する場合は、次のように書きます。

XML
<MediaElement x:Name="VideoPlayer"
Source="Videos/sample.mp4"
LoadedBehavior="Manual"
UnloadedBehavior="Stop"
Stretch="Uniform" />

ただし、相対パスは実行時のフォルダ構成に影響されます。初心者のうちは、ファイル選択ダイアログで選んだフルパスをC#コードから指定するほうがわかりやすいです。

4-3. LoadedBehaviorとUnloadedBehaviorを設定する

MediaElementをボタン操作で制御する場合は、LoadedBehavior="Manual"を指定します。この設定をしないと、Play()Pause()を呼び出しても期待どおりに動かないことがあります。公式ドキュメントでも、対話的に停止、一時停止、再生を行うにはLoadedBehaviorManualに設定する必要があると説明されています。

UnloadedBehaviorは、コントロールがアンロードされたときの動作を指定します。動画プレイヤーでは、画面を閉じるときに再生を止めたいので、StopまたはCloseを指定することが多いです。

XML
<MediaElement x:Name="VideoPlayer"
LoadedBehavior="Manual"
UnloadedBehavior="Stop" />

まずはこの2つを設定しておくと、C#コードから再生制御しやすくなります。

4-4. C#コードから動画を再生する

C#コードから動画を再生するには、MediaElementPlay()メソッドを呼び出します。

C#
VideoPlayer.Play();

一時停止する場合はPause()、停止する場合はStop()を使います。

C#
VideoPlayer.Pause();
VideoPlayer.Stop();

動画ファイルをコードから指定する場合は、次のようにSourceUriを設定します。

C#
VideoPlayer.Source = new Uri(@"C:\Videos\sample.mp4", UriKind.Absolute);
VideoPlayer.Play();

このように、Sourceで動画ファイルを指定し、Play()を呼び出すのが基本の流れです。

4-5. 最小構成のサンプルコード

まずは、アプリ起動時に動画を読み込んで再生する最小構成を作ってみましょう。

MainWindow.xamlは次のようにします。

XML
<Window x:Class="SimpleVideoPlayer.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Simple Video Player"
Width="800"
Height="450">
<Grid>
<MediaElement x:Name="VideoPlayer"
LoadedBehavior="Manual"
UnloadedBehavior="Stop"
Stretch="Uniform" />
</Grid>
</Window>

MainWindow.xaml.csは次のようにします。

C#
using System;
using System.Windows;

namespace SimpleVideoPlayer
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();

VideoPlayer.Source = new Uri(@"C:\Videos\sample.mp4", UriKind.Absolute);
VideoPlayer.Play();
}
}
}

C:\Videos\sample.mp4の部分は、自分の環境にある動画ファイルのパスに変更してください。これで、WPFアプリを起動したときに動画が再生されます。

5. 動画プレイヤーに基本操作を追加する

5-1. 再生ボタンを実装する

次に、再生ボタンを追加します。まず、MainWindow.xamlにボタンを配置します。

XML
<Button Content="再生"
Width="80"
Margin="5"
Click="PlayButton_Click" />

C#側では、クリックイベントに次の処理を書きます。

C#
private void PlayButton_Click(object sender, RoutedEventArgs e)
{
VideoPlayer.Play();
}

これで、再生ボタンを押したときに動画が再生されます。

5-2. 一時停止ボタンを実装する

一時停止ボタンも同じように追加します。

XML
<Button Content="一時停止"
Width="80"
Margin="5"
Click="PauseButton_Click" />

C#側ではPause()を呼び出します。

C#
private void PauseButton_Click(object sender, RoutedEventArgs e)
{
VideoPlayer.Pause();
}

Pause()は現在の再生位置を保持したまま停止します。その後、Play()を呼び出すと同じ位置から再開できます。

5-3. 停止ボタンを実装する

停止ボタンではStop()を呼び出します。

XML
<Button Content="停止"
Width="80"
Margin="5"
Click="StopButton_Click" />

C#側は次のようになります。

C#
private void StopButton_Click(object sender, RoutedEventArgs e)
{
VideoPlayer.Stop();
}

Stop()を呼び出すと、再生位置は先頭に戻ります。一時停止とは挙動が異なるため、用途に応じて使い分けましょう。

5-4. 動画ファイルを開く機能を追加する

実用的な動画プレイヤーにするには、ユーザーが動画ファイルを選択できる機能が必要です。WPFではOpenFileDialogを使ってファイル選択ダイアログを表示できます。

まず、開くボタンを追加します。

XML
<Button Content="開く"
Width="80"
Margin="5"
Click="OpenButton_Click" />

C#側では次のように実装します。

C#
using Microsoft.Win32;
using System;
using System.Windows;

private void OpenButton_Click(object sender, RoutedEventArgs e)
{
var dialog = new OpenFileDialog
{
Filter = "動画ファイル|*.mp4;*.wmv;*.avi;*.mov;*.mkv|すべてのファイル|*.*"
};

if (dialog.ShowDialog() == true)
{
VideoPlayer.Source = new Uri(dialog.FileName, UriKind.Absolute);
VideoPlayer.Play();
}
}

このコードにより、ユーザーが選択した動画ファイルをMediaElementに読み込み、そのまま再生できます。

5-5. 音量調整を実装する

MediaElementの音量はVolumeプロパティで変更できます。Volume0.0から1.0の範囲で指定します。

XAMLに音量スライダーを追加します。

XML
<Slider x:Name="VolumeSlider"
Minimum="0"
Maximum="1"
Value="0.5"
Width="120"
Margin="5"
ValueChanged="VolumeSlider_ValueChanged" />

C#側では次のようにします。

C#
private void VolumeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (VideoPlayer != null)
{
VideoPlayer.Volume = VolumeSlider.Value;
}
}

初期音量を設定したい場合は、コンストラクターで次のように指定してもよいです。

C#
VideoPlayer.Volume = 0.5;

5-6. 再生位置のシークバーを実装する

再生位置を操作するには、Positionプロパティを使います。動画全体の長さは、メディアが読み込まれた後にNaturalDurationから取得できます。

XAMLにシークバーを追加します。

XML
<Slider x:Name="PositionSlider"
Minimum="0"
Maximum="100"
ValueChanged="PositionSlider_ValueChanged"
PreviewMouseDown="PositionSlider_PreviewMouseDown"
PreviewMouseUp="PositionSlider_PreviewMouseUp" />

C#側では、タイマーを使って現在位置をスライダーに反映します。

C#
using System;
using System.Windows;
using System.Windows.Threading;

private DispatcherTimer _timer;
private bool _isDraggingSlider;

public MainWindow()
{
InitializeComponent();

_timer = new DispatcherTimer();
_timer.Interval = TimeSpan.FromMilliseconds(500);
_timer.Tick += Timer_Tick;
_timer.Start();
}

private void Timer_Tick(object sender, EventArgs e)
{
if (!_isDraggingSlider &&
VideoPlayer.NaturalDuration.HasTimeSpan)
{
PositionSlider.Maximum = VideoPlayer.NaturalDuration.TimeSpan.TotalSeconds;
PositionSlider.Value = VideoPlayer.Position.TotalSeconds;
}
}

スライダーをドラッグ中にタイマーで値が上書きされると操作しにくいため、ドラッグ中かどうかを判定します。

C#
private void PositionSlider_PreviewMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
_isDraggingSlider = true;
}

private void PositionSlider_PreviewMouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
_isDraggingSlider = false;
VideoPlayer.Position = TimeSpan.FromSeconds(PositionSlider.Value);
}

5-7. 再生時間と残り時間を表示する

再生時間を表示するには、TextBlockを使います。

XML
<TextBlock x:Name="TimeText"
Text="00:00 / 00:00"
Margin="5"
VerticalAlignment="Center" />

タイマー処理の中で、現在位置と総再生時間を表示します。

C#
private void Timer_Tick(object sender, EventArgs e)
{
if (!_isDraggingSlider &&
VideoPlayer.NaturalDuration.HasTimeSpan)
{
TimeSpan current = VideoPlayer.Position;
TimeSpan total = VideoPlayer.NaturalDuration.TimeSpan;

PositionSlider.Maximum = total.TotalSeconds;
PositionSlider.Value = current.TotalSeconds;

TimeText.Text = $"{current:mm\\:ss} / {total:mm\\:ss}";
}
}

1時間を超える動画にも対応したい場合は、表示形式をhh:mm:ssにします。

C#
TimeText.Text = $"{current:hh\\:mm\\:ss} / {total:hh\\:mm\\:ss}";

残り時間を表示したい場合は、次のように計算します。

C#
TimeSpan remaining = total - current;
TimeText.Text = $"{current:mm\\:ss} / {total:mm\\:ss} 残り {remaining:mm\\:ss}";

5-8. 再生速度を変更する

MediaElementではSpeedRatioプロパティを使って再生速度を変更できます。たとえば、1.0が通常速度、1.5が1.5倍速、2.0が2倍速です。

XAMLにコンボボックスを追加します。

XML
<ComboBox x:Name="SpeedComboBox"
Width="100"
Margin="5"
SelectionChanged="SpeedComboBox_SelectionChanged">
<ComboBoxItem Content="0.5x" Tag="0.5" />
<ComboBoxItem Content="1.0x" Tag="1.0" IsSelected="True" />
<ComboBoxItem Content="1.5x" Tag="1.5" />
<ComboBoxItem Content="2.0x" Tag="2.0" />
</ComboBox>

C#側では、選択された倍率をSpeedRatioに設定します。

C#
private void SpeedComboBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
if (VideoPlayer == null || SpeedComboBox.SelectedItem == null)
{
return;
}

var item = (System.Windows.Controls.ComboBoxItem)SpeedComboBox.SelectedItem;
if (double.TryParse(item.Tag.ToString(), out double speed))
{
VideoPlayer.SpeedRatio = speed;
}
}

これで、簡単な倍速再生機能を追加できます。

以下は、基本操作をまとめたWPF版のサンプルです。

XML
<Window x:Class="SimpleVideoPlayer.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Simple Video Player"
Width="900"
Height="550">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>

<MediaElement x:Name="VideoPlayer"
Grid.Row="0"
LoadedBehavior="Manual"
UnloadedBehavior="Stop"
Stretch="Uniform"
MediaOpened="VideoPlayer_MediaOpened"
MediaEnded="VideoPlayer_MediaEnded" />

<StackPanel Grid.Row="1" Margin="10">
<StackPanel Orientation="Horizontal">
<Button Content="開く" Width="80" Margin="5" Click="OpenButton_Click" />
<Button Content="再生" Width="80" Margin="5" Click="PlayButton_Click" />
<Button Content="一時停止" Width="80" Margin="5" Click="PauseButton_Click" />
<Button Content="停止" Width="80" Margin="5" Click="StopButton_Click" />

<TextBlock Text="音量" VerticalAlignment="Center" Margin="15,0,5,0" />
<Slider x:Name="VolumeSlider"
Minimum="0"
Maximum="1"
Value="0.5"
Width="120"
ValueChanged="VolumeSlider_ValueChanged" />

<TextBlock Text="速度" VerticalAlignment="Center" Margin="15,0,5,0" />
<ComboBox x:Name="SpeedComboBox"
Width="100"
SelectionChanged="SpeedComboBox_SelectionChanged">
<ComboBoxItem Content="0.5x" Tag="0.5" />
<ComboBoxItem Content="1.0x" Tag="1.0" IsSelected="True" />
<ComboBoxItem Content="1.5x" Tag="1.5" />
<ComboBoxItem Content="2.0x" Tag="2.0" />
</ComboBox>
</StackPanel>

<Slider x:Name="PositionSlider"
Minimum="0"
Maximum="100"
Margin="5"
PreviewMouseDown="PositionSlider_PreviewMouseDown"
PreviewMouseUp="PositionSlider_PreviewMouseUp" />

<TextBlock x:Name="TimeText"
Text="00:00 / 00:00"
Margin="5" />
</StackPanel>
</Grid>
</Window>
C#
using Microsoft.Win32;
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Threading;

namespace SimpleVideoPlayer
{
public partial class MainWindow : Window
{
private readonly DispatcherTimer _timer;
private bool _isDraggingSlider;

public MainWindow()
{
InitializeComponent();

VideoPlayer.Volume = 0.5;

_timer = new DispatcherTimer
{
Interval = TimeSpan.FromMilliseconds(500)
};
_timer.Tick += Timer_Tick;
_timer.Start();
}

private void OpenButton_Click(object sender, RoutedEventArgs e)
{
var dialog = new OpenFileDialog
{
Filter = "動画ファイル|*.mp4;*.wmv;*.avi;*.mov;*.mkv|すべてのファイル|*.*"
};

if (dialog.ShowDialog() == true)
{
VideoPlayer.Source = new Uri(dialog.FileName, UriKind.Absolute);
VideoPlayer.Play();
}
}

private void PlayButton_Click(object sender, RoutedEventArgs e)
{
VideoPlayer.Play();
}

private void PauseButton_Click(object sender, RoutedEventArgs e)
{
VideoPlayer.Pause();
}

private void StopButton_Click(object sender, RoutedEventArgs e)
{
VideoPlayer.Stop();
}

private void VolumeSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (VideoPlayer != null)
{
VideoPlayer.Volume = VolumeSlider.Value;
}
}

private void PositionSlider_PreviewMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
_isDraggingSlider = true;
}

private void PositionSlider_PreviewMouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
_isDraggingSlider = false;
VideoPlayer.Position = TimeSpan.FromSeconds(PositionSlider.Value);
}

private void SpeedComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (VideoPlayer == null || SpeedComboBox.SelectedItem == null)
{
return;
}

var item = (ComboBoxItem)SpeedComboBox.SelectedItem;

if (double.TryParse(item.Tag.ToString(), out double speed))
{
VideoPlayer.SpeedRatio = speed;
}
}

private void VideoPlayer_MediaOpened(object sender, RoutedEventArgs e)
{
if (VideoPlayer.NaturalDuration.HasTimeSpan)
{
PositionSlider.Maximum = VideoPlayer.NaturalDuration.TimeSpan.TotalSeconds;
}
}

private void VideoPlayer_MediaEnded(object sender, RoutedEventArgs e)
{
VideoPlayer.Stop();
PositionSlider.Value = 0;
}

private void Timer_Tick(object sender, EventArgs e)
{
if (VideoPlayer.Source == null ||
_isDraggingSlider ||
!VideoPlayer.NaturalDuration.HasTimeSpan)
{
return;
}

TimeSpan current = VideoPlayer.Position;
TimeSpan total = VideoPlayer.NaturalDuration.TimeSpan;

PositionSlider.Maximum = total.TotalSeconds;
PositionSlider.Value = current.TotalSeconds;

TimeText.Text = $"{current:mm\\:ss} / {total:mm\\:ss}";
}

protected override void OnClosed(EventArgs e)
{
_timer.Stop();
VideoPlayer.Stop();
VideoPlayer.Close();

base.OnClosed(e);
}
}
}

6. Windows Formsで動画再生を実装する方法

6-1. Windows Media Playerコントロールを追加する

Windows Formsで動画再生を実装する場合は、Windows Media Playerコントロールを使う方法があります。これはWindows Media PlayerのActiveXコントロールをフォームに埋め込む方法です。Microsoftのドキュメントでも、Windows Media Player ActiveXコントロールをフォームに追加して動画ウィンドウとして使う手順が紹介されています。

Visual StudioでWindows Media Playerコントロールを使うには、ツールボックスに追加する必要があります。

手順は次のとおりです。

1. Windows Formsアプリケーションを作成する
2. ツールボックスを右クリックする
3. 「アイテムの選択」をクリックする
4. 「COM コンポーネント」タブを開く
5. 「Windows Media Player」にチェックを入れる
6. OKを押す

追加すると、ツールボックスからWindows Media Playerコントロールをフォームに配置できるようになります。

6-2. フォームに動画再生エリアを配置する

ツールボックスからWindows Media Playerコントロールをフォームにドラッグ&ドロップします。コントロール名は、たとえばaxWindowsMediaPlayer1になります。

フォームの上部に動画再生エリアを配置し、下部にボタンを並べると、WPF版と同じような動画プレイヤーを作れます。

Windows Media Playerコントロールには標準の操作UIもあります。独自のボタンを作りたい場合は、uiModenoneにして標準UIを非表示にできます。uiModeプロパティは、表示するユーザーインターフェイスを制御するためのプロパティです。

6-3. C#コードから動画ファイルを読み込む

Windows Forms版では、URLプロパティに動画ファイルのパスを設定します。

C#
axWindowsMediaPlayer1.URL = @"C:\Videos\sample.mp4";

ファイル選択ダイアログを使う場合は、次のように実装できます。

C#
private void openButton_Click(object sender, EventArgs e)
{
using (OpenFileDialog dialog = new OpenFileDialog())
{
dialog.Filter = "動画ファイル|*.mp4;*.wmv;*.avi;*.mov;*.mkv|すべてのファイル|*.*";

if (dialog.ShowDialog() == DialogResult.OK)
{
axWindowsMediaPlayer1.URL = dialog.FileName;
axWindowsMediaPlayer1.Ctlcontrols.play();
}
}
}

これで、ユーザーが選択した動画ファイルを読み込んで再生できます。

6-4. 再生・停止・一時停止を制御する

Windows Media Playerコントロールでは、Ctlcontrolsを使って再生、停止、一時停止を制御します。

C#
private void playButton_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.play();
}

private void pauseButton_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.pause();
}

private void stopButton_Click(object sender, EventArgs e)
{
axWindowsMediaPlayer1.Ctlcontrols.stop();
}

音量を変更する場合は、settings.volumeを使います。

C#
axWindowsMediaPlayer1.settings.volume = 50;

settings.volumeは0から100の範囲で指定します。WPFのMediaElement.Volumeは0.0から1.0なので、値の範囲が違う点に注意してください。

6-5. WPF版との違いと使い分け

WPF版とWindows Forms版の違いは、UIの作りやすさと実装スタイルです。

WPFはXAMLでレイアウトを定義できるため、画面デザインを柔軟に作れます。動画プレイヤーの見た目を整えたい場合や、将来的にUIを作り込みたい場合はWPFが向いています。

Windows Formsは、既存のフォームアプリに動画再生機能を追加したい場合に便利です。Windows Formsに慣れている場合は、Windows Media Playerコントロールを配置するだけで始められます。

新規でC#の動画再生アプリを作るなら、まずはWPFのMediaElementをおすすめします。既存アプリがWindows Formsで作られている場合は、Windows Media Playerコントロールの利用を検討するとよいでしょう。

7. 動画再生アプリを使いやすくする追加機能

7-1. ドラッグ&ドロップで動画を開く

動画ファイルを毎回「開く」ボタンから選択するのは少し手間です。ドラッグ&ドロップで動画を開けるようにすると、使いやすさが向上します。

まず、WindowAllowDrop="True"を追加します。

XML
<Window x:Class="SimpleVideoPlayer.MainWindow"
...
AllowDrop="True"
DragOver="Window_DragOver"
Drop="Window_Drop">

C#側では、ドロップされたファイルを取得します。

C#
private void Window_DragOver(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effects = DragDropEffects.Copy;
}
else
{
e.Effects = DragDropEffects.None;
}

e.Handled = true;
}

private void Window_Drop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);

if (files.Length > 0)
{
VideoPlayer.Source = new Uri(files[0], UriKind.Absolute);
VideoPlayer.Play();
}
}
}

これで、動画ファイルをアプリ画面にドラッグ&ドロップするだけで再生できるようになります。

7-2. mp4以外の動画形式に対応する

ファイル選択ダイアログのFilterを変更すれば、mp4以外の拡張子も選択できるようになります。

C#
dialog.Filter = "動画ファイル|*.mp4;*.wmv;*.avi;*.mov;*.mkv;*.m4v|すべてのファイル|*.*";

ただし、拡張子を増やしても、実際に再生できるかどうかは別問題です。MediaElementで再生できるかどうかは、環境やコーデックに依存します。

対応形式を広げたい場合は、LibVLCSharpなどの外部ライブラリを検討しましょう。LibVLCSharpはVideoLANのLibVLCをベースにした.NET向けAPIで、WPFやWindows Forms用のパッケージも用意されています。

7-3. フルスクリーン再生を実装する

動画プレイヤーでは、フルスクリーン再生もよく使われる機能です。WPFでは、ウィンドウの状態や枠線を変更することでフルスクリーン風の表示を実装できます。

C#
private bool _isFullScreen;
private WindowState _previousWindowState;
private WindowStyle _previousWindowStyle;
private ResizeMode _previousResizeMode;

private void ToggleFullScreen()
{
if (!_isFullScreen)
{
_previousWindowState = WindowState;
_previousWindowStyle = WindowStyle;
_previousResizeMode = ResizeMode;

WindowStyle = WindowStyle.None;
ResizeMode = ResizeMode.NoResize;
WindowState = WindowState.Maximized;

_isFullScreen = true;
}
else
{
WindowStyle = _previousWindowStyle;
ResizeMode = _previousResizeMode;
WindowState = _previousWindowState;

_isFullScreen = false;
}
}

ボタンやダブルクリックイベントからToggleFullScreen()を呼び出せば、通常表示とフルスクリーン表示を切り替えられます。

7-4. ループ再生を実装する

動画を繰り返し再生したい場合は、MediaEndedイベントを使います。

XAMLでイベントを設定します。

XML
<MediaElement x:Name="VideoPlayer"
MediaEnded="VideoPlayer_MediaEnded"
LoadedBehavior="Manual"
UnloadedBehavior="Stop" />

C#側では、動画終了時に再生位置を先頭へ戻して再生します。

C#
private bool _isLoopEnabled = true;

private void VideoPlayer_MediaEnded(object sender, RoutedEventArgs e)
{
if (_isLoopEnabled)
{
VideoPlayer.Position = TimeSpan.Zero;
VideoPlayer.Play();
}
}

ループ再生のオン・オフを切り替えたい場合は、チェックボックスを追加すると便利です。

7-5. プレイリスト機能を追加する

複数の動画を連続再生したい場合は、プレイリスト機能を追加します。シンプルに作るなら、動画ファイルのパスをList<string>で管理します。

C#
private readonly List<string> _playlist = new List<string>();
private int _currentIndex = -1;

動画が終了したら、次の動画を再生します。

C#
private void PlayNext()
{
if (_playlist.Count == 0)
{
return;
}

_currentIndex++;

if (_currentIndex >= _playlist.Count)
{
_currentIndex = 0;
}

VideoPlayer.Source = new Uri(_playlist[_currentIndex], UriKind.Absolute);
VideoPlayer.Play();
}

MediaEndedイベントでPlayNext()を呼び出せば、連続再生ができます。

C#
private void VideoPlayer_MediaEnded(object sender, RoutedEventArgs e)
{
PlayNext();
}

プレイリストを画面に表示する場合は、ListBoxを使うと実装しやすいです。

7-6. 動画のサムネイル表示を検討する

プレイリスト機能を本格的に作るなら、動画のサムネイル表示も検討できます。サムネイルがあると、ユーザーが動画内容を把握しやすくなります。

ただし、動画の任意フレームを画像として取得する処理は、MediaElementだけでは簡単ではありません。実装する場合は、外部ライブラリや動画処理ツールの利用を検討します。

初心者向けの段階では、まずファイル名一覧を表示するだけで十分です。次の段階として、動画の長さ、解像度、サムネイルなどを表示するように発展させるとよいでしょう。

8. C#の動画再生でよくあるエラーと対処法

8-1. 動画が再生されない

動画が再生されない場合は、まずファイルパスを確認します。指定したパスに本当に動画ファイルが存在するか、アプリからアクセスできる場所にあるかを確認してください。

次に、LoadedBehavior="Manual"が設定されているかを確認します。ボタン操作でPlay()を呼び出す構成では、LoadedBehaviorManualにしておくことが重要です。

また、動画ファイルそのものに問題がある可能性もあります。別の動画プレイヤーで再生できるか確認し、短いmp4ファイルなどで再度試してみましょう。

8-2. 音声だけ再生されて映像が表示されない

音声だけ再生されて映像が表示されない場合は、動画コーデックの問題が考えられます。拡張子がmp4でも、映像コーデックが環境に対応していないと映像が出ないことがあります。

別のmp4ファイルで試す、動画を再エンコードする、対応コーデックを確認するなどの方法で切り分けましょう。

また、MediaElementのサイズが0になっていないか、別のコントロールに隠れていないかも確認してください。Stretch="Uniform"を指定し、十分な表示領域を確保すると確認しやすくなります。

8-3. ファイルパスを指定しても読み込めない

ファイルパスの指定ミスは非常によくある原因です。C#の文字列では、\がエスケープ文字として扱われるため、Windowsのパスを書くときは注意が必要です。

次のように書くとエラーになります。

C#
VideoPlayer.Source = new Uri("C:\Videos\sample.mp4");

正しくは、逐語的文字列を使います。

C#
VideoPlayer.Source = new Uri(@"C:\Videos\sample.mp4", UriKind.Absolute);

または、\を2つ重ねます。

C#
VideoPlayer.Source = new Uri("C:\\Videos\\sample.mp4", UriKind.Absolute);

ファイル選択ダイアログを使えば、手入力によるパス間違いを減らせます。

8-4. 対応していない動画形式・コーデックの問題

動画形式やコーデックが原因で再生できない場合があります。特に、拡張子だけで判断しないことが重要です。

たとえば、同じ.mp4でも、映像コーデックや音声コーデックが異なる場合があります。あるPCでは再生できても、別のPCでは再生できないこともあります。

この問題を避けたい場合は、配布前に再生対象の動画形式を決めておきましょう。より多くの形式に対応したい場合は、LibVLCSharpのような外部ライブラリを検討します。

8-5. MediaElementが思った通りに動かない

MediaElementが思った通りに動かない場合は、次の点を確認してください。

1. LoadedBehaviorがManualになっているか
2. Sourceに正しいUriを指定しているか
3. Play()を呼び出すタイミングが早すぎないか
4. 動画ファイルが対応形式か
5. UIスレッドをブロックしていないか

特に、メディアの長さを取得する処理は、動画が開かれる前だと正しく取得できません。NaturalDurationを使う場合は、MediaOpenedイベント後に参照すると安全です。

C#
private void VideoPlayer_MediaOpened(object sender, RoutedEventArgs e)
{
if (VideoPlayer.NaturalDuration.HasTimeSpan)
{
PositionSlider.Maximum = VideoPlayer.NaturalDuration.TimeSpan.TotalSeconds;
}
}

8-6. デバッグ時と配布後で動画ファイルが見つからない

デバッグ時は再生できたのに、exe化して配布したら動画が見つからないという問題もよくあります。

原因は、動画ファイルが実行ファイルと同じフォルダにコピーされていないことです。プロジェクト内の動画ファイルを使う場合は、ファイルのプロパティで次の設定を確認してください。

ビルドアクション: Content
出力ディレクトリにコピー: 新しい場合はコピーする

ただし、一般的な動画プレイヤーでは、アプリに動画ファイルを同梱するより、ユーザーが任意のファイルを開けるようにするほうが自然です。配布後のトラブルを減らすためにも、OpenFileDialogでファイルを選択する方式がおすすめです。

8-7. アプリ終了時にリソースを解放する方法

動画再生では、ファイルやメディアリソースを使用します。アプリ終了時には、再生を停止してリソースを解放しましょう。

WPFでは、OnClosedをオーバーライドして次のように処理できます。

C#
protected override void OnClosed(EventArgs e)
{
_timer.Stop();

VideoPlayer.Stop();
VideoPlayer.Close();

base.OnClosed(e);
}

タイマーを使っている場合は、タイマーも停止します。動画ファイルを開いたまま終了すると、環境によってはファイルがロックされたように見えることもあるため、終了処理を入れておくと安心です。

9. 実装した動画プレイヤーを改善・配布する

9-1. UIを初心者でも使いやすく整える

基本機能が動いたら、UIを整えましょう。動画プレイヤーは操作が直感的であることが重要です。

たとえば、次のような改善が考えられます。

1. ボタンの幅をそろえる
2. 再生中のファイル名を表示する
3. 音量スライダーにラベルを付ける
4. シークバーを画面幅いっぱいに広げる
5. 現在時間と総再生時間を見やすく表示する
6. 再生・一時停止の状態をボタン表示に反映する

最初は機能を優先し、動作確認ができた後でUIを改善すると進めやすいです。

9-2. 例外処理を追加してアプリの停止を防ぐ

動画ファイルの読み込みでは、ファイルが存在しない、アクセス権限がない、形式が対応していないなど、さまざまな問題が起こります。

最低限、ファイルを開く処理にはtry-catchを追加しておくと安心です。

C#
private void OpenVideo(string filePath)
{
try
{
VideoPlayer.Source = new Uri(filePath, UriKind.Absolute);
VideoPlayer.Play();
}
catch (Exception ex)
{
MessageBox.Show(
$"動画を開けませんでした。\n{ex.Message}",
"エラー",
MessageBoxButton.OK,
MessageBoxImage.Error);
}
}

さらに、MediaFailedイベントを使うと、メディアの読み込みや再生に失敗したときの処理を追加できます。

XML
<MediaElement x:Name="VideoPlayer"
MediaFailed="VideoPlayer_MediaFailed"
LoadedBehavior="Manual"
UnloadedBehavior="Stop" />
C#
private void VideoPlayer_MediaFailed(object sender, ExceptionRoutedEventArgs e)
{
MessageBox.Show(
$"動画の再生に失敗しました。\n{e.ErrorException.Message}",
"再生エラー",
MessageBoxButton.OK,
MessageBoxImage.Error);
}

エラー時にアプリが突然終了しないようにしておくと、ユーザーにとって使いやすいアプリになります。

9-3. exe化して他のPCで動かすときの注意点

作成したWPFアプリは、ビルドまたは発行することで他のPCでも実行できます。ただし、動画再生機能を含むアプリを配布するときは、次の点に注意してください。

1. 実行に必要な.NETランタイムがあるか
2. 動画ファイルを同梱する必要があるか
3. 相対パスで指定しているファイルが存在するか
4. 配布先PCで対象動画形式が再生できるか
5. 外部ライブラリを使う場合は必要ファイルを含めているか

特に、開発PCでは再生できても、配布先PCではコーデックの違いで再生できないことがあります。配布先の環境を想定して、複数のPCで動作確認することが大切です。

9-4. 配布時に必要なファイルを確認する

MediaElementだけを使ったシンプルなWPFアプリであれば、基本的にはアプリ本体と必要な.NET関連ファイルを配布します。動画ファイルを同梱する場合は、動画ファイルも一緒に配布します。

外部ライブラリを使っている場合は、NuGetパッケージによって追加されたDLLやネイティブライブラリも必要です。LibVLCSharpを使う場合は、LibVLC本体に関係するファイルの配置も確認する必要があります。

配布前には、開発環境ではないPCで実行テストを行いましょう。Visual Studioが入っていないPCで動作確認することで、必要ファイルの不足に気づきやすくなります。

9-5. 本格的な動画プレイヤーに発展させるアイデア

基本的な動画プレイヤーが完成したら、次のような機能を追加すると本格的になります。

1. プレイリスト機能
2. 連続再生
3. シャッフル再生
4. ループ再生
5. フルスクリーン再生
6. 字幕表示
7. 再生履歴
8. 最後に再生した位置の保存
9. キーボードショートカット
10. ダークテーマ

たとえば、スペースキーで再生・一時停止、左右キーで10秒戻し・10秒送りを実装すると、動画プレイヤーらしさが増します。

C#
private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
if (e.Key == System.Windows.Input.Key.Space)
{
VideoPlayer.Pause();
}
else if (e.Key == System.Windows.Input.Key.Right)
{
VideoPlayer.Position += TimeSpan.FromSeconds(10);
}
else if (e.Key == System.Windows.Input.Key.Left)
{
VideoPlayer.Position -= TimeSpan.FromSeconds(10);
}
}

本格的に作る場合は、設定保存、エラーログ、ライセンス確認、配布形式まで考えて設計しましょう。

10. C#の動画再生に関するよくある質問

10-1. C#だけでmp4動画は再生できる?

Windows向けアプリであれば、C#とWPFのMediaElementを使ってmp4動画を再生できます。ただし、すべてのmp4ファイルが必ず再生できるわけではありません。mp4はコンテナ形式であり、内部の映像コーデックや音声コーデックによって再生可否が変わることがあります。

まずは一般的なmp4ファイルで試し、再生できない場合は別の動画ファイルでも確認しましょう。

10-2. WPFとWindows Formsのどちらで作るべき?

新しく動画再生アプリを作るなら、WPFがおすすめです。MediaElementを使えば、動画表示、ボタン、スライダー、テキスト表示をXAMLで整理しやすく、UIも作り込みやすいです。

既存のアプリがWindows Formsで作られている場合は、Windows Media Playerコントロールを使う方法もあります。既存画面に動画再生機能を追加したい場合は、Windows Forms版のほうが導入しやすいことがあります。

10-3. MediaElementでYouTube動画は再生できる?

MediaElementは、主にローカルファイルや直接アクセスできるメディアURIを再生するためのコントロールです。YouTubeのページURLをそのままSourceに指定しても、通常の動画ファイルのようには再生できません。

YouTube動画を扱いたい場合は、利用規約やAPIの制約を確認したうえで、公式の埋め込み方法やWebViewの利用を検討する必要があります。単純な動画ファイル再生とは別の実装になります。

10-4. 動画の一部だけを切り出して再生できる?

動画の一部だけを再生したい場合は、Positionで開始位置を指定し、タイマーで終了位置を監視する方法があります。

たとえば、10秒から20秒まで再生したい場合は、次のような考え方です。

C#
private TimeSpan _startPosition = TimeSpan.FromSeconds(10);
private TimeSpan _endPosition = TimeSpan.FromSeconds(20);

private void PlayPart()
{
VideoPlayer.Position = _startPosition;
VideoPlayer.Play();
}

private void Timer_Tick(object sender, EventArgs e)
{
if (VideoPlayer.Position >= _endPosition)
{
VideoPlayer.Pause();
}
}

ただし、これは「指定範囲だけ再生する」処理です。動画ファイル自体を切り出して保存するには、動画編集やエンコード処理が必要になります。

10-5. 商用アプリに動画再生機能を入れても問題ない?

商用アプリに動画再生機能を入れる場合は、利用する技術やライブラリのライセンスを確認する必要があります。WPFのMediaElementを使う場合でも、再生する動画の権利や配布方法、利用するコーデックの扱いには注意が必要です。

外部ライブラリを使う場合は、ライブラリ本体だけでなく、依存するネイティブライブラリのライセンスも確認しましょう。LibVLCSharpのような外部ライブラリを利用する場合は、公式ドキュメントやパッケージ情報を確認したうえで採用することが大切です。

10-6. 外部ライブラリを使うべきケースは?

外部ライブラリを使うべきケースは、標準機能だけでは要件を満たせない場合です。

たとえば、次のような場合はLibVLCSharpなどを検討するとよいです。

1. より多くの動画形式に対応したい
2. ストリーミング再生を扱いたい
3. 字幕を表示したい
4. 細かい再生制御をしたい
5. Windows以外の環境も視野に入れたい
6. 標準のMediaElementで再生できない動画が多い

一方で、学習目的や簡単な動画再生機能であれば、まずはWPFのMediaElementで十分です。最初から外部ライブラリを使うと、パッケージ管理や配布ファイルの確認など、学習範囲が広がりすぎることがあります。

まとめ

C#で動画再生を実装する方法はいくつかありますが、初心者にはWPFのMediaElementを使う方法がおすすめです。XAMLにMediaElementを配置し、C#コードからSourceを指定してPlay()を呼び出すだけで、基本的な動画再生を始められます。

ボタンを追加すれば、再生、一時停止、停止を制御できます。さらに、OpenFileDialogで動画ファイルを開く機能、音量調整、シークバー、再生時間表示、再生速度変更を追加すれば、シンプルな動画プレイヤーとして使えるアプリになります。

一方で、MediaElementは対応形式やコーデックの影響を受けることがあります。mp4ファイルでも再生できない場合があるため、より多くの形式に対応したい場合や、本格的な動画プレイヤーを作りたい場合は、LibVLCSharpなどの外部ライブラリも検討しましょう。

まずはWPFのMediaElementで基本を理解し、動画ファイルを開いて再生できるところまで実装してみてください。そのうえで、シークバー、フルスクリーン、ループ再生、プレイリストなどの機能を追加していけば、C#で実用的な動画再生アプリを作れるようになります。