Transkodieren von Mediendateien

Sie können die Windows.Media.Transcoding-APIs verwenden, um Videodateien von einem Format in ein anderes zu transkodieren.

Transcodierung ist die Konvertierung einer digitalen Mediendatei, z. B. einer Video- oder Audiodatei, von einem Format in ein anderes. Dies erfolgt in der Regel durch Decodieren und anschließendes erneutes Codieren der Datei. Sie können beispielsweise eine Windows Mediendatei in MP4 konvertieren, sodass sie auf einem tragbaren Gerät wiedergegeben werden kann, das das MP4-Format unterstützt. Oder Sie können eine Hd-Videodatei in eine niedrigere Auflösung konvertieren. In diesem Fall verwendet die neu codierte Datei möglicherweise denselben Codec wie die Originaldatei, aber sie hätte ein anderes Codierungsprofil.

Auswählen von Quell- und Zieldateien

Die Art und Weise, wie Ihre App die Quell- und Zieldateien für die Transcodierung bestimmt, hängt von Ihrer Implementierung ab. In diesem Beispiel wird ein FileOpenPicker und eine FileSavePicker verwendet, damit der Benutzer eine Quell- und Zieldatei auswählen kann.

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

Erstellen eines Mediencodierungsprofils

Das Codierungsprofil enthält die Einstellungen, die bestimmen, wie die Zieldatei codiert wird. Hier haben Sie beim Transcodieren einer Datei die größte Anzahl von Optionen.

Die klasse MediaEncodingProfile stellt statische Methoden zum Erstellen vordefinierter Codierungsprofile bereit:

Methoden zum Erstellen von Nur-Audio-Codierungsprofilen

Methode Profile
CreateAlac Apple Lossless Audio Codec (ALAC)-Audio
CreateFlac Free Lossless Audio Codec (FLAC)-Audio
CreateM4a AAC-Audio (M4A)
CreateMp3 MP3-Audio
CreateWav WAV-Audio
CreateWma Windows Media Audio (WMA)

Methoden zum Erstellen von Audio-/Videocodierungsprofilen

Methode Profile
CreateAv1 AOMedia Video 1 (AV1)-Video
CreateAvi AVI
CreateHevc High Efficiency Video Coding (HEVC)-Video, auch bekannt als H.265-Video
CreateMp4 MP4-Video (H.264-Video plus AAC-Audio)
CreateVp9 VP9 Video
CreateWmv Windows Media Video (WMV)

Der folgende Code erstellt ein Profil für MP4-Video.

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

Die statische CreateMp4-Methode erstellt ein MP4-Codierungsprofil. Der Parameter für diese Methode gibt die Zielauflösung für das Video an. In diesem Fall bedeutet VideoEncodingQuality.hd720p 1280 x 720 Pixel bei 30 Frames pro Sekunde. ("720p" steht für 720 progressive Scanlinien pro Frame.) Die anderen Methoden zum Erstellen vordefinierter Profile folgen diesem Muster.

Alternativ können Sie ein Profil erstellen, das mit einer vorhandenen Mediendatei übereinstimmt, indem Sie die MediaEncodingProfile.CreateFromFileAsync-Methode verwenden. Wenn Sie die gewünschten Codierungseinstellungen kennen, können Sie auch ein neues MediaEncodingProfile-Objekt erstellen und die Profildetails ausfüllen.

Transcodieren der Datei

Erstellen Sie zum Transcodieren der Datei ein neues MediaTranscoderobjekt, und rufen Sie die methode MediaTranscoder.PrepareFileTranscodeAsync auf. Übergeben Sie die Quelldatei, die Zieldatei und das Codierungsprofil. Rufen Sie dann die Methode TranscodeAsync für das PrepareTranscodeResult-Objekt auf, das von dem asynchronen Transcodierungsvorgang zurückgegeben wurde.

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

Reagieren auf transcodierungsfortschritt

Sie können Ereignisse registrieren, um zu reagieren, wenn sich der Fortschritt der asynchronen TranscodeAsync ändert. Diese Ereignisse sind Teil des asynchronen Programmierframeworks für Windows-Apps und sind nicht spezifisch für die Transcodierungs-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.
    }
}