Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Puede usar el Windows. Media.Transcoding API para transcodificar archivos de vídeo de un formato a otro.
La transcodificación es la conversión de un archivo multimedia digital, como un archivo de vídeo o audio, de un formato a otro. Normalmente, esto se realiza mediante la descodificación y, a continuación, vuelve a codificar el archivo. Por ejemplo, puede convertir un archivo multimedia de Windows a MP4 para que se pueda reproducir en un dispositivo portátil que admita el formato MP4. O bien, puede convertir un archivo de vídeo de alta definición en una resolución inferior. En ese caso, el archivo recodificado podría usar el mismo códec que el archivo original, pero tendría un perfil de codificación diferente.
Selección de archivos de origen y destino
La forma en que la aplicación determina los archivos de origen y destino para la transcodificación depende de la implementación. En este ejemplo se usa un FileOpenPicker y un FileSavePicker permitir al usuario elegir un origen y un archivo de destino.
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();
Creación de un perfil de codificación multimedia
El perfil de codificación contiene la configuración que determina cómo se codificará el archivo de destino. Aquí es donde tiene el mayor número de opciones al transcodificar un archivo.
La clase MediaEncodingProfile proporciona métodos estáticos para crear perfiles de codificación predefinidos:
Métodos para crear perfiles de codificación de solo audio
| Método | Profile |
|---|---|
| CreateAlac | audio en formato Apple Lossless Audio Codec (ALAC) |
| CreateFlac | audio en códec FLAC sin pérdida |
| CreateM4a | Audio en AAC (M4A) |
| CreateMp3 | audio en MP3 |
| CreateWav | Audio WAV |
| CreateWma | audio multimedia de Windows (WMA) |
Métodos para crear perfiles de codificación de audio y vídeo
| Método | Profile |
|---|---|
| CreateAv1 | Vídeo de AOMedia Video 1 (AV1) |
| CreateAvi | AVI |
| CreateHevc | Vídeo de codificación de vídeo de alta eficiencia (HEVC), también conocido como vídeo H.265 |
| CreateMp4 | Vídeo MP4 (vídeo H.264 más audio AAC) |
| CreateVp9 | Vídeo VP9 |
| CreateWmv | vídeo multimedia de Windows (WMV) |
El código siguiente crea un perfil para vídeo MP4.
MediaEncodingProfile profile =
MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD720p);
El método CreateMp4 estático crea un perfil de codificación MP4. El parámetro de este método proporciona la resolución de destino para el vídeo. En este caso, VideoEncodingQuality.hd720p significa 1280 x 720 píxeles a 30 fotogramas por segundo. ("720p" significa 720 líneas de examen progresivas por fotograma). Los demás métodos para crear perfiles predefinidos siguen este patrón.
Como alternativa, puede crear un perfil que coincida con un archivo multimedia existente mediante el método MediaEncodingProfile.CreateFromFileAsync . O bien, si conoce la configuración de codificación exacta que desea, puede crear un nuevo objeto MediaEncodingProfile y rellenar los detalles del perfil.
Transcodificación del archivo
Para transcodificar el archivo, cree un nuevo objeto MediaTranscoder y llame al método MediaTranscoder.PrepareFileTranscodeAsync. Pase el archivo de origen, el archivo de destino y el perfil de codificación. A continuación, llame al método TranscodeAsync en el objeto PrepareTranscodeResult que fue devuelto por la operación asincrónica de transcodificación.
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;
}
}
Respuesta al progreso de la transcodificación
Puede registrar eventos para responder a los cambios en el progreso de la operación asincrónica TranscodeAsync. Estos eventos forman parte del marco de programación asincrónico para Windows aplicaciones y no son específicos de la API de transcodificación.
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.
}
}