Eseguire la transcodifica di file multimediali

È possibile usare il Windows. Media.Transcoding API per transcodificare i file video da un formato a un 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 multimediale Windows 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.

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 file di origine e di destinazione.

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

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

Method Profile
CreateAlac Audio con codec Apple Lossless (ALAC)
CreateFlac Audio AUDIO SENZA perdita di dati (FLAC)
CreareM4a Audio in formato AAC (M4A)
CreateMp3 Audio MP3
CreateWav Audio WAV
CreateWma Windows Media Audio (WMA)

Metodi per la creazione di profili di codifica audio/video

Method Profile
CreateAv1 AOMedia Video 1 (AV1) video
CreateAvi AVI
CreateHevc Video HEVC (High Efficiency Video Coding), noto anche come video H.265
CreateMp4 Video MP4 (video H.264 più audio AAC)
CreateVp9 Video VP9
CreateWmv Windows Media Video (WMV)

Il codice seguente crea un profilo per il video MP4.

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

Il metodo static CreateMp4 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 all'avanzamento della transcodifica

È possibile registrare eventi per rispondere quando cambia lo stato di avanzamento della transcodifica asincrona . Questi eventi fanno parte del framework di programmazione asincrona per le app Windows e non sono specifici 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.
    }
}