Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Вы можете использовать Windows. Media.Transcoding API для перекодирования видеофайлов из одного формата в другой.
Транскодирование — это преобразование цифрового файла мультимедиа, например видео или аудиофайла из одного формата в другой. Обычно это делается путем декодирования и повторного кодирования файла. Например, можно преобразовать файл мультимедиа Windows в MP4, чтобы его можно было воспроизвести на переносимом устройстве, поддерживающем формат MP4. Кроме того, можно преобразовать видеофайл высокой четкости в более низкое разрешение. В этом случае повторно закодированный файл может использовать тот же кодек, что и исходный файл, но он будет иметь другой профиль кодирования.
Выбор исходных и целевых файлов
Способ определения исходных и целевых файлов для перекодирования зависит от реализации. В этом примере используется FileOpenPicker и FileSavePicker для выбора источника и целевого файла.
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();
Создание профиля кодирования мультимедиа
Профиль кодирования содержит параметры, определяющие способ кодирования целевого файла. В этом случае при перекодировки файла у вас есть наибольшее количество параметров.
Класс MediaEncodingProfile предоставляет статические методы для создания предопределенных профилей кодирования:
Методы создания профилей кодирования только для аудио
| Метод | Profile |
|---|---|
| CreateAlac | Аудио Apple Lossless Audio Codec (ALAC) |
| CreateFlac | Аудио в формате FLAC |
| CreateM4a | Звук AAC (M4A) |
| CreateMp3 | Звук MP3 |
| CreateWav | Звук WAV |
| CreateWma | Windows Media Audio (WMA) |
Методы создания профилей кодирования аудио и видео
| Метод | Profile |
|---|---|
| CreateAv1 | Видео AOMedia Video 1 (AV1) |
| CreateAvi | AVI |
| CreateHevc | Видео в формате Высокоэффективного кодирования видео (HEVC), также известное как видео H.265 |
| CreateMp4 | Видео MP4 (видео H.264 и звук AAC) |
| CreateVp9 | Видео VP9 |
| CreateWmv | Windows Media Video (WMV) |
Следующий код создает профиль для видео MP4.
MediaEncodingProfile profile =
MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD720p);
Статический метод CreateMp4 создает профиль кодирования MP4. Параметр для этого метода предоставляет целевое разрешение для видео. В этом случае VideoEncodingQuality.hd720p означает 1280 x 720 пикселей в 30 кадров в секунду. ("720p" означает 720 прогрессивных линий сканирования на кадр.) Другие методы создания предопределенных профилей соответствуют этому шаблону.
Кроме того, можно создать профиль, соответствующий существующему файлу мультимедиа, с помощью метода MediaEncodingProfile.CreateFromFileAsync . Или, если вы знаете точные параметры кодирования, можно создать новый объект MediaEncodingProfile и заполнить сведения о профиле.
Перекодирование файла
Чтобы перекодировать файл, создайте объект MediaTranscoder и вызовите метод MediaTranscoder.PrepareFileTranscodeAsync. Передайте исходный файл, целевой файл и профиль кодирования. Затем вызовите метод TranscodeAsync для объекта PrepareTranscodeResult, возвращенного из асинхронной операции транскода.
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;
}
}
Реагирование на ход выполнения перекодирования
Вы можете зарегистрировать события, чтобы реагировать на изменение хода выполнения асинхронной операции TranscodeAsync. Эти события являются частью асинхронной платформы программирования для приложений Windows и не относятся к API транскодирования.
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.
}
}
Windows developer