single.php

C# WinUI3 のMediaPlayerElementに動画の場所を追加しても再生されない場合の対処法

C# WinUI 3アプリを作っていく途中で、調べたことを忘録的に投稿します。今回はWinUI3プロジェクトで、MediaPlayerElementに動画のパス(場所)を追加しても実行時に読み込まれない場合の対処法です。

Sourceに動画の場所を受け渡す

基本的にはGridViewにテキストや画像を追加する手順と同じです。

Xaml内の[GridView]内に[MediaPlayerElement]を追加して[Source]プロパティに画像のリソースを設定すると以下のように画面に動画が読み込まれます。

<Grid Name="Video_Grid" Width="180" Height="160">
    <Grid.RowDefinitions>
        <RowDefinition Height="80" />
        <RowDefinition />
    </Grid.RowDefinitions>
    <MediaPlayerElement Source="H:\Users\t_nak\Videos\C0040.MP4"/>
    <TextBlock Text="{Binding Name}"/>
</Grid>

AutoPlay設定を有効

画面のように動画が読み込まれた状態で再生されない場合は[AutoPlay]プロパティを有効(True)にします。

動画の再生などを対話的に行うコントロールが無い場合には再生する手段が無いので、Xamlに記載するか実行時にC#のコード側で設定が必要です。

<Grid Name="Video_Grid" Width="180" Height="160">
    <Grid.RowDefinitions>
        <RowDefinition Height="80" />
        <RowDefinition />
    </Grid.RowDefinitions>
    <MediaPlayerElement Source="H:\Users\t_nak\Videos\C0040.MP4" AutoPlay="True"/>
    <TextBlock Text="{Binding Name}"/>
</Grid>

クラス変数でバインドしている場合

クラスを使って、コントロールに変数を設定している場合には動画ファイルのパスを設定しても読み込まれません。

例えば、Xamlの[Source]にバインドするための設定を追加して

<Grid Name="Video_Grid" Width="180" Height="160">
    <Grid.RowDefinitions>
        <RowDefinition Height="80" />
        <RowDefinition />
    </Grid.RowDefinitions>
    <MediaPlayerElement Source="{Binding MediaPath}" AutoPlay="True"/>
    <TextBlock Text="{Binding Name}"/>
</Grid>

バインドするためのクラスを追加します。

class VideoClass
{
  public string Name { get; set; }
  public string MediaPath { get; set; }
}

[VideoClass]クラスで、ファイル名と動画ファイルを追加していきます。

List<VideoClass> vlist = new List<VideoClass>();

public MainWindow()
{
  this.InitializeComponent();

  string sPath = @"H:\Users\t_nak\Videos\C0040.MP4";
  vlist.Add(new VideoClass() { Name = vf.Name, MediaPath = sPath });
  Videos.ItemsSource = vlist;
}

この状態で、実行しても動画が読み込まれません。

MediaSourceクラス変数で受け渡す

コード側で[MediaPlayerElement]の[Source]に動画を受け渡す場合には、ファイルへのパスではなく[MediaSource]クラス型の変数で設定します。

クラス定義の変数型を[MediaSource]に変更します。

class VideoClass
{
  public string Name { get; set; }
  public MediaSource MediaPath { get; set; }
}

実行時には、動画のパスから[MediaSource]型の変数を作成して受け渡します。

List<VideoClass> vlist = new List<VideoClass>();

public MainWindow()
{
  this.InitializeComponent();

  string sPath = @"H:\Users\t_nak\Videos\C0040.MP4";
  MediaSource ms = MediaSource.CreateFromUri(new Uri(sPath));
  vlist.Add(new VideoClass() { Name = vf.Name, MediaPath = ms});
  Videos.ItemsSource = vlist;
}

実行すると[MediaPlayerElement]に動画が読み込まれます。

まとめ

今回は短い記事ですが、Visual StudioのWinUI3プロジェクトで、MediaPlayerElementに動画のパス(場所)を追加しても実行時に読み込まれない場合の対処法について紹介しました。

Xamlに直接記述する場合には[Source]プロパティに動画ファイルの場所(パス)を入力すると実行時に動画が読み込まれます。

しかし、クラスを利用して動的に[MediaPlayerElement]に変数を受け渡すような場合には、[Source]プロパティにパスを入力しても実行時に読み込まれません。

[MediaSource]型の変数を用意して[MediaSource.CreateFromUri]などで動画ファイルの場所から[MediaSource]型の変数を受け渡す必要があります。

WinUI 3アプリで[MediaPlayerElement]に変数で動画ファイルへの場所を入力しても実行時に動画が読み込まれない人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です