Transcodificar arquivos de mídia

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

Transcodificação é a conversão de um arquivo de mídia digital, como um arquivo de áudio ou vídeo, de um formato para outro. Isso geralmente é feito fazendo a decodificação e, em seguida, a recodificação do arquivo. Por exemplo, você pode converter um arquivo de mídia 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.

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 um FileSavePicker para permitir que o usuário escolha uma origem e um arquivo 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();

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 Profile
CreateAlac Áudio do ALAC (Apple Lossless Audio Codec)
CreateFlac Áudio FLAC (Codec de Áudio Sem Perdas Livre)
CreateM4a Áudio AAC (M4A)
CreateMp3 Áudio MP3
CreateWav Áudio WAV
CreateWma Windows Media Audio (WMA)

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

Método Profile
CreateAv1 vídeo AOMedia Video 1 (AV1)
CreateAvi AVI
CreateHevc Vídeo hevc (codificação de vídeo de alta eficiência), também conhecido como vídeo H.265
CreateMp4 Vídeo MP4 (vídeo H.264 mais áudio AAC)
CreateVp9 Vídeo VP9
CreateWmv vídeo de mídia Windows (WMV)

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

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

O método CreateMp4 estático cria um perfil de codificação 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 TranscodeAsync no objeto PrepareTranscodeResult que 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 serem acionados quando o progresso da operação assíncrona TranscodeAsync mudar. Esses eventos fazem parte da estrutura de programação assíncrona para aplicativos Windows 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.
    }
}