Transkodowanie plików multimedialnych

Możesz używać interfejsów API Windows.Media.Transcoding do transkodowania plików wideo z jednego formatu na inny.

Transkodowanie to konwersja pliku multimediów cyfrowych, takiego jak plik wideo lub audio, z jednego formatu na inny. Zwykle odbywa się to przez dekodowanie, a następnie ponowne kodowanie pliku. Na przykład można przekonwertować plik Windows Media na MP4, aby można było go odtworzyć na urządzeniu przenośnym obsługującym format MP4. Możesz też przekonwertować plik wideo o wysokiej rozdzielczości na niższą rozdzielczość. W takim przypadku plik ponownie zakodowany może używać tego samego koderaka co oryginalny plik, ale miałby inny profil kodowania.

Wybieranie plików źródłowych i docelowych

Sposób określania przez aplikację plików źródłowych i docelowych do transkodowania zależy od implementacji. W tym przykładzie użyto FileOpenPicker i FileSavePicker, aby umożliwić użytkownikowi wybranie źródła i pliku docelowego.

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

Tworzenie profilu kodowania multimediów

Profil kodowania zawiera ustawienia określające sposób kodowania pliku docelowego. W tym miejscu istnieje największa liczba opcji podczas transkodowania pliku.

Klasa MediaEncodingProfile udostępnia metody statyczne tworzenia wstępnie zdefiniowanych profilów kodowania:

Metody tworzenia profilów kodowania wyłącznie audio

Metoda Profile
CreateAlac Dźwięk w kodeku Apple Lossless Audio Codec (ALAC)
CreateFlac dźwięk w formacie Free Lossless Audio Codec (FLAC)
CreateM4a Dźwięk AAC (M4A)
CreateMp3 Dźwięk MP3
CreateWav Dźwięk WAV
UtwórzWma Windows Media Audio (WMA)

Metody tworzenia profilów kodowania audio/wideo

Metoda Profile
CreateAv1 Wideo AOMedia Video 1 (AV1)
CreateAvi AVI
CreateHevc Wideo o wysokiej wydajności kodowania wideo (HEVC), znane również jako wideo H.265
CreateMp4 Wideo MP4 (wideo H.264 i dźwięk AAC)
CreateVp9 Wideo VP9
CreateWmv Windows Media Video (WMV)

Poniższy kod tworzy profil dla wideo MP4.

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

Statyczna metoda CreateMp4 tworzy profil kodowania MP4. Parametr dla tej metody daje docelową rozdzielczość wideo. W tym przypadku VideoEncodingQuality.hd720p oznacza 1280 x 720 pikseli na 30 klatek na sekundę. ("720p" oznacza 720 progresywnych linii skanowania na ramkę). Inne metody tworzenia wstępnie zdefiniowanych profilów są zgodne z tym wzorcem.

Alternatywnie można utworzyć profil zgodny z istniejącym plikiem multimedialnym przy użyciu metody MediaEncodingProfile.CreateFromFileAsync . Jeśli znasz dokładnie żądane ustawienia kodowania, możesz utworzyć nowy obiekt MediaEncodingProfile i wypełnić szczegóły profilu.

Transkodowanie pliku

Aby transkodować plik, utwórz nowy obiekt MediaTranscoder i wywołaj metodę MediaTranscoder.PrepareFileTranscodeAsync. Przekaż plik źródłowy, plik docelowy i profil kodowania. Następnie wywołaj metodę TranscodeAsync na obiekcie PrepareTranscodeResult, zwróconym przez asynchroniczną operację transkodowania.

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

Reagowanie na postęp transkodowania

Możesz zarejestrować zdarzenia, aby reagować, gdy zmienia się postęp asynchronicznej operacji TranscodeAsync. Te zdarzenia są częścią struktury programowania asynchronicznego dla aplikacji Windows i nie są specyficzne dla interfejsu API transkodowania.

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