Medya dosyalarını dönüştürme

Video dosyalarını bir biçimden diğerine dönüştürmek için Windows.Media.Transcoding API'lerini kullanabilirsiniz.

Kod dönüştürme , video veya ses dosyası gibi dijital bir medya dosyasının bir biçimden diğerine dönüştürülmesidir. Bu genellikle dosyanın kodunu çözerek ve sonra yeniden kodlayarak yapılır. Örneğin, mp4 biçimini destekleyen taşınabilir bir cihazda oynatılabilmesi için Windows Media dosyasını MP4'e dönüştürebilirsiniz. İsterseniz, yüksek tanımlı bir video dosyasını daha düşük bir çözünürlüğe dönüştürebilirsiniz. Bu durumda, yeniden kodlanmış dosya özgün dosyayla aynı codec bileşenini kullanabilir, ancak farklı bir kodlama profiline sahip olabilir.

Kaynak ve hedef dosyaları seçme

Uygulamanızın kod dönüştürme için kaynak ve hedef dosyaları belirleme şekli, uygulamanıza bağlıdır. Bu örnekte kullanıcının kaynak ve hedef dosya seçmesine izin vermek için FileOpenPicker ve FileSavePicker kullanılır.

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

Medya kodlama profili oluşturma

Kodlama profili, hedef dosyanın nasıl kodlanacağına karar veren ayarları içerir. Burası, bir dosyayı kodlarken en fazla seçenek sayısına sahip olduğunuz yerdir.

MediaEncodingProfile sınıfı önceden tanımlanmış kodlama profilleri oluşturmak için statik yöntemler sağlar:

Yalnızca ses kodlama profilleri oluşturma yöntemleri

Yöntem Profile
CreateAlac Apple Kayıpsız Ses Kodeği (ALAC) sesi
CreateFlac Ücretsiz Kayıpsız Ses Kodlayıcı/Çözücü (FLAC)
CreateM4a AAC ses (M4A)
CreateMp3 MP3 sesi
CreateWav WAV sesi
CreateWma Windows Medya Sesi (WMA)

Ses /video kodlama profilleri oluşturma yöntemleri

Yöntem Profile
CreateAv1 AOMedia Video 1 (AV1) videosu
CreateAvi AVI
CreateHevc H.265 video olarak da bilinen Yüksek Verimli Video Kodlama (HEVC) videosu
CreateMp4 MP4 video (H.264 video artı AAC ses)
CreateVp9 VP9 videosu
CreateWmv Windows Medya Videosu (WMV)

Aşağıdaki kod, MP4 videosu için bir profil oluşturur.

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

Statik CreateMp4 yöntemi bir MP4 kodlama profili oluşturur. Bu yöntemin parametresi video için hedef çözünürlüğü verir. Bu durumda VideoEncodingQuality.hd720p saniyede 30 karede 1280 x 720 piksel anlamına gelir. ("720p" kare başına 720 aşamalı tarama çizgisi anlamına gelir.) Önceden tanımlanmış profiller oluşturmaya yönelik diğer yöntemlerin tümü bu deseni izler.

Alternatif olarak, MediaEncodingProfile.CreateFromFileAsync yöntemini kullanarak mevcut bir medya dosyasıyla eşleşen bir profil oluşturabilirsiniz. İsterseniz, tam olarak istediğiniz kodlama ayarlarını biliyorsanız yeni bir MediaEncodingProfile nesnesi oluşturabilir ve profil ayrıntılarını doldurabilirsiniz.

Dosyayı dönüştürme

Dosyayı kodlamak için yeni bir MediaTranscoder nesnesi oluşturun ve MediaTranscoder.PrepareFileTranscodeAsync yöntemini çağırın. Kaynak dosyayı, hedef dosyayı ve kodlama profilini geçirin. Ardından, eşzamansız dönüştürme işleminden döndürülen PrepareTranscodeResult nesnesi üzerinde TranscodeAsync yöntemini çağırın.

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

Kod dönüştürme ilerlemesine yanıt verme

Zaman uyumsuz TranscodeAsync'in ilerleme durumu değiştiğinde yanıt vermek için olayları kaydedebilirsiniz. Bu olaylar, Windows uygulamaları için eşzamansız programlama çerçevesinin bir parçasıdır ve dönüştürme API'sine özgü değildir.

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