C# WinUI 3アプリを作っていく途中で、調べたことを忘録的に投稿します。今回はWinUI3プロジェクトでLibVLCを使って動画を再生しようとした際に実行時に別画面で表示される場合の対処法です。
NuGetで[VideoLAN.LibVLC.Windows]追加
WinUIに対応しているアセンブリ[LibVLCSharp]と[VideoLAN.LibVLC.Windows]をインストールしておきます。
ウィンドウハンドルを変更
xaml.cs ファイルを編集して[LibVLCSharp.Shared.MediaPlayer]の[Hwnd]プロパティに、Xamlで作成されるウィンドウのハンドルを指定します。
public sealed partial class VideoPlayer : Window
{
private LibVLC? _libVLC;
private LibVLCSharp.Shared.MediaPlayer? _mediaPlayer;
private Media? _media;
public VideoPlayer()
{
InitializeComponent();
Core.Initialize();
_libVLC = new LibVLC();
_mediaPlayer = new LibVLCSharp.Shared.MediaPlayer(_libVLC);
_mediaPlayer.Hwnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
this.Activated += MainWindow_Activated;
this.Closed += MainWindow_Closed;
}
private void MainWindow_Activated(object sender, WindowActivatedEventArgs e)
{
if (_libVLC != null)
{
_media = new Media(_libVLC, @"sample.mp4", FromType.FromPath);
}
}
private void MainWindow_Closed(object sender, WindowEventArgs e)
{
_mediaPlayer?.Stop();
_mediaPlayer?.Dispose();
_libVLC?.Dispose();
}
}
実行するとXamlで作成したウィンドウ内に動画が再生されます。
エラーになる場合にはLoadedイベントに変更
実行時にエラーになる場合には[MainWindow_Activated]イベントの内容を[Loaded]イベントに変更します。
<Window ...
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vlc="clr-namespace:LibVLCSharp.WPF;assembly=LibVLCSharp.WPF"
>
<Grid Loaded="Grid_Loaded">
</Grid>
</Window>
private void Grid_Loaded(object sender, RoutedEventArgs e)
{
if (_libVLC != null)
{
_media = new Media(_libVLC, @"sample.mp4", FromType.FromPath);
}
}
まとめ
今回は、WinUI3プロジェクトでLibVLCを使って動画を再生しようとした際に実行時に別画面で表示される場合の対処法について紹介しました。
NuGetで用意されている[VideoLAN.LibVLC.Windows]を利用してXamlで作成したウィンドウで動画を再生するには[SwapChainPanel]コントロールを追加して、実行時にXamlで作成したウィンドウのハンドルを割り当てます。
WinUI 3 アプリでをLibVLCで動画を再生した際に別ウィンドウで表示されてしまう人の参考になれば幸いです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。

