Краткое руководство: перекодировка видеофайлов (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

Проектирование взаимодействия с пользователем в приложениях

Добавление мультимедиа

Примеры

Образец перекодировки файла мультимедиа

Образец расширения мультимедиа

Образец связи в реальном времени

Задачи

Усечение видеофайла

Справочные материалы

Windows.Media

Windows.Media.MediaProperties

Windows.Media.Transcoding

MediaTranscoder

PrepareTranscodeResult

TranscodeAsync

Другие ресурсы

Поддерживаемые аудио- и видеоформаты

Производительность аудио и видео