メディア ファイルのコード変換Transcode media files

Windows.Media.Transcoding API を使って、ビデオ ファイルをある形式から別の形式にコード変換できます。You can use the Windows.Media.Transcoding APIs to transcode video files from one format to another.

コード変換とは、デジタル メディア ファイル (ビデオ ファイルやオーディオ ファイル) の形式を別の形式に変換することです。Transcoding is the conversion of a digital media file, such as a video or audio file, from one format to another. 通常は、ファイルをデコードしてエンコードし直すことで行います。This is usually done by decoding and then re-encoding the file. たとえば、MP4 形式をサポートするポータブル デバイスで再生できるように、Windows Media ファイルを MP4 に変換できます。For example, you might convert a Windows Media file to MP4 so that it can be played on a portable device that supports MP4 format. また、高解像度のビデオ ファイルの解像度を下げることもできます。Or, you might convert a high-definition video file to a lower resolution. この場合、再エンコードしたファイルは元のファイルと同じコーデックを使うことがありますが、エンコード プロファイルは異なります。In that case, the re-encoded file might use the same codec as the original file, but it would have a different encoding profile.

プロジェクトをコード変換用にセットアップするSet up your project for transcoding

この記事のコードを使ってメディア ファイルのコード変換を行うには、既定のプロジェクト テンプレートによって参照される名前空間に加えて、これらの名前空間を参照する必要があります。In addition to the namespaces referenced by the default project template, you will need to reference these namespaces in order to transcode media files using the code in this article.

using Windows.Storage;
using Windows.Media.MediaProperties;
using Windows.Media.Transcoding;

変換元ファイルと変換先ファイルを選択するSelect source and destination files

アプリでコード変換の変換元ファイルと変換先ファイルを判別する方法は、実装によって異なります。The way that your app determines the source and destination files for transcoding depends on your implementation. この例では、FileOpenPickerFileSavePicker を使って、ユーザーが変換元ファイルと変換先ファイルを選べるようにします。This example uses a FileOpenPicker and a FileSavePicker to allow the user to pick a source and a destination file.

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

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();

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();

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

エンコード プロファイルには、変換先ファイルのエンコード方法を決めるための設定が含まれています。The encoding profile contains the settings that determine how the destination file will be encoded. ファイルをコード変換するときのオプションが最も多いのは、このエンコード プロファイルです。This is where you have the greatest number of options when you transcode a file.

MediaEncodingProfile クラスには、あらかじめ定義されたエンコード プロファイルを作るための静的メソッドが用意されています。The MediaEncodingProfile class provides static methods for creating predefined encoding profiles:

オーディオ専用のエンコード プロファイルを作成するメソッドMethods for creating Audio-only encoding profiles

メソッドMethod ProfileProfile
CreateAlacCreateAlac Apple Lossless Audio Codec (ALAC) オーディオApple Lossless Audio Codec (ALAC) audio
CreateFlacCreateFlac Free Lossless Audio Codec (FLAC) オーディオFree Lossless Audio Codec (FLAC) audio.
CreateM4aCreateM4a AAC オーディオ (M4A)AAC audio (M4A)
CreateMp3CreateMp3 MP3 オーディオMP3 audio
CreateWavCreateWav WAV オーディオWAV audio
CreateWmvCreateWmv Windows Media Audio (WMA)Windows Media Audio (WMA)

オーディオ/ビデオのエンコード プロファイルを作成するメソッドMethods for creating audio / video encoding profiles

メソッドMethod ProfileProfile
CreateAviCreateAvi AVIAVI
CreateHevcCreateHevc High Efficiency Video Coding (HEVC) ビデオ、H.265 ビデオとも呼ばれますHigh Efficiency Video Coding (HEVC) video, also known as H.265 video
CreateMp4CreateMp4 MP4 ビデオ (H.264 ビデオと AAC オーディオ)MP4 video (H.264 video plus AAC audio)
CreateWmvCreateWmv Windows Media Video (WMV)Windows Media Video (WMV)

次のコードでは、MP4 ビデオ用のプロファイルが作成されます。The following code creates a profile for MP4 video.

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

静的 CreateMp4 メソッドは、MP4 エンコード プロファイルを作ります。The static CreateMp4 method creates an MP4 encoding profile. このメソッドのパラメーターで、ビデオのターゲット解像度を指定します。The parameter for this method gives the target resolution for the video. この場合の VideoEncodingQuality.hd720p は、1280 x 720 ピクセルで 1 秒あたり 30 フレームであることを意味します In this case, VideoEncodingQuality.hd720p means 1280 x 720 pixels at 30 frames per second. ("720 p"の略フレームあたりの 720 プログレッシブ行です。)すべての定義済みプロファイルを作成するための他のメソッドでは、このパターンに従います。("720p" stands for 720 progressive scan lines per frame.) The other methods for creating predefined profiles all follow this pattern.

別の方法として、MediaEncodingProfile.CreateFromFileAsync メソッドを使って現在のメディア ファイルに一致するプロファイルを作成することもできます。Alternatively, you can create a profile that matches an existing media file by using the MediaEncodingProfile.CreateFromFileAsync method. または、必要なエンコード設定が正確にわかれば、新しい MediaEncodingProfile オブジェクトを作成してプロファイルの詳細を入力できます。Or, if you know the exact encoding settings that you want, you can create a new MediaEncodingProfile object and fill in the profile details.

ファイルのコード変換を行うTranscode the file

ファイルのコード変換を行うには、新しい MediaTranscoder オブジェクトを作成し、MediaTranscoder.PrepareFileTranscodeAsync メソッドを呼び出します。To transcode the file, create a new MediaTranscoder object and call the MediaTranscoder.PrepareFileTranscodeAsync method. ソース ファイル、出力先ファイル、エンコード プロファイルを渡します。Pass in the source file, the destination file, and the encoding profile. 次に、非同期コード変換操作から返された PrepareTranscodeResult オブジェクト上の TranscodeAsync メソッドを呼び出します。Then call the TranscodeAsync method on the PrepareTranscodeResult object that was returned from the async transcode operation.

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;
    }
}

コード変換の進行状況に対して応答するRespond to transcoding progress

非同期の TranscodeAsync の進行状況が変化したときに応答するイベントを登録できます。You can register events to respond when the progress of the asynchronous TranscodeAsync changes. これらのイベントは、ユニバーサル Windows プラットフォーム (UWP) アプリの非同期プログラミング フレームワークの一部であり、コード変換 API に固有のものではありません。These events are part of the async programming framework for Universal Windows Platform (UWP) apps and are not specific to the transcoding 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.
    }
}

メタデータ ストリームをエンコードするEncode a metadata stream

Windows 10、バージョン 1803、以降の時間指定メタデータを含めることができますとメディア ファイルをトランス コードします。Starting with Windows 10, version 1803, you can include timed metadata when transcoding media files. ビデオのトランス コードとは異なり上記の例、組み込みのメディアのエンコードを使用するプロファイルの作成方法、ような MediaEncodingProfile.CreateMp4メタデータのエンコードを手動で作成する必要がありますプロファイルがメタデータにエンコードの種類をサポートします。Unlike the video transcoding examples above, which use the built-in media encoding profile creation methods, like MediaEncodingProfile.CreateMp4, you must manually create the metadata encoding profile to support the type of metadata you are encoding.

メタデータ incoding プロファイルを作成するこの最初の手順が作成するには、 [TimedMetadataEncodingProperties] トランス コードするメタデータのエンコードを記述するオブジェクト。This first step in creating a metadata incoding profile is to create a [TimedMetadataEncodingProperties] object that describes the encoding of the metadata to be transcoded. サブタイプ プロパティは、メタデータの種類を指定する GUID です。The Subtype property is a GUID that specifies the type of the metadata. メタデータの種類ごとのエンコードの詳細については、専用 Windows によって提供されていません。The encoding details for each metadata type is proprietary and is not provided by Windows. この例では、GoPro メタデータ (gprs) の GUID が使用されます。In this example, the GUID for GoPro metadata (gprs) is used. 次に、 SetFormatUserData バイナリの blob のメタデータの形式に固有のストリームの形式を記述するデータを設定します。Next, SetFormatUserData is called to set a binary blob of data describing the stream format that is specific to the metadata format. 次に、 TimedMetadataStreamDescriptor(https://docs.microsoft.com/uwp/api/windows.media.core.timedmetadatastreamdescriptor)エンコードの対象のプロパティから作成され追跡ラベルと名前がメタデータのストリームを識別するために、エンコード形式のストリームを読み取るアプリケーションを許可して、必要に応じてUI には、ストリーム名を表示します。Next, a TimedMetadataStreamDescriptor(https://docs.microsoft.com/uwp/api/windows.media.core.timedmetadatastreamdescriptor) is created from the encoding properites, and a track label and name are to allow an application reading the endcoded stream to identify the metadata stream and optionally display the stream name in the UI.

TimedMetadataEncodingProperties encodingProperties = new TimedMetadataEncodingProperties
{
    Subtype = "{67706D64-BF10-48B4-BC18-593DC1DB950F}"
};
byte[] streamDescriptionData = GetStreamDescriptionDataForGpmdEncodingSubtype();
encodingProperties.SetFormatUserData(streamDescriptionData);

TimedMetadataStreamDescriptor descriptor = new TimedMetadataStreamDescriptor(encodingProperties)
{
    Name = "GPS Info",
    Label = "GPS Info"
};

作成した後、 TimedMetadataStreamDescriptor、作成することができます、 MediaEncodingProfileビデオ、オーディオ、およびファイルにエンコードするメタデータを記述します。After creating the TimedMetadataStreamDescriptor, you can create a MediaEncodingProfile that describes the video, audio, and metadata to be encoded in the file. TimedMetadataStreamDescriptor作成された最後の例はこの例のヘルパー関数に渡され、に追加されます、 MediaEncodingProfile呼び出して SetTimedMetadataTracksします。The TimedMetadataStreamDescriptor created in the last example is passed into this example helper function and is added to the MediaEncodingProfile by calling SetTimedMetadataTracks.

public MediaEncodingProfile CreateProfileForTranscoder(VideoStreamDescriptor videoStream1, VideoStreamDescriptor videoStream2, AudioStreamDescriptor audioStream, TimedMetadataStreamDescriptor timedMetadataStream)
{
    ContainerEncodingProperties container = new ContainerEncodingProperties()
    {
        Subtype = MediaEncodingSubtypes.Mpeg4
    };

    MediaEncodingProfile profile = new MediaEncodingProfile()
    {
        Container = container
    };


    VideoStreamDescriptor encodingVideoStream1 = videoStream1.Copy();
    encodingVideoStream1.EncodingProperties.Subtype = MediaEncodingSubtypes.H264;
    encodingVideoStream1.Label = videoStream1.Name;

    VideoStreamDescriptor encodingVideoStream2 = videoStream2.Copy();
    encodingVideoStream2.EncodingProperties.Subtype = MediaEncodingSubtypes.H264;
    encodingVideoStream2.Label = videoStream2.Name;

    AudioStreamDescriptor encodingAudioStream = audioStream.Copy();
    encodingAudioStream.EncodingProperties.Subtype = MediaEncodingSubtypes.Ac3;
    encodingAudioStream.Label = audioStream.Name;

    TimedMetadataStreamDescriptor encodingTimedMetadataStream = timedMetadataStream.Copy();

    profile.SetTimedMetadataTracks(new TimedMetadataStreamDescriptor[] { encodingTimedMetadataStream });
    profile.SetVideoTracks(new VideoStreamDescriptor[] { encodingVideoStream1, encodingVideoStream2 });
    profile.SetAudioTracks(new AudioStreamDescriptor[] { encodingAudioStream });
    return profile;
}