Vous pouvez utiliser les API Windows.Media.Transcoding pour transcoder des fichiers vidéo d’un format vers un autre.
Le transcodage consiste à convertir un fichier multimédia numérique, tel qu’un fichier vidéo ou audio, d’un format vers un autre. Lors de ce processus, le fichier est généralement décodé puis réencodé. Par exemple, vous pouvez souhaiter convertir un fichier Windows Media au format MP4 pour qu’il puisse être lu sur un appareil mobile qui prend en charge le format MP4. Ou encore, vous pouvez souhaiter convertir un fichier vidéo à haute définition en fichier de résolution inférieure. Dans ce cas, le fichier réencodé peut utiliser le même codec que le fichier d’origine, mais il aura 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 devrez référencer ces espaces de noms pour transcoder les fichiers multimédias en utilisant le code dans cet article.C#Copier
using Windows.Storage;
using Windows.Media.MediaProperties;
using Windows.Media.Transcoding;
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 élément FileOpenPicker et un élément FileSavePicker pour permettre à l’utilisateur de choisir un fichier source et de destination.C#Copier
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 le mode d’encodage du fichier de destination. C’est à ce stade du processus de transcodage d’un fichier que les options proposées sont les plus nombreuses.
La classe MediaEncodingProfile fournit des méthodes statiques pour la création de profils d’encodage prédéfinis:
Méthodes de création de profils d’encodage exclusif audio
Méthode | Profil |
---|---|
CreateAlac | Audio Apple Lossless Audio Codec (ALAC) |
CreateFlac | Audio Free Lossless Audio Codec (FLAC). |
CreateM4a | Audio AAC (M4A) |
CreateMp3 | Audio MP3 |
CreateWav | Audio WAV |
CreateWmv | Audio Windows Media (WMA) |
Méthodes de création de profils d’encodage audio/vidéo
Méthode | Profil |
---|---|
CreateAvi | AVI |
CreateHevc | Vidéo High Efficiency Video Coding (HEVC), également appelée vidéoH.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.C#Copier
MediaEncodingProfile profile =
MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD720p);
La méthode statique CreateMp4 permet de créer un profil d’encodage MP4. Le paramètre de cette méthode détermine la résolution cible de la vidéo. Dans ce cas, VideoEncodingQuality.hd720p signifie 1280x720pixels à 30images par seconde. («720p» correspond à un balayage progressif de 720lignes par image.) Les autres méthodes de création de profils prédéfinis suivent toutes ce modèle.
Une autre possibilité consiste à créer un profil qui correspond à un fichier multimédia existant à l’aide de la méthode MediaEncodingProfile.CreateFromFileAsync. Ou bien, si vous avez une idée précise des paramètres d’encodage que vous voulez 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.C#Copier
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 en cas de modification de la progression de l’élément TranscodeAsyncasynchrone. Ces événements font partie de l’infrastructure de programmation asynchrone pour les applications de plateforme Windows universelle (UWP) et ne sont pas propres à l’API de transcodage.C#Copier
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.
}
}
Encoder un flux de métadonnées
À compter de Windows 10, version 1803, vous pouvez inclure des métadonnées synchronisées lorsque le transcodage des fichiers multimédias. Contrairement aux exemples transcodage vidéo ci-dessus, qui utilisent le support intégré codage des méthodes de création du profil, comme MediaEncodingProfile.CreateMp4, vous devez créer manuellement le profil d’encodage des métadonnées pour prendre en charge le type d’encodage des métadonnées .
Cette première étape de création d’un profil d’incoding métadonnées consiste à créer un objet [TimedMetadataEncodingProperties] qui décrit l’encodage des métadonnées à transcoder. La propriété Subtype est un GUID qui spécifie le type de métadonnées. Les détails de codage pour chaque type de métadonnées est propriétaires et n’est pas fourni par Windows. Dans cet exemple, le GUID des métadonnées GoPro (gprs) est utilisé. Ensuite, SetFormatUserData est appelée pour définir un objet blob binaire de données décrivant le format de flux qui est spécifique au format de métadonnées. Ensuite, un TimedMetadataStreamDescriptor(https://docs.microsoft.com/uwp/api/windows.media.core.timedmetadatastreamdescriptor) est créé à partir des propriétés de codage, et le nom et un libellé de piste sont pour permettre à une application qui lit le flux endcoded pour identifier le flux de métadonnées et si vous le souhaitez afficher le nom de flux dans l’interface utilisateur.C#Copier
TimedMetadataEncodingProperties encodingProperties = new TimedMetadataEncodingProperties
{
Subtype = "{67706D64-BF10-48B4-BC18-593DC1DB950F}"
};
byte[] streamDescriptionData = GetStreamDescriptionDataForGpmdEncodingSubtype();
encodingProperties.SetFormatUserData(streamDescriptionData);
TimedMetadataStreamDescriptor descriptor = new TimedMetadataStreamDescriptor(encodingProperties)
{
Name = "GPS Info",
Label = "GPS Info"
};
Après avoir créé le TimedMetadataStreamDescriptor, vous pouvez créer un MediaEncodingProfile qui décrit la vidéo, audio et métadonnées d’encodage dans le fichier. Le TimedMetadataStreamDescriptor créé dans le dernier exemple est transmis dans cet exemple de fonction d’assistance et est ajouté à la MediaEncodingProfile en appelant la méthode SetTimedMetadataTracks.C#Copier
public MediaEncodingProfile CreateProfileForTranscoder(VideoStreamDescriptor videoStream1, VideoStreamDescriptor videoStream2, AudioStreamDescriptor audioStream, TimedMetadataStreamDescriptor timedMetadataStream)
{
ContainerEncodingProperties container = new ContainerEncodingProperties()
{
Subtype = MediaEncodingSubtypes.Mpeg4
};
MediaEncodingProfile profile = new MediaEncodingProfile()
{
Container = container
};
VideoStreamDescriptor encodingVideoStream1 = videoStream1.Copy();
encodingVideoStream1.EncodingProperties.Subtype = MediaEncodingSubtypes.H264;
encodingVideoStream1.Label = videoStream1.Name;
VideoStreamDescriptor encodingVideoStream2 = videoStream2.Copy();
encodingVideoStream2.EncodingProperties.Subtype = MediaEncodingSubtypes.H264;
encodingVideoStream2.Label = videoStream2.Name;
AudioStreamDescriptor encodingAudioStream = audioStream.Copy();
encodingAudioStream.EncodingProperties.Subtype = MediaEncodingSubtypes.Ac3;
encodingAudioStream.Label = audioStream.Name;
TimedMetadataStreamDescriptor encodingTimedMetadataStream = timedMetadataStream.Copy();
profile.SetTimedMetadataTracks(new TimedMetadataStreamDescriptor[] { encodingTimedMetadataStream });
profile.SetVideoTracks(new VideoStreamDescriptor[] { encodingVideoStream1, encodingVideoStream2 });
profile.SetAudioTracks(new AudioStreamDescriptor[] { encodingAudioStream });
return profile;
}