Краткое руководство: перекодировка видеофайлов (HTML)
[ Эта статья адресована разработчикам приложений среды выполнения Windows для Windows 8.x и Windows Phone 8.x. В случае разработки приложений для Windows 10 см. раздел последняя документация]
Для перекодировки видеофайлов из одного формата в другой вы можете использовать API Windows.Media.Transcoding.
Перекодировка — это преобразование цифрового файла мультимедиа (например, звукового или видеофайла) из одного формата в другой. Обычно этот процесс состоит из декодирования и повторного кодирования файла. Например, файл Windows Media можно преобразовать в формат MP4, чтобы его можно было воспроизводить на портативном устройстве, поддерживающем данный формат. Кроме того, можно преобразовать видеофайл высокой четкости, уменьшив его разрешение. В таком случае в перекодированном файле будет использоваться тот же кодек, что и в исходном файле, но их профили кодирования будут отличаться.
В этом учебнике приведен процесс перекодировки видеофайла в формат MP4. В нем описано, как открыть видеофайл с помощью класса FileOpenPicker, и как впоследствии перекодировать видеофайл в формат MP4 с помощью класса MediaTranscoder. В заключительной части описано использование класса FileSavePicker для сохранения новых перекодированных файлов.
Полный код примера приведен в конце этого краткого руководства. Добавьте следующий код в файл Program.js.
Другой пример перекодировки в приложении среды выполнения Windows на JavaScript см. в Образце перекодировки файла мультимедиа.
Необходимые условия
Предполагается, что вы умеете создавать простые приложения среды выполнения Windows на JavaScript. Подробнее: Создание первого приложения Магазина Windows на JavaScript.
Инструкции
1. Создание нового проекта
Создайте пустое приложение Магазина Windows на JavaScript. См. также: Создание первого приложения Магазина Windows на JavaScript.
2. Выбор исходного файла и создание конечного файла
Используйте класс FileOpenPicker, чтобы выбрать исходный файл, и класс FileSavePicker, чтобы создать конечный файл. Задайте свойства SuggestedStartLocation и FileTypeFilter объекта FileOpenPicker. У объекта FileSavePicker задайте свойства SuggestedStartLocation, DefaultFileExtension, SuggestedFileName и FileTypeChoices. Обратите внимание, что приведенная функция вызывает другую функцию — TranscodeFile. Это пользовательская функция, которая выполняет операцию перекодировки. Она будет создана на следующем этапе.
Приложение Магазина Windows Phone на JavaScript должно использовать PickSingleFileAndContinue, а не PickSingleFileAsync.
function transcodeVideoFile() {
var source;
var destination
var openPicker = new Windows.Storage.Pickers.FileOpenPicker();
openPicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.videosLibrary;
openPicker.fileTypeFilter.replaceAll([".wmv", ".mp4"]);
openPicker.pickSingleFileAsync().then(
function (file) {
source = file;
var savePicker = new Windows.Storage.Pickers.FileSavePicker();
savePicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.videosLibrary;
savePicker.defaultFileExtension = ".mp4";
savePicker.suggestedFileName = "New Video";
savePicker.fileTypeChoices.insert("MPEG4", [".mp4"]);
return savePicker.pickSaveFileAsync();
}).then(
function (file) {
destination = file;
TranscodeFile(source, destination);
});
};
3. Создание профиля кодирования
Профиль кодирования содержит параметры, определяющие способ кодирования конечного файла. Именно на этом этапе перекодирования файла выбор параметров наиболее велик.
Пространство имен Windows.Media.MediaProperties предоставляет набор заданных профилей кодирования:
- аудиофайл в формате AAC (M4A);
- аудиофайл в формате MP3;
- аудиофайл в формате WMA;
- видеофайл в формате MP4 (видео в формате H.264 и аудио в формате AAC);
- видеофайл в формате WMV.
Первые три профиля в этом списке предназначены только для аудиофайлов. Последние два профиля предназначены как для видео, так и для аудиофайлов.
Следующий фрагмент кода используется для создания профиля видеофайла в формате MP4.
var profile = Windows.Media.MediaProperties.MediaEncodingProfile.createMp4(
Windows.Media.MediaProperties.VideoEncodingQuality.hd720p);
Статический метод CreateMp4 создает профиль кодирования для MP4. Параметр этого метода задает конечное разрешение видеофайла. В данном случае VideoEncodingQuality.hd720p означает разрешение 1280 x 720 пикселей со скоростью 30 кадров в секунду ("720p" означает 720 строк прогрессивной развертки на один кадр). Все остальные методы создания предопределенных профилей работают по тому же принципу.
В качестве альтернативы с помощью метода Windows.Media.MediaProperties.MediaEncodingProfile.CreateFromFileAsync можно создать профиль, который соответствует существующему файлу мультимедиа. Если же вам известны точные параметры кодирования, то можно создать новый объект Windows.Media.MediaProperties.MediaEncodingProfile и настроить для него профиль.
4. Перекодировка файла
Чтобы перекодировать файл, создайте новый объект MediaTranscoder и вызовите метод MediaTranscoder.PrepareFileTranscodeAsync. В качестве параметров задайте исходный файл, конечный файл и профиль кодирования. Затем вызовите функцию TranscodeAsync объекта PrepareTranscodeResult, который был возвращен в результате выполнения асинхронной операции перекодировки. Кроме того, можно создать функции для обработки ошибок, хода выполнения и завершения асинхронной операции.
/// <param name="srcFile" type="IStorageFile"/>
/// <param name="destFile" type="IStorageFile"/>
function TranscodeFile(srcFile, destFile) {
var profile = Windows.Media.MediaProperties.MediaEncodingProfile.createMp4(
Windows.Media.MediaProperties.VideoEncodingQuality.hd720p);
var transcoder = new Windows.Media.Transcoding.MediaTranscoder();
transcoder.prepareFileTranscodeAsync(srcFile, destFile, profile).then(function (result) {
if (result.canTranscode) {
result.transcodeAsync().then(transcodeComplete, transcoderErrorHandler, transcodeProgress);
} else {
// Handle error condition. result.failureReason
}
});
};
Метод PrepareFileTranscodeAsync является асинхронным. За счет этого перекодировку можно проводить в фоновом режиме; при этом пользовательский интерфейс остается доступным.
Необходимо обновлять пользовательский интерфейс и обрабатывать все происходящие ошибки.
function transcodeComplete(result) {
// handle completion.
// This snippet writes to an HTML control which is defined external to this snippet.
OutputText.innerHTML = "Transcode Complete";
};
function transcoderErrorHandler(error) {
// handle error condition
};
function transcodeProgress(percent) {
// handle progress.
// This snippet writes to an HTML control which is defined external to this snippet.
ProgressText.innerHTML = "Transcode Progress: " + percent.toString().split(".")[0] + "%";
};
Сводка
В следующем образце кода показана полная последовательность вызовов, необходимых для перекодировки.
Вначале приведен код для открытия и сохранения файла.
function transcodeVideoFile() {
var source;
var destination
var openPicker = new Windows.Storage.Pickers.FileOpenPicker();
openPicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.videosLibrary;
openPicker.fileTypeFilter.replaceAll([".wmv", ".mp4"]);
openPicker.pickSingleFileAsync().then(
function (file) {
source = file;
var savePicker = new Windows.Storage.Pickers.FileSavePicker();
savePicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.videosLibrary;
savePicker.defaultFileExtension = ".mp4";
savePicker.suggestedFileName = "New Video";
savePicker.fileTypeChoices.insert("MPEG4", [".mp4"]);
return savePicker.pickSaveFileAsync();
}).then(
function (file) {
destination = file;
TranscodeFile(source, destination);
});
};
Затем идет код для перекодировки файла.
/// <param name="srcFile" type="IStorageFile"/>
/// <param name="destFile" type="IStorageFile"/>
function TranscodeFile(srcFile, destFile) {
var profile = Windows.Media.MediaProperties.MediaEncodingProfile.createMp4(
Windows.Media.MediaProperties.VideoEncodingQuality.hd720p);
var transcoder = new Windows.Media.Transcoding.MediaTranscoder();
transcoder.prepareFileTranscodeAsync(srcFile, destFile, profile).then(function (result) {
if (result.canTranscode) {
result.transcodeAsync().then(transcodeComplete, transcoderErrorHandler, transcodeProgress);
} else {
// Handle error condition. result.failureReason
}
});
};
В завершение приведен код обработки хода выполнения, ошибок и завершения процесса перекодировки.
function transcodeComplete(result) {
// handle completion.
// This snippet writes to an HTML control which is defined external to this snippet.
OutputText.innerHTML = "Transcode Complete";
};
function transcoderErrorHandler(error) {
// handle error condition
};
function transcodeProgress(percent) {
// handle progress.
// This snippet writes to an HTML control which is defined external to this snippet.
ProgressText.innerHTML = "Transcode Progress: " + percent.toString().split(".")[0] + "%";
};
Связанные разделы
Схемы
Схема создания приложений Магазина Windows на JavaScript
Проектирование взаимодействия с пользователем в приложениях
Примеры
Образец перекодировки файла мультимедиа
Образец расширения мультимедиа
Образец связи в реальном времени
Задачи
Справочные материалы
Другие ресурсы