Eseguire la transcodifica di file multimediali

È possibile utilizzare le API Windows.Media.Transcoding per transcodificare i file video da un formato all'altro.

la transcodifica è la conversione di un file multimediale digitale, ad esempio un file video o audio, da un formato a un altro. Questa operazione viene in genere eseguita decodificando e quindi codificando nuovamente il file. Ad esempio, è possibile convertire un file Windows Media in MP4 in modo che possa essere riprodotto in un dispositivo portatile che supporta il formato MP4. In alternativa, è possibile convertire un file video ad alta definizione in una risoluzione inferiore. In tal caso, il file codificato di nuovo potrebbe usare lo stesso codec del file originale, ma avrebbe un profilo di codifica diverso.

Configurare il progetto per la realtà mista

Oltre agli spazi dei nomi a cui fa riferimento il modello di progetto predefinito, è necessario fare riferimento a questi spazi dei nomi per transcodificare i file multimediali usando il codice in questo articolo.

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

Selezionare i file di origine e di destinazione

Il modo in cui l'app determina i file di origine e di destinazione per la transcodifica a seconda dell'implementazione. Questo esempio usa un FileOpenPicker e un FileSavePicker per consentire all'utente di selezionare un'origine e un file di destinazione.

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

Creare un profilo di codifica multimediale

Il profilo di codifica contiene le impostazioni che determinano la modalità di codifica del file di destinazione. In questo caso si dispone del maggior numero di opzioni quando si esegue la transcodifica di un file.

La classe MediaEncodingProfile fornisce metodi statici per la creazione di profili di codifica predefiniti:

Metodi per la creazione di profili di codifica solo audio

Metodo Profilo
CreateAlac Apple Lossless Audio Codec (ALAC) audio
CreateFlac Free Lossless Audio Codec (FLAC) audio.
CreateM4a Audio AAC (M4A)
CreateMp3 Audio MP3
CreateWav Audio WAV
CreateWmv Windows Media Audio (WMA)

Metodi per la creazione di profili di codifica audio/video

Metodo Profilo
CreateAvi AVI
CreateHevc Video HEVC (High Efficiency Video Coding), noto anche come video H.265
CreateMp4 Video MP4 (video H.264 più audio AAC)
CreateWmv Windows Media Video (WMV)

Il codice seguente crea un profilo per il video MP4.

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

Il metodo CreateMp4 statico crea un profilo di codifica MP4. Il parametro per questo metodo fornisce la risoluzione di destinazione per il video. In questo caso, VideoEncodingQuality.hd720p significa 1280 x 720 pixel a 30 fotogrammi al secondo. ("720p" indica 720 linee di scansione progressiva per fotogramma). Gli altri metodi per la creazione di profili predefiniti seguono tutti questo modello.

In alternativa, è possibile creare un profilo corrispondente a un file multimediale esistente usando il metodo MediaEncodingProfile.CreateFromFileAsync. In alternativa, se si conoscono le impostazioni di codifica esatte desiderate, è possibile creare un nuovo oggetto MediaEncodingProfile e compilare i dettagli del profilo.

Transcodifica il file

Per transcodificare il file, creare un nuovo oggetto MediaTranscoder e chiamare il metodo MediaTranscoder.PrepareFileTranscodeAsync. Passare il file di origine, il file di destinazione e il profilo di codifica. Chiamare quindi il metodo TranscodeAsync sull'oggetto PrepareTranscodeResult restituito dall'operazione di transcodifica asincrona.

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

Rispondere allo stato di transcodifica

È possibile registrare gli eventi per rispondere quando lo stato di avanzamento dell' TranscodeAsync modifiche. Questi eventi fanno parte del framework di programmazione asincrona per le app UWP (Universal Windows Platform) e non sono specifiche dell'API di transcodifica.

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