Windows.Media.Transcoding API を使用して、ビデオ ファイルをある形式から別の形式にトランスコードできます。
コード変換 とは、ビデオやオーディオ ファイルなどのデジタル メディア ファイルをある形式から別の形式に変換することです。 これは通常、ファイルのデコードと再エンコードによって行われます。 たとえば、mp4 形式をサポートするポータブル デバイスで再生できるように、Windows Media ファイルを MP4 に変換できます。 または、高解像度のビデオ ファイルを低解像度に変換することもできます。 その場合、再エンコードされたファイルは元のファイルと同じコーデックを使用する可能性がありますが、エンコード プロファイルは異なります。
ソース ファイルとコピー先ファイルを選択する
コード変換のソース ファイルと変換先ファイルをアプリで決定する方法は、実装によって異なります。 この例では、FileOpenPicker と FileSavePicker を使用して、ユーザーがソース ファイルとコピー先ファイルを選択できるようにします。
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.
}
}
Windows developer