Transkódování mediálních souborů

Můžete použít rozhraní API Windows.Media.Transcoding k převádění video souborů z jednoho formátu do jiného.

Překódování je převod digitálního mediálního souboru, jako je video nebo zvukový soubor, z jednoho formátu do druhého. Obvykle se to provádí dekódováním a opětovným kódováním souboru. Můžete například převést Windows Multimediální soubor na MP4, aby se mohl přehrávat na přenosném zařízení, které podporuje formát MP4. Nebo můžete převést videosoubor s vysokým rozlišením na nižší rozlišení. V takovém případě může překódovaný soubor použít stejný kodek jako původní soubor, ale měl by jiný profil kódování.

Výběr zdrojových a cílových souborů

Způsob, jakým vaše aplikace určuje zdrojové a cílové soubory pro překódování, závisí na vaší implementaci. Tento příklad používá FileOpenPicker a FileSavePicker, aby uživatel mohl vybrat zdroj a cílový soubor.

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

Vytvoření profilu kódování médií

Profil kódování obsahuje nastavení určující, jak bude cílový soubor kódován. Tady máte při transkódování souboru největší počet možností.

Třída MediaEncodingProfile poskytuje statické metody pro vytváření předdefinovaných profilů kódování:

Metody pro vytváření profilů kódování pouze pro zvuk

Metoda Profile
CreateAlac Zvuk Apple Lossless Audio Codec (ALAC)
CreateFlac Zvuk bezeztrátového zvukového kodeku (FLAC)
CreateM4a Zvuk AAC (M4A)
CreateMp3 Zvuk MP3
CreateWav Zvuk WAV
CreateWma Windows Media Audio (WMA)

Metody pro vytváření profilů kódování zvuku a videa

Metoda Profile
CreateAv1 Video AOMedia Video 1 (AV1)
CreateAvi formát AVI
CreateHevc Video s vysokou efektivitou kódování (HEVC), označované také jako video H.265
CreateMp4 Video MP4 (video H.264 plus zvuk AAC)
CreateVp9 Video VP9
CreateWmv Windows Media Video (WMV)

Následující kód vytvoří profil pro video MP4.

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

Static CreateMp4 metoda vytvoří profil kódování MP4. Parametr pro tuto metodu poskytuje cílové rozlišení videa. V tomto případě VideoEncodingQuality.hd720p znamená 1280 × 720 pixelů při 30 snímcích za sekundu. ("720p" je označení pro 720 progresivně snímaných řádků na snímek.) Všechny ostatní metody pro vytvoření předdefinovaných profilů postupují podle stejného vzorce.

Případně můžete vytvořit profil, který odpovídá existujícímu mediálnímu souboru pomocí metody MediaEncodingProfile.CreateFromFileAsync . Nebo pokud znáte přesně požadovaná nastavení kódování, můžete vytvořit nový objekt MediaEncodingProfile a vyplnit podrobnosti profilu.

Transkódování souboru

Pokud chcete překódovat soubor, vytvořte nový objekt MediaTranscoder a zavolejte metodu MediaTranscoder.PrepareFileTranscodeAsync. Předejte zdrojový soubor, cílový soubor a profil kódování. Potom zavolejte metodu TranscodeAsync na objektu PrepareTranscodeResult, který byl vrácen operací asynchronního transkódování.

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

Reakce na průběh překódování

Události můžete zaregistrovat tak, aby reagovaly, když se změní průběh asynchronní operace TranscodeAsync. Tyto události jsou součástí asynchronní programovací architektury pro Windows aplikace a nejsou specifické pro rozhraní API pro překódování.

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