Eseguire la transcodifica di file multimedialiTranscode media files

Puoi usare le API Windows.Media.Transcoding per transcodificare file video da un formato a un altro.You can use the Windows.Media.Transcoding APIs to transcode video files from one format to another.

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.Transcoding is the conversion of a digital media file, such as a video or audio file, from one format to another. Tale operazione implica in genere la decodifica e la ricodifica del file.This is usually done by decoding and then re-encoding the file. Puoi ad esempio convertire un file Windows Media in formato MP4 per poterlo riprodurre su un dispositivo portatile che supporta il formato MP4.For example, you might convert a Windows Media file to MP4 so that it can be played on a portable device that supports MP4 format. Puoi anche convertire un file video ad alta definizione in una risoluzione inferiore.Or, you might convert a high-definition video file to a lower resolution. In questo caso il file ricodificato può usare lo stesso codec del file originale, ma avere un profilo di codifica diverso.In that case, the re-encoded file might use the same codec as the original file, but it would have a different encoding profile.

Impostare il progetto per la transcodificaSet up your project for transcoding

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.In addition to the namespaces referenced by the default project template, you will need to reference these namespaces in order to transcode media files using the code in this article.

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

Selezionare i file di origine e di destinazioneSelect source and destination files

Il modo in cui l'app determina i file di origine e di destinazione per la codifica intermedia dipende dalla tua implementazione.The way that your app determines the source and destination files for transcoding depends on your implementation. In questo esempio vengono usati FileOpenPicker e FileSavePicker per consentire all'utente di selezionare un file di origine e di destinazione.This example uses a FileOpenPicker and a FileSavePicker to allow the user to pick a source and a destination file.

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 multimedialeCreate a media encoding profile

Il profilo di codifica contiene tutte le impostazioni relative alla modalità di codifica del file di destinazione.The encoding profile contains the settings that determine how the destination file will be encoded. Il profilo include il maggior numero di opzioni disponibili durante la codifica intermedia di un file.This is where you have the greatest number of options when you transcode a file.

La classe MediaEncodingProfile fornisce metodi statici per la creazione di profili di codifica predefiniti:The MediaEncodingProfile class provides static methods for creating predefined encoding profiles:

Metodi per la creazione di profili di codifica solo audioMethods for creating Audio-only encoding profiles

MetodoMethod ProfiloProfile
CreateAlacCreateAlac Audio codec audio lossless (ALAC) di AppleApple Lossless Audio Codec (ALAC) audio
CreateFlacCreateFlac Audio codec audio (FLAC) Lossless gratuito.Free Lossless Audio Codec (FLAC) audio.
CreateM4aCreateM4a Audio AAC (M4A)AAC audio (M4A)
CreateMp3CreateMp3 Audio MP3MP3 audio
CreateWavCreateWav Audio WAVWAV audio
CreateWmvCreateWmv Windows Media Audio (WMA)Windows Media Audio (WMA)

Metodi per la creazione di profili di codifica audio/videoMethods for creating audio / video encoding profiles

MetodoMethod ProfiloProfile
CreateAviCreateAvi AVIAVI
CreateHevcCreateHevc Video sulla codifica video ad alta efficienza (HEVC), noto anche come video H. 265High Efficiency Video Coding (HEVC) video, also known as H.265 video
CreateMp4CreateMp4 Video MP4 video (combinazione di video H.264 e audio AAC)MP4 video (H.264 video plus AAC audio)
CreateWmvCreateWmv Windows Media Video (WMV)Windows Media Video (WMV)

Il codice seguente consente di creare un profilo per il video MP4.The following code creates a profile for MP4 video.

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

Il metodo statico CreateMp4 crea un profilo di codifica MP4.The static CreateMp4 method creates an MP4 encoding profile. Il parametro di questo metodo specifica la risoluzione di destinazione del video.The parameter for this method gives the target resolution for the video. In questo caso VideoEncodingQuality.hd720p indica 1280 x 720 pixel a 30 fotogrammi al secondo.In this case, VideoEncodingQuality.hd720p means 1280 x 720 pixels at 30 frames per second. 720p indica 720 linee di scansione progressiva per fotogramma. Gli altri metodi per la creazione di profili predefiniti sono tutti basati su questo schema.("720p" stands for 720 progressive scan lines per frame.) The other methods for creating predefined profiles all follow this pattern.

In alternativa, puoi creare un profilo corrispondente a un file multimediale esistente usando il metodo MediaEncodingProfile.CreateFromFileAsync.Alternatively, you can create a profile that matches an existing media file by using the MediaEncodingProfile.CreateFromFileAsync method. In alternativa, se si conoscono le impostazioni di codifica esatte desiderate, è possibile creare un nuovo oggetto MediaEncodingProfile e specificare i dettagli del profilo.Or, if you know the exact encoding settings that you want, you can create a new MediaEncodingProfile object and fill in the profile details.

Transcodificare il fileTranscode the file

Per eseguire la transcodifica del file, creare un nuovo oggetto MediaTranscoder e chiamare il metodo MediaTranscoder. PrepareFileTranscodeAsync .To transcode the file, create a new MediaTranscoder object and call the MediaTranscoder.PrepareFileTranscodeAsync method. Passa il file di origine, il file di destinazione e il profilo di codifica.Pass in the source file, the destination file, and the encoding profile. Chiamare quindi il metodo TranscodeAsync sull'oggetto PrepareTranscodeResult restituito dall'operazione di transcodifica asincrona.Then call the TranscodeAsync method on the PrepareTranscodeResult object that was returned from the async transcode operation.

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 transcodificaRespond to transcoding progress

Puoi registrare eventi per rispondere quando cambia lo stato del metodo asincrono TranscodeAsync.You can register events to respond when the progress of the asynchronous TranscodeAsync changes. 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.These events are part of the async programming framework for Universal Windows Platform (UWP) apps and are not specific to the transcoding API.

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