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