快速入门:转码视频文件 (HTML)

[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]

Windows.Media.Transcoding API 将视频文件从一种格式转码为另一种格式。

转码是指转换数字媒体文件,例如将视频或音频文件从一种格式转换到另一种格式。 这通常是通过解码文件,然后再重新编码文件实现的。例如,你可以将 Windows Media 文件转换为 MP4 文件,以使此文件可以在支持 MP4 格式的便携式设备上播放。或者,你可以将高清视频文件转换为较低分辨率的文件。在此情况下,重新编码的文件可能使用与原始文件相同的编解码器,但是其编码配置文件不同。

本教程展示了如何将视频文件转码为 MP4 格式。 它介绍了如何使用 FileOpenPicker 类从系统打开一个视频文件,然后使用 MediaTranscoder 类将视频文件转码为 MP4 格式。最后,它介绍了如何使用 FileSavePicker 类来保存新编码的文件。

此快速入门的完整代码列在本教程末尾处提供。将此代码添加到你的 Program.js 文件中。

有关在使用 JavaScript 的 Windows 运行时应用中转码的另一示例,请参阅对媒体示例进行转码

先决条件

本主题假设你可以创建使用 JavaScript 的基本 Windows 运行时应用。有关创建你的第一个应用的帮助,请参阅创建你的第一个使用 JavaScript 的 Windows 应用商店应用

说明

1. 创建新项目

开始使用 JavaScript 创建空白的 Windows 应用商店应用。有关详细信息,请参阅创建第一个采用 JavaScript 的 Windows 应用商店应用

2. 选择源文件,并创建目标文件

使用 FileOpenPicker 类选择源文件,使用 FileSavePicker 类创建目标文件。在 FileOpenPicker 上设置 SuggestedStartLocationFileTypeFilter 属性。在 FileSavePicker 对象上,设置 SuggestedStartLocationDefaultFileExtensionSuggestedFileNameFileTypeChoices 属性。注:该函数将会调用一个名为 TranscodeFile 的函数。 这是一个用于执行转码操作的用户定义的函数。 我们将在下一步中创建该函数。

使用 JavaScript 的 Windows Phone 应用商店应用必须使用 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 音频
  • Windows Media 音频 (WMA)
  • MP4 视频(H.264 视频加 AAC 音频)
  • Windows Media 视频 (WMV)

此列表中的前三个配置文件仅包含音频,另外两个既包含视频又包含音频。

以下代码为 MP4 视频创建配置文件。

var profile = Windows.Media.MediaProperties.MediaEncodingProfile.createMp4(
        Windows.Media.MediaProperties.VideoEncodingQuality.hd720p);

静态 CreateMp4 方法创建 MP4 编码配置文件。此方法的参数为视频指定目标分辨率。在这种情况下,VideoEncodingQuality.hd720p 表示在每秒 30 帧情况下的 1280 x 720 像素。("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 方法是异步的。这可以在后台进行转码的同时使 UI 保持响应。

你还应更新 UI 并处理发生的任何错误。

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] + "%";
};

相关主题

路线图

采用 JavaScript 的 Windows 应用商店应用的路线图

设计应用 UX

添加多媒体

示例

对媒体示例进行转码

媒体扩展示例

实时通信示例

任务

如何剪裁视频文件

参考

Windows.Media

Windows.Media.MediaProperties

Windows.Media.Transcoding

MediaTranscoder

PrepareTranscodeResult

TranscodeAsync

其他资源

支持的音频和视频格式

音频和视频性能