[ 本文适用于编写 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 上设置 SuggestedStartLocation 和 FileTypeFilter 属性。在 FileSavePicker 对象上,设置 SuggestedStartLocation、DefaultFileExtension、SuggestedFileName 和 FileTypeChoices 属性。注:该函数将会调用一个名为 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 应用商店应用的路线图
示例
任务
参考
其他资源