Transcodificar archivos multimedia

Puedes usar las API de Windows.Media.Transcoding 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. Esto suele hacerse descodificando y volviendo a codificar el archivo. Por ejemplo, puede convertir un archivo de Windows Media 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 a 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.

Configurar el proyecto para la transcodificación

Además de los espacios de nombres a los que hace referencia la plantilla de proyecto predeterminada, deberá hacer referencia a estos espacios de nombres para transcodificar archivos multimedia mediante el código de este artículo.

using Windows.Storage;
using Windows.Media.MediaProperties;
using Windows.Media.Transcoding;

Seleccionar 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 para permitir al usuario elegir un origen y un archivo de destino.

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

Crear 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

Method Profile
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 Windows Media Audio (WMA)

Métodos para crear perfiles de codificación de audio y vídeo

Method Profile
CreateAvi AVI
CreateHevc Vídeo High Efficiency Video Coding (HEVC), también conocido como vídeo H.265
CreateMp4 Vídeo MP4 (vídeo H.264 más audio AAC)
CreateWmv Vídeo de Windows Media (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.

Transcodificar el 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 se devolvió desde la operación de transcodificación asincrónica.

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 cuando cambie el progreso de TranscodeAsync asincrónico. Estos eventos forman parte del marco de programación asincrónico para aplicaciones de la Plataforma universal de Windows (UWP) 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.
    }
}