Transcoder des fichiers multimédias

Vous pouvez utiliser le Windows. Media.Transcoding API pour transcoder des fichiers vidéo d’un format à un autre.

Le transcodage est la conversion d’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 multimédia Windows 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 il aurait un profil d’encodage différent.

Sélectionner les fichiers source 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 FileOpenPicker et un FileSavePicker pour permettre à l’utilisateur de choisir une source et un fichier de destination.

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

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é. C’est là que vous avez le plus grand nombre d’options lorsque vous transcodez 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

Méthode Profil
CreateAlac Audio ALAC (Apple Lossless Audio Codec)
CreateFlac Audio sans perte gratuite (AUDIO CODEC)
CreateM4a Audio AAC (M4A)
CreateMp3 Audio MP3
CreateWav Audio WAV
CreateWma Windows Media Audio (WMA)

Méthodes de création de profils d’encodage audio/vidéo

Méthode Profil
CreateAv1 Vidéo AOMedia 1 (AV1)
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 et audio AAC)
CreateVp9 Vidéo VP9
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 CreateMp4 statique 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 trame.) 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 à l’aide de la méthode MediaEncodingProfile.CreateFromFileAsync . Ou, si vous connaissez les paramètres d’encodage exacts souhaités, vous pouvez créer un objet MediaEncodingProfile et renseigner les détails du profil.

Transcodez 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é retourné à partir de l’opération de transcode 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 inscrire des événements pour répondre lorsque la progression de la transcodeAsync asynchrone change. Ces événements font partie de l’infrastructure de programmation asynchrone pour les applications Windows 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.
    }
}