Share via


Transkodieren von Mediendateien

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

Bei der Transcodierung handelt es sich um die Konvertierung einer digitalen Mediendatei (z. B. eine Video- oder Audiodatei) aus 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 Media-Datei in eine MP4-Datei konvertieren, sodass sie auf einem tragbaren Gerät wiedergegeben werden kann, das das MP4-Format unterstützt. Sie können auch eine hochauflösende Videodatei (High Definition, HD) in eine niedrigere Auflösung konvertieren. In diesem Fall verwendet die neu codierte Datei möglicherweise denselben Codec wie die Originaldatei, hat aber ein anderes Codierungsprofil.

Einrichten Ihres Projekts für die Transcodierung

Zusätzlich zu den Namespaces, auf die von der Standardprojektvorlage verwiesen wird, müssen Sie auf die folgenden Namespaces verweisen, um Mediendateien mithilfe des Codes in diesem Artikel zu transcodieren.

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

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 werden FileOpenPicker und FileSavePicker verwendet, damit Benutzer*innen eine Quelldatei und eine Zieldatei auswählen können.

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

Erstellen eines Mediencodierungsprofil

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

Die MediaEncodingProfile-Klasse stellt statische Methoden zum Erstellen vordefinierter Codierungsprofile bereit:

Methoden zum Erstellen von reinen Audiocodierungsprofilen

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

Methoden zum Erstellen von Audio-/Videocodierungsprofilen

Methode Profil
CreateAvi AVI
CreateHevc High Efficiency Video Coding (HEVC) Video, auch bekannt als H.265-Video
CreateMp4 MP4-Video (H.264-Video plus AAC-Audio)
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 1.280 x 720 Pixel bei 30 BpS (Bildern pro Sekunde). („720p“ steht für 720 progressive Scanzeilen pro Bild.) Alle anderen Methoden zum Erstellen vordefinierter Profile folgen diesem Muster.

Alternativ können Sie ein Profil erstellen, das einer vorhandenen Mediendatei entspricht, indem Sie die MediaEncodingProfile.CreateFromFileAsync-Methode verwenden. Wenn Sie die gewünschten Codierungseinstellungen genau 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 MediaTranscoder-Objekt, und rufen Sie die MediaTranscoder.PrepareFileTranscodeAsync-Methode auf. Übergeben Sie die Quelldatei, die Zieldatei und das Codierungsprofil. Rufen Sie dann die TranscodeAsync-Methode für das PrepareTranscodeResult-Objekt auf, das vom 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 den Transcodierungsstatus

Sie können Ereignisse registrieren, um zu reagieren, wenn sich der Status des asynchronen TranscodeAsync-Vorgangs ändert. Diese Ereignisse sind Teil des asynchronen Programmierframeworks für UWP-Apps (Universelle Windows-Plattform) und 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.
    }
}