メディアファイルのトランスコード

Windows.Media.Transcoding API を使用して、ビデオ ファイルをある形式から別の形式にトランスコードできます。

コード変換 とは、ビデオやオーディオ ファイルなどのデジタル メディア ファイルをある形式から別の形式に変換することです。 これは通常、ファイルのデコードと再エンコードによって行われます。 たとえば、mp4 形式をサポートするポータブル デバイスで再生できるように、Windows Media ファイルを MP4 に変換できます。 または、高解像度のビデオ ファイルを低解像度に変換することもできます。 その場合、再エンコードされたファイルは元のファイルと同じコーデックを使用する可能性がありますが、エンコード プロファイルは異なります。

ソース ファイルとコピー先ファイルを選択する

コード変換のソース ファイルと変換先ファイルをアプリで決定する方法は、実装によって異なります。 この例では、FileOpenPickerFileSavePicker を使用して、ユーザーがソース ファイルとコピー先ファイルを選択できるようにします。

var openPicker = new Windows.Storage.Pickers.FileOpenPicker();

// Initialize the picker with the window handle (required for WinUI desktop apps).
var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(App.MainWindow);
WinRT.Interop.InitializeWithWindow.Initialize(openPicker, hwnd);

openPicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.VideosLibrary;
openPicker.FileTypeFilter.Add(".wmv");
openPicker.FileTypeFilter.Add(".mp4");

StorageFile source = await openPicker.PickSingleFileAsync();

var savePicker = new Windows.Storage.Pickers.FileSavePicker();

WinRT.Interop.InitializeWithWindow.Initialize(savePicker, hwnd);

savePicker.SuggestedStartLocation =
    Windows.Storage.Pickers.PickerLocationId.VideosLibrary;

savePicker.DefaultFileExtension = ".mp4";
savePicker.SuggestedFileName = "New Video";

savePicker.FileTypeChoices.Add("MPEG4", new string[] { ".mp4" });

StorageFile destination = await savePicker.PickSaveFileAsync();

メディア エンコード プロファイルを作成する

エンコード プロファイルには、変換先ファイルのエンコード方法を決定する設定が含まれています。 これは、ファイルをトランスコードするときに最も多くのオプションがある場所です。

MediaEncodingProfile クラスには、定義済みのエンコード プロファイルを作成するための静的メソッドが用意されています。

オーディオのみのエンコード プロファイルを作成する方法

Method Profile
CreateAlac Apple Lossless Audio Codec (ALAC) オーディオ
CreateFlac Free Lossless Audio Codec(FLAC)オーディオ
CreateM4a AAC オーディオ (M4A)
CreateMp3 MP3 オーディオ
CreateWav WAV オーディオ
CreateWma Windows メディア オーディオ (WMA)

オーディオ/ビデオ エンコード プロファイルを作成するためのメソッド

Method Profile
CreateAv1 AOMedia Video 1 (AV1) ビデオ
CreateAvi AVI
CreateHevc H.265 ビデオとも呼ばれる高効率ビデオ コーディング (HEVC) ビデオ
CreateMp4 MP4 ビデオ (H.264 ビデオと AAC オーディオ)
CreateVp9 VP9 ビデオ
CreateWmv Windows メディア ビデオ (WMV)

次のコードでは、MP4 ビデオのプロファイルを作成します。

MediaEncodingProfile profile =
    MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD720p);

静的 な CreateMp4 メソッドは、MP4 エンコード プロファイルを作成します。 このメソッドのパラメーターは、ビデオのターゲット解像度を指定します。 この場合、VideoEncodingQuality.hd720p は 30 フレーム/秒で 1280 x 720 ピクセルを意味します。 ("720p" は、フレームあたり 720 のプログレッシブ スキャン ラインを表します。定義済みのプロファイルを作成するためのその他の方法はすべて、このパターンに従います。

または、 MediaEncodingProfile.CreateFromFileAsync メソッドを使用して、既存のメディア ファイルと一致するプロファイルを作成することもできます。 または、必要なエンコード設定がわかっている場合は、新しい MediaEncodingProfile オブジェクトを作成し、プロファイルの詳細を入力します。

ファイルをトランスコードする

ファイルをトランスコードするには、新しい MediaTranscoder オブジェクトを作成し、MediaTranscoder.PrepareFileTranscodeAsync メソッドを呼び出します。 ソース ファイル、宛先ファイル、およびエンコード プロファイルを渡します。 次に、非同期トランスコード操作から返された TranscodeAsync メソッドを PrepareTranscodeResult オブジェクトで呼び出します。

MediaTranscoder transcoder = new MediaTranscoder();

PrepareTranscodeResult prepareOp = await
    transcoder.PrepareFileTranscodeAsync(source, destination, profile);

if (prepareOp.CanTranscode)
{
    var transcodeOp = prepareOp.TranscodeAsync();

    transcodeOp.Progress +=
        new AsyncActionProgressHandler<double>(TranscodeProgress);
    transcodeOp.Completed +=
        new AsyncActionWithProgressCompletedHandler<double>(TranscodeComplete);
}
else
{
    switch (prepareOp.FailureReason)
    {
        case TranscodeFailureReason.CodecNotFound:
            System.Diagnostics.Debug.WriteLine("Codec not found.");
            break;
        case TranscodeFailureReason.InvalidProfile:
            System.Diagnostics.Debug.WriteLine("Invalid profile.");
            break;
        default:
            System.Diagnostics.Debug.WriteLine("Unknown failure.");
            break;
    }
}

コード変換の進行状況に対応する

非同期 TranscodeAsync の進行状況が変化したときに応答するイベントを登録できます。 これらのイベントは、Windows アプリの非同期プログラミング フレームワークの一部であり、コード変換 API に固有ではありません。

void TranscodeProgress(IAsyncActionWithProgress<double> asyncInfo, double percent)
{
    // Display or handle progress info.
}

void TranscodeComplete(IAsyncActionWithProgress<double> asyncInfo, AsyncStatus status)
{
    asyncInfo.GetResults();
    if (asyncInfo.Status == AsyncStatus.Completed)
    {
        // Display or handle complete info.
    }
    else if (asyncInfo.Status == AsyncStatus.Canceled)
    {
        // Display or handle cancel info.
    }
    else
    {
        // Display or handle error info.
    }
}