Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.
}
}