Transkode berkas media

Anda dapat menggunakan Windows. API 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.

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

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

Buat 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 khusus audio

Metode Profile
CreateAlac Audio dengan codec Apple Lossless Audio Codec (ALAC)
CreateFlac audio Free Lossless Audio Codec (FLAC)
CreateM4a Audio AAC (M4A)
CreateMp3 Audio MP3
CreateWav Audio WAV
CreateWma Windows Media Audio (WMA)

Metode untuk membuat profil pengodean audio/video

Metode Profile
CreateAv1 Video AOMedia Video 1 (AV1)
CreateAvi AVI
CreateHevc Video HEVC (High Efficiency Video Coding), juga dikenal sebagai video H.265
CreateMp4 Video MP4 (video H.264 ditambah audio AAC)
CreateVp9 Video VP9
CreateWmv 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 dan mengisi detail profil.

Transkode berkas

Untuk mentranskode file, buat objek MediaTranscoder dan panggil MediaTranscoder.PrepareFileTranscodeAsync metode. Masukkan file sumber, file tujuan, dan profil pengodean. Kemudian panggil metode TranscodeAsync pada PrepareTranscodeResult objek 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 agar merespons saat progres operasi asinkron TranscodeAsync berubah. Peristiwa ini adalah bagian dari kerangka kerja pemrograman asinkron untuk aplikasi Windows 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.
    }
}