Transkode file media

Anda dapat menggunakan API Windows.Media.Transcoding untuk mentranskode file video dari satu format ke format lainnya.

Transcoding adalah konversi file media digital, seperti file video atau audio, dari satu format ke format lainnya. Ini biasanya dilakukan dengan mendekode dan kemudian mengodekan ulang file. Misalnya, Anda dapat mengonversi file Windows Media ke MP4 sehingga dapat diputar pada perangkat portabel yang mendukung format MP4. Atau, Anda dapat mengonversi file video definisi tinggi ke resolusi yang lebih rendah. Dalam hal ini, file yang dikodekan ulang mungkin menggunakan codec yang sama dengan file asli, tetapi akan memiliki profil pengodean yang berbeda.

Menyiapkan proyek Anda untuk transcoding

Selain namespace yang dirujuk oleh templat proyek default, Anda harus mereferensikan namespace layanan ini untuk mentranskode file media menggunakan kode dalam artikel ini.

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

Pilih file sumber dan tujuan

Cara aplikasi Anda menentukan file sumber dan tujuan untuk transcoding tergantung pada implementasi Anda. Contoh ini menggunakan FileOpenPicker dan FileSavePicker untuk memungkinkan pengguna memilih sumber dan file tujuan.

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

Membuat profil pengodean media

Profil pengodean berisi pengaturan yang menentukan bagaimana file tujuan akan dikodekan. Di sinilah Anda memiliki sejumlah besar opsi saat Anda melakukan transkode file.

Kelas MediaEncodingProfile menyediakan metode statis untuk membuat profil pengodean yang telah ditentukan sebelumnya:

Metode untuk membuat profil pengodean audio saja

Metode Profil
CreateAlac Audio Codec Audio Lossless (ALAC) Apple
CreateFlac Audio Free Lossless Audio Codec (FLAC).
BuatM4a Audio AAC (M4A)
BuatMp3 Audio MP3
BuatWav Audio WAV
BuatWmv Windows Media Audio (WMA)

Metode untuk membuat profil pengodean audio/video

Metode Profil
CreateAvi AVI
CreateHevc Video High Efficiency Video Coding (HEVC), juga dikenal sebagai video H.265
BuatMp4 Video MP4 (video H.264 ditambah audio AAC)
BuatWmv Windows Media Video (WMV)

Kode berikut membuat profil untuk video MP4.

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

Metode CreateMp4 statis membuat profil pengodean MP4. Parameter untuk metode ini memberikan resolusi target untuk video. Dalam hal ini, VideoEncodingQuality.hd720p berarti 1280 x 720 piksel pada 30 bingkai per detik. ("720p" adalah singkatan dari 720 baris pemindaian progresif per bingkai.) Metode lain untuk membuat profil yang telah ditentukan sebelumnya semuanya mengikuti pola ini.

Atau, Anda dapat membuat profil yang cocok dengan file media yang ada dengan menggunakan metode MediaEncodingProfile.CreateFromFileAsync. Atau, jika Anda mengetahui pengaturan pengodean yang tepat yang Anda inginkan, Anda dapat membuat objek MediaEncodingProfile baru dan mengisi detail profil.

Transkode file

Untuk mentranskode file, buat objek MediaTranscoder baru dan panggil metode MediaTranscoder.PrepareFileTranscodeAsync. Teruskan file sumber, file tujuan, dan profil pengodean. Kemudian panggil metode TranscodeAsync pada objek PrepareTranscodeResult yang dikembalikan dari operasi transcode asinkron.

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

Menanggapi kemajuan transcoding

Anda dapat mendaftarkan peristiwa untuk merespons ketika kemajuan TranscodeAsync asinkron berubah. Peristiwa ini adalah bagian dari kerangka kerja pemrograman asinkron untuk aplikasi Platform Windows Universal (UWP) dan tidak spesifik untuk API transcoding.

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