Transcoder des fichiers multimédias
Vous pouvez utiliser les API Windows.Media.Transcoding pour transcoder des fichiers vidéo d’un format à un autre.
Le transcodage consiste à convertir un fichier multimédia numérique, tel qu’un fichier vidéo ou audio, d’un format à un autre. Cette opération est généralement effectuée en décodant, puis en recodant le fichier. Par exemple, vous pouvez convertir un fichier Windows Media en MP4 afin qu’il puisse être lu sur un appareil portable qui prend en charge le format MP4. Vous pouvez également convertir un fichier vidéo à haute définition en résolution inférieure. Dans ce cas, le fichier ré-encodé peut utiliser le même codec que le fichier d’origine, mais cela aurait un profil d’encodage différent.
Configurer votre projet pour le transcodage
Outre les espaces de noms référencés par le modèle de projet par défaut, vous devez référencer ces espaces de noms pour transcoder des fichiers multimédias en utilisant le code de cet article.
using Windows.Storage;
using Windows.Media.MediaProperties;
using Windows.Media.Transcoding;
Sélection des fichiers sources et de destination
La façon dont votre application détermine les fichiers source et de destination pour le transcodage dépend de votre implémentation. Cet exemple utilise un élément FileOpenPicker et un élément FileSavePicker pour permettre à l’utilisateur de choisir un fichier source et de destination.
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();
Créer un profil d’encodage multimédia
Le profil d’encodage contient les paramètres qui déterminent la façon dont le fichier de destination sera encodé. Dans cette partie vous disposez du plus grand nombre d’options lors du transcodage d’un fichier.
La classe MediaEncodingProfile fournit des méthodes statiques pour créer des profils d’encodage prédéfinis :
Méthodes de création de profils d’encodage audio uniquement
Method | Profil |
---|---|
CreateAlac | Codec audio Apple Lossless Audio (ALAC) |
CreateFlac | Codec audio Free Lossless Audio Codec (FLAC) |
CreateM4a | Audio AAC (M4A) |
CreateMp3 | Audio MP3 |
CreateWav | Audio WAV |
CreateWmv | Windows Media Audio (WMA) |
Méthodes de création de profils d’encodage audio/vidéo
Method | Profil |
---|---|
CreateAvi | AVI |
CreateHevc | Vidéo de codage vidéo haute efficacité (HEVC), également appelée vidéo H.265 |
CreateMp4 | Vidéo MP4 (vidéo H.264 plus audio AAC) |
CreateWmv | Windows Media Video (WMV) |
Le code suivant crée un profil pour la vidéo MP4.
MediaEncodingProfile profile =
MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD720p);
La méthode statique CreateMp4 crée un profil d’encodage MP4. Le paramètre de cette méthode donne la résolution cible de la vidéo. Dans ce cas, VideoEncodingQuality.hd720p signifie 1280 x 720 pixels à 30 images par seconde. (« 720p » correspond à 720 lignes de balayage progressives par image.) Les autres méthodes de création de profils prédéfinis suivent tous ce modèle.
Vous pouvez également créer un profil qui correspond à un fichier multimédia existant en utilisant la méthode MediaEncodingProfile.CreateFromFileAsync. Ou, si vous avez une idée précise des paramètres d’encodage que vous souhaitez utiliser, vous pouvez créer un objet MediaEncodingProfile et compléter les détails du profil.
Transcoder le fichier
Pour transcoder le fichier, créez un objet MediaTranscoder et appelez la méthode MediaTranscoder.PrepareFileTranscodeAsync. Transmettez le fichier source, le fichier de destination et le profil d’encodage. Appelez ensuite la méthode TranscodeAsync sur l’objet PrepareTranscodeResult qui a été renvoyé par l’opération de transcodage asynchrone.
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;
}
}
Répondre à la progression du transcodage
Vous pouvez enregistrer des événements pour répondre lorsque la progression de la asynchrone TranscodeAsync change. Ces événements font partie de l’infrastructure de programmation asynchrone pour les applications de plateforme Windows universelle (UWP) et ne sont pas spécifiques à l’API de transcodage.
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.
}
}