Eseguire la transcodifica di file multimediali

Puoi usare le API Windows.Media.Transcoding per transcodificare file video da un formato a un altro.

Per codifica intermedia si intende la conversione di un file multimediale digitale, ad esempio un file video o audio, da un formato a un altro. Tale operazione implica in genere la decodifica e la ricodifica del file. Puoi ad esempio convertire un file Windows Media in formato MP4 per poterlo riprodurre su un dispositivo portatile che supporta il formato MP4. Puoi anche convertire un file video ad alta definizione in una risoluzione inferiore. In questo caso il file ricodificato può usare lo stesso codec del file originale, ma avere un profilo di codifica diverso.

Impostare il progetto per la transcodifica

Oltre agli spazi dei nomi a cui fa riferimento il modello di progetto predefinito, devi fare riferimento a questi spazi dei nomi per poter eseguire la transcodifica dei file multimediali usando il codice illustrato 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 codifica intermedia dipende dalla tua implementazione. In questo esempio vengono utilizzati fileOpenPicker e FileSavePicker per consentire all'utente di selezionare un file di 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 tutte le impostazioni relative alla modalità di codifica del file di destinazione. Il profilo include il maggior numero di opzioni disponibili durante la codifica intermedia 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 Audio Apple Lossless Audio Codec (ALAC)
CreateFlac Audio FLAC (Free Lossless Audio Codec).
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 (combinazione di video H.264 e audio AAC)
CreateWmv Windows Media Video (WMV)

Il codice seguente consente di creare un profilo per il video MP4.

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

Il metodo CreateMp4 statico crea un profilo di codifica MP4. Il parametro di questo metodo specifica la risoluzione di destinazione del video. In questo caso VideoEncodingQuality.hd720p indica 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 sono tutti basati su questo schema.

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

Transcodificare il file

Per transcodificare il file, creare un nuovo oggetto MediaTranscoder e chiamare il metodo MediaTranscoder.PrepareFileTranscodeAsync . Passa il file di origine, il file di destinazione e il profilo di codifica. Chiamare quindi il metodo TranscodeAsyncsull'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 della transcodifica

Puoi registrare eventi per rispondere quando cambia lo stato del metodo asincrono TranscodeAsync. Questi eventi fanno parte del framework di programmazione asincrona per le app UWP (Universal Windows Platform) e non sono specifici per l'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.
    }
}