Transkoda mediefiler

Du kan använda Windows. Media.Transcoding API:er för att omkoda videofiler från ett format till ett annat.

Omkodning är konverteringen av en digital mediefil, till exempel en video- eller ljudfil, från ett format till ett annat. Detta görs vanligtvis genom att avkoda och sedan koda om filen. Du kan till exempel konvertera en Windows Media-fil till MP4 så att den kan spelas upp på en bärbar enhet som stöder MP4-format. Eller så kan du konvertera en hd-videofil till en lägre upplösning. I så fall kan den omkodade filen använda samma codec som den ursprungliga filen, men den skulle ha en annan kodningsprofil.

Välj käll- och målfiler

Hur appen avgör käll- och målfilerna för transkodning beror på implementeringen. I det här exemplet används en FileOpenPicker och en FileSavePicker så att användaren kan välja en källa och en målfil.

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

Skapa en mediekodningsprofil

Kodningsprofilen innehåller de inställningar som avgör hur målfilen ska kodas. Det är här du har det största antalet alternativ när du omkodar en fil.

Klassen MediaEncodingProfile innehåller statiska metoder för att skapa fördefinierade kodningsprofiler:

Metoder för att skapa kodningsprofiler för endast ljud

Metod Profile
CreateAlac Ljud från Apple Lossless Audio Codec (ALAC)
SkapaFlac Free Lossless Audio Codec (FLAC)-ljud
CreateM4a AAC-ljud (M4A)
CreateMp3 MP3-ljud
CreateWav WAV-ljud
CreateWma Windows Media Audio (WMA)

Metoder för att skapa ljud-/videokodningsprofiler

Metod Profile
CreateAv1 AOMedia Video 1-video (AV1)
CreateAvi AVI
CreateHevc Videokodning med hög effektivitet (HEVC), även känd som H.265-video
CreateMp4 MP4-video (H.264-video plus AAC-ljud)
CreateVp9 VP9-video
CreateWmv Windows Media Video (WMV)

Följande kod skapar en profil för MP4-video.

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

Den statiska Metoden CreateMp4 skapar en MP4-kodningsprofil. Parametern för den här metoden anger videons målupplösning. I det här fallet innebär VideoEncodingQuality.hd720p 1280 x 720 bildpunkter med 30 bildrutor per sekund. ("720p" står för 720 progressiva genomsökningslinjer per bildruta.) De andra metoderna för att skapa fördefinierade profiler följer alla det här mönstret.

Du kan också skapa en profil som matchar en befintlig mediefil med hjälp av metoden MediaEncodingProfile.CreateFromFileAsync . Om du känner till de exakta kodningsinställningarna kan du skapa ett nytt MediaEncodingProfile objekt och fylla i profilinformationen.

Omkoda filen

Om du vill omkoda filen skapar du ett nytt objekt MediaTranscoder och anropar metoden MediaTranscoder.PrepareFileTranscodeAsync. Skicka in källfilen, målfilen och kodningsprofilen. Anropa sedan metoden TranscodeAsync på metoden PrepareTranscodeResult som returnerades från transcode-åtgärden async.

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

Svara på omkodningsförloppet

Du kan registrera händelser för att svara när förloppet för den asynkrona TranscodeAsync ändras. Dessa händelser är en del av asynkront programmeringsramverk för Windows appar och är inte specifika för omkodnings-API:et.

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