Idioma: HTML | XAML

Como cortar um arquivo de vídeo (XAML)

Applies to Windows and Windows Phone

O objeto MediaTranscoder pode ser usado para cortar um arquivo de mídia.

Neste exemplo, dois pontos de edição são definidos: um ponto inicial e um ponto final. Esses pontos de edição especificam os pontos de início e de término do vídeo de saída. O objeto MediaTranscoder produz como saída um arquivo com o mesmo perfil de codificação do arquivo de origem, mas com o vídeo cortado nos dois pontos de edição.

Este tutorial descreve como usar a classe FileOpenPicker para abrir um arquivo de vídeo do sistema, a classe MediaTranscoder para cortar o arquivo e, finalmente, a classe FileSavePicker para salvar o arquivo recém-codificado.

Para obter outro exemplo de transcodificação em um aplicativo do Tempo de Execução do Windows em C++, C# ou Visual Basic, veja o Exemplo de transcodificação de mídia.

Pré-requisitos

Este tópico presume que você é capaz de criar um aplicativo básico do Tempo de Execução do Windows em C++, C# ou Visual Basic. Para obter ajuda para criar seu primeiro aplicativo, veja Criar seu primeiro aplicativo da Windows Store em C# ou Visual Basic.

Instruções

Etapa 1: Criar um novo projeto

Inicie criando um projeto em branco no Microsoft Visual Studio.

Etapa 2: Selecione um arquivo de origem e crie um arquivo de destino.

Use a classe FileOpenPicker para selecionar um arquivo de origem e a classe FileSavePicker para criar o arquivo de destino. Defina as propriedades SuggestedStartLocation e FileTypeFilter no FileOpenPicker. No objeto FileSavePicker, defina as propriedades SuggestedStartLocation, DefaultFileExtension, SuggestedFileName e FileTypeChoices. Observe que esse método chama um método denominado TrimFile. Esse é um método definido pelo usuário que realiza a operação de transcodificação. Criaremos esse método na próxima etapa.

O aplicativo da Loja do Windows Phone deve usar pickSingleFileAndContinue.


async void TrimVideoFile()
{
    Windows.Storage.StorageFile source;
    Windows.Storage.StorageFile destination;

    var openPicker = new Windows.Storage.Pickers.FileOpenPicker();

    openPicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.VideosLibrary;
    openPicker.FileTypeFilter.Add(".wmv");
    openPicker.FileTypeFilter.Add(".mp4");

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

    destination = await savePicker.PickSaveFileAsync();

    // Method to perform the transcoding.
    TrimFile(source, destination);
}


Etapa 3: Inicializar MediaTranscoder

Crie um objeto MediaEncodingProfile chamando MediaEncodingProfile.CreateMp4. Em seguida, crie um objeto MediaTranscoder e defina a propriedade TrimStartTime para 1 segundo e a propriedade TrimStopTime para 9 segundos.


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

MediaTranscoder transcoder = new MediaTranscoder();

// Set the start of the trim.
transcoder.TrimStartTime = new TimeSpan(0, 0, 1);

// Set the end of the trim.
transcoder.TrimStopTime = new TimeSpan(0, 0, 9);


Etapa 4: Cortar o arquivo

Para cortar o arquivo, chame o método assíncrono PrepareFileTranscodeAsync e, em seguida, o método TranscodeAsync no objeto PrepareTranscodeResult.

Observe que o código neste exemplo chama um método denominado OutputText. Esse é um método auxiliar criado para enviar mensagens para a interface do usuário. O código para esse método é definido no final deste tópico.


async void TrimFile(StorageFile srcFile, StorageFile destFile)
{
    MediaEncodingProfile profile =
        MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD720p);

    MediaTranscoder transcoder = new MediaTranscoder();

    // Set the start of the trim.
    transcoder.TrimStartTime = new TimeSpan(0, 0, 1);

    // Set the end of the trim.
    transcoder.TrimStopTime = new TimeSpan(0, 0, 9);

    PrepareTranscodeResult prepareOp = await
        transcoder.PrepareFileTranscodeAsync(srcFile, destFile, 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:
                OutputText("Codec not found.");
                break;
            case TranscodeFailureReason.InvalidProfile:
                OutputText("Invalid profile.");
                break;
            default:
                OutputText("Unknown failure.");
                break;
        }
    }
}


Ao cortar um arquivo de mídia, não é necessário especificar um perfil de codificação no método PrepareFileTranscodeAsync. Se você omitir o perfil, o arquivo de destino terá o mesmo formato do arquivo de entrada.

Etapa 5: Enviar o progresso para a interface do usuário

Pode ser útil enviar o progresso e informações de status para a interface do usuário.


    <StackPanel Background="{StaticResource ApplicationPageBackgroundBrush}">
        <TextBlock Name="txtDisplay" Text="Display"></TextBlock>
        <TextBlock Name="txtProgress" Text="Progress"></TextBlock>
    </StackPanel>



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


Exemplo completo

O exemplo de código a seguir mostra a sequência completa de chamadas para uma operação de corte.

Em primeiro lugar, este é o código para abrir e salvar o arquivo.


async void TrimVideoFile()
{
    Windows.Storage.StorageFile source;
    Windows.Storage.StorageFile destination;

    var openPicker = new Windows.Storage.Pickers.FileOpenPicker();

    openPicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.VideosLibrary;
    openPicker.FileTypeFilter.Add(".wmv");
    openPicker.FileTypeFilter.Add(".mp4");

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

    destination = await savePicker.PickSaveFileAsync();

    // Method to perform the transcoding.
    TrimFile(source, destination);
}


Depois vem o código para transcodificar o arquivo.


async void TrimFile(StorageFile srcFile, StorageFile destFile)
{
    MediaEncodingProfile profile =
        MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD720p);

    MediaTranscoder transcoder = new MediaTranscoder();

    // Set the start of the trim.
    transcoder.TrimStartTime = new TimeSpan(0, 0, 1);

    // Set the end of the trim.
    transcoder.TrimStopTime = new TimeSpan(0, 0, 9);

    PrepareTranscodeResult prepareOp = await
        transcoder.PrepareFileTranscodeAsync(srcFile, destFile, 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:
                OutputText("Codec not found.");
                break;
            case TranscodeFailureReason.InvalidProfile:
                OutputText("Invalid profile.");
                break;
            default:
                OutputText("Unknown failure.");
                break;
        }
    }
}


Em seguida, aqui está o código para manipular o progresso da transcodificação, os erros e a conclusã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.
    }
}


Finalmente, estes são os objetos de interface do usuário para exibir mensagens de progresso e de status.


    <StackPanel Background="{StaticResource ApplicationPageBackgroundBrush}">
        <TextBlock Name="txtDisplay" Text="Display"></TextBlock>
        <TextBlock Name="txtProgress" Text="Progress"></TextBlock>
    </StackPanel>


Tópicos relacionados

Mapas
Mapa de aplicativos do Tempo de Execução do Windows em C# e Visual Basic
Mapa de aplicativos do Tempo de Execução do Windows em C++
Desenvolvendo UX para aplicativos
Adicionando multimídia
Exemplos
Exemplo de transcodificação de mídia
Exemplo de extensão de mídia
Exemplo de comunicação em tempo real
Tarefas
Guia de início rápido: transcodificando arquivos de vídeo
Referência
Windows.Media
Windows.Media.MediaProperties
Windows.Media.Transcoding
MediaTranscoder
PrepareTranscodeResult
TranscodeAsync
Outros recursos
Formatos de áudio e vídeo aceitos
Otimizar recursos de mídia

 

 

Mostrar:
© 2015 Microsoft