UWP で動画ファイルの情報を取得する

◆ はじめに

流行っていないのは知っている。でも、UWP で動画処理したいんだ…。
ということで、今回は、Windows 10 API を使用して、動画ファイルのメタデータを解析してみた。

◆ やり方

ざっと調べると 2 つくらい解析方法がある。

  1. StorageFile から VideoProperties を取得
  2. StorageFile から MediaEncodingProfile を取得

1. StorageFile から VideoProperties を取得

StorageFile で動画ファイルを読み込んで、Properties.GetVideoPropertiesAsync でプロパティ取得する。あら簡単。
まぁこれっすよ。

using System;
using System.Diagnostics;
using Windows.Storage.Pickers;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace App1
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            InitializeComponent();
            Button1.Click += Button1_Click;
        }

        private async void Button1_Click(object sender, RoutedEventArgs e)
        {
            var picker = new FileOpenPicker();
            var file = await picker.PickSingleFileAsync();
            if (file == null)
            {
                return;
            }

            var videoProperty = await file.Properties.GetVideoPropertiesAsync();

            Trace.WriteLine(videoProperty.Width);
            Trace.WriteLine(videoProperty.Height);
            Trace.WriteLine(videoProperty.Duration);
            Trace.WriteLine(videoProperty.Orientation);
        }
    }
}

FileOpenPicker に FileTypeFilter を指定しないとなぜかクラッシュするので注意。
ドキュメントバグらしい。そういうとこやぞ。

2. StorageFile から MediaEncodingProfile を取得

ちょっと変化球っぽいけど、動画のエンコード用のプロパティを StorageFile から生成することができる。このエンコード用のプロパティに動画の情報が入っているのでそれを利用する方法。VideoProperty では取得できない情報もあるので、取ってきたいプロパティ次第かな、という印象。音声のありなしも Audio をプロパティが null かどうかで判定できたりする。

using System;
using System.Diagnostics;
using Windows.Media.MediaProperties;
using Windows.Storage.Pickers;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace App1
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            InitializeComponent();
            Button2.Click += Button2_Click;
        }

        private async void Button2_Click(object sender, RoutedEventArgs e)
        {
            var picker = new FileOpenPicker();
            picker.FileTypeFilter.Add("*");
            var file = await picker.PickSingleFileAsync();
            if (file == null)
            {
                return;
            }

            var mediaEncodingProfile = await MediaEncodingProfile.CreateFromFileAsync(file);

            Trace.WriteLine(mediaEncodingProfile.Video.Width);
            Trace.WriteLine(mediaEncodingProfile.Video.Height);
            Trace.WriteLine(mediaEncodingProfile.Video.Bitrate);
            Trace.WriteLine(mediaEncodingProfile.Video.FrameRate);
        }
    }
}

◆ まとめ

FFmpeg を使う必要なんてなかった。UWP、もとい Windows 10 API は有能。
あと、UWP の情報は、MS の公式ドキュメントか、MS の Github、stack overflow しかないので注意(言い過ぎ


UWP

2020-02-01 14:00 +0000