Transcodificar arquivos de mídia

Você pode usar as Windows.Media.Transcoding para transcodificar arquivos de vídeo de um formato para outro.

Transcodificação é a conversão de um arquivo de mídia digital como, por exemplo, um arquivo de vídeo ou de áudio, de um formato para outro. Isso geralmente é feito decodificação e, em seguida, recodificação do arquivo. Por exemplo, você pode converter um arquivo de Mídia do Windows em MP4 para que ele possa ser reproduzido em um dispositivo portátil que dê suporte ao formato MP4. Ou você pode converter um arquivo de vídeo de alta definição em uma resolução mais baixa. Nesse caso, o arquivo codificado novamente pode usar o mesmo codec que o arquivo original, mas ele teria um perfil de codificação diferente.

Configurar seu projeto para transcodificação

Além dos namespaces referenciados pelo modelo de projeto padrão, você precisará referenciar esses namespaces para transcodificar arquivos de mídia usando o código nesse artigo.

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

Selecionar arquivos de origem e de destino

A maneira como seu aplicativo determina os arquivos de origem e de destino para transcodificação depende da implementação. Este exemplo usa um FileOpenPicker e umFileSavePicker para permitir que o usuário escolha uma origem e um arquivo 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();

Criar um perfil de codificação de mídia

O perfil de codificação contém as configurações que determinam como o arquivo de destino será codificado. É aqui que você tem o maior número de opções ao transcodificar um arquivo.

A classe MediaEncodingProfile fornece métodos estáticos para criar perfis de codificação predefinidos:

Métodos para criar perfis de codificação somente áudio

Método Perfil
CreateAlac Codec de áudio Apple Lossless Audio Codec (ALAC)
CreateFlac Codec de áudio Free Lossless Audio Codec (FLAC).
CreateM4a Áudio AAC (M4A)
CreateMp3 Áudio MP3
CreateWav Áudio WAV
CreateWmv Windows Media Audio (WMA)

Métodos para criar perfis de codificação de áudio/vídeo

Método Perfil
CreateAvi AVI
CreateHevc Vídeo High Efficiency Video Coding (HEVC), também conhecido como vídeo H.265
CreateMp4 Vídeo MP4 (vídeo H.264 mais áudio AAC)
CreateWmv Windows Media Video (WMV)

O código a seguir cria um perfil para vídeo MP4.

MediaEncodingProfile profile =
    MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD720p);

O método estático CreateMp4 cria um perfil de codificação em MP4. O parâmetro para esse método fornece a resolução de destino para o vídeo. Nesse caso, VideoEncodingQuality.hd720p significa 1280 x 720 pixels a 30 quadros por segundo. ("720p" significa 720 linhas de verificação progressivas por quadro.) Os outros métodos para criar perfis predefinidos seguem esse padrão.

Como alternativa, você pode criar um perfil que corresponda a um arquivo de mídia existente usando o método MediaEncodingProfile.CreateFromFileAsync. Ou, se você souber as configurações exatas de codificação desejadas, poderá criar um novo objeto MediaEncodingProfile e preencher os detalhes do perfil.

Transcodificar o arquivo

Para transcodificar o arquivo, crie um novo objeto MediaTranscoder e chame o método MediaTranscoder.PrepareFileTranscodeAsync. Passe o arquivo de origem, o arquivo de destino e o perfil de codificação. Em seguida, chame o método TranscodeAsyncno objeto PrepareTranscodeResultque foi retornado da operação de transcodificação assíncrona.

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

Responder ao progresso da transcodificação

Você pode registrar eventos para responder quando o progresso do TranscodeAsyncassíncrono for alterado. Esses eventos fazem parte da estrutura de programação assíncrona para aplicativos da Plataforma Universal do Windows (UWP) e não são específicos para a API de transcodificação.

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