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