65.9K
CodeProject 正在变化。 阅读更多。
Home

Windows Phone 8.1 媒体编辑 API

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.73/5 (9投票s)

2014 年 7 月 10 日

CPOL

5分钟阅读

viewsIcon

27472

Windows Phone 8.1 媒体编辑 API

引言

WP 8.1 是 Windows Phone 的主要更新之一。WP 8.1 引入了新的 API、新的通用应用概念、WinRT API 的集成、新的 UI 控件等。其中一项新增的 API 就是媒体编辑 API。

在过去,我们需要使用 Movie Maker 或其他第三方桌面软件来裁剪视频、组合多个视频、应用各种效果等等。这需要一台内存更大、处理器更高端的电脑,但现在我们的智能手机已经足够强大,可以完成这些任务。因此,让我们深入了解 Windows Phone 8.1 的新媒体编辑 API。

Windows 媒体编辑 API

媒体编辑 API 包含 MediaClip 类,其对象代表单个媒体,即视频、图像或纯色视频片段。要对媒体文件执行任何编辑操作,必须先创建 MediaClip 对象。MediaClip 提供了三个 static 方法来创建对象。

MediaClip.CreateFromFileAsync(IStorageFile file)

用于从视频文件创建 MediaClip 对象。

MediaClip.CreateFromImageFileAsync(IStorageFile file, TimeSpan originalDuration)

用于从图像文件创建 MediaClip 对象。当我们在组合媒体文件时,参数“originalDuration”非常有用。它表示图像在组合视频片段中显示的持续时间。

MediaClip.CreateFromColor(Color color, TimeSpan originalDuration)

用于创建一个纯色视频片段,该片段以指定的时长显示一种颜色。纯色视频片段通常用于在视频片段之间创建明确的间隔。

创建媒体片段后,您将获得一个特定文件的对象。然后,您可以应用效果和进行编辑。我们逐一进行介绍。

裁剪

现在,裁剪视频只需要两个步骤。MediaClip 对象有两个属性:(i) TrimTimeFromStart (ii) TrimTimeFromEnd。创建 MediaClip 后,只需设置这两个属性即可。设置后,MediaClip 将包含裁剪后的媒体。您可以随时更改裁剪时间。稍后我们将介绍如何将此 MediaClip 渲染到文件中。

// Create MediaClip object
MediaClip objMediaClip = await MediaClip.CreateFromFileAsync(file)

// Trim from objMediaClip everything after specified position (1 minute & 20 seconds)
objMediaClip.TrimTimeFromStart = new TimeSpan(0,1,20);

// Trim from objMediaClip everything after the specified position
objMediaClip.TrimTimeFromEnd = objMediaClip.OriginalDuration - new TimeSpan(0,2,9);

慢动作和视频稳定效果

微软拥有 MFT (Media Foundation Transform) 平台,通过该平台,开发者可以创建 C++ WinRT 组件。这些组件可用于应用各种视频播放和滤镜效果。

Windows.Media.Effects 命名空间 专用于预定义效果,可用于应用于任何视频文件。其中一种效果是慢动作效果。Windows.Media.Effects 包含 SlowMotionEffectDefinition 类,用于将慢动作效果应用于媒体。该类有一个名为 TimeStretchRate 的属性。它指明视频的放慢程度。它接受小于 1 的 double 值。因此,如果将 TimeStretchRate 设置为 0.5,视频速度将是原始速度的一半。将其值设置为大于 1 会引发异常。所以不要考虑将其用于快进视频效果。

现在,要将慢动作效果应用于任何视频,您首先需要创建其 MediaClip 对象,这对于媒体编辑至关重要。MediaClip 对象有一个名为 VideoEffectDefinitionsIList<IVideoEffectDefinition> 属性。因此,首先,您需要创建 SlowMotionEffectDefinition 的对象并设置 TimeStretchRate 属性。然后,将该对象添加到 VideoEffectDefinitions 列表中。这样,您的视频就进入了慢动作状态。稍后我们将介绍如何预览以及如何保存带有效果的视频。

// Let's consider we have already MediaClip object.

// Create object of SlowMotionEffectDefinition
var objSlowMotionEffectDefinition = new SlowMotionEffectDefinition();

objSlowMotionEffectDefinition.TimeStretchRate = 0.6;

// Add effect object to MediaClip object's VideoEffectDefinitions list.
objMediaClip.VideoEffectDefinitions.Add(objSlowMotionEffectDefinition);

同样,您也可以添加视频稳定效果。VideoStabilization 效果可以帮助减少视频抖动。该效果位于 Windows.Media 命名空间 中。它只有一个名为 VideoEffects 的类,这是一个 static 类。要添加此效果,您无需创建对象。它有一个 static string 属性 VideoStabilization,这是该视频效果定义的激活类 ID。

// Create object of VideoEffectDefinition
// Pass static string property VideoEffects.VideoStabilization as argument
var objVideoStabilization = new VideoEffectDefinition(VideoEffects .VideoStabilization);

// Add effect object to MediaClip object's VideoEffectDefinitions list.
objMediaClip.VideoEffectDefinitions.Add(objVideoStabilization);

滤镜和其他视频效果

Nokia Imaging SDK 提供了大量的图像处理滤镜。可惜的是,它不适用于视频。我们可以通过使用 MFT 开发 C++ WinRT 组件来解决这个问题。根据 MSDN 的说法,Media Foundation Transforms (MFTs) 提供了一个通用的媒体数据处理模型。MFTs 用于解码器、编码器和数字信号处理器 (DSP)。简而言之,位于媒体管道中媒体源和媒体宿之间的任何内容都是 MFT。

MSDN 提供了一个 示例,其中包含多种效果的源代码,例如灰度、鱼眼、捏合、变形和反转。该示例还展示了如何在播放时应用这些效果。应用效果后的保存功能则没有详细说明。因此,应用 MSDN 示例中的效果与慢动作和视频稳定效果非常相似。您需要首先将 MSDN 示例中的 WinRT C++ 组件添加到您自己的项目中,然后您需要在 WP 8.1 项目的清单文件中定义激活类 ID。在 </Package> 之前,将下面提供的行添加到文本编辑器中打开的清单文件中。

<Extensions>
    <Extension Category="windows.activatableClass.inProcessServer">
      <InProcessServer>
        <Path>GrayscaleTransform.dll</Path>
        <ActivatableClass ActivatableClassId="GrayscaleTransform.GrayscaleEffect" 
         ThreadingModel="both"/>
      </InProcessServer>
    </Extension>
    <Extension Category="windows.activatableClass.inProcessServer">
      <InProcessServer>
        <Path>PolarTransform.dll</Path>
        <ActivatableClass ActivatableClassId="PolarTransform.PolarEffect" ThreadingModel="both"/>
      </InProcessServer>
    </Extension>
    <Extension Category="windows.activatableClass.inProcessServer">
      <InProcessServer>
        <Path>InvertTransform.dll</Path>
        <ActivatableClass ActivatableClassId="InvertTransform.InvertEffect" ThreadingModel="both"/>
      </InProcessServer>
    </Extension>
</Extensions>

现在,每个效果都有其自己的激活类 ID,您需要先创建 VideoEffectDefinition 类的对象,并将该激活类 ID 作为构造函数的参数传递。最后,将 VideoEffectDefinition 的对象添加到 MediaClip 中,即可完成。

// Create object of VideoEffectDefinition, pass activable class ID as parameter

var objGrayScaleEffect = new VideoEffectDefinition("GrayscaleTransform.GrayscaleEffect");
objMediaClip.VideoEffectDefinitions.Add(objGrayScaleEffect);

var objInvertEffect = new VideoEffectDefinition("InvertTransform.InvertEffect");
objMediaClip.VideoEffectDefinitions.Add(objInvertEffect);

在 MSDN 示例中,鱼眼、捏合和变形效果定义在同一个 WinRT 组件中。要应用其中的任何一个效果,您需要传递配置参数以及激活类。VideoEffectDefinition 的构造函数还有另一个重载,它接受键值对来配置效果。

// First define configuration

PropertySet configuration = new PropertySet();
configuration.Add("effect", "Fisheye");
// configuration.Add("effect", "Warp");
// configuration.Add("effect", "Pinch");

// Create object of VideoEffectDefinition, pass activable class ID and configuration as parameter
var objPolarEffect = new VideoEffectDefinition("PolarTransform.PolarEffect", configuration);

// Add effect object to MediaClip object's VideoEffectDefinitions list.
objMediaClip.VideoEffectDefinitions.Add(objPolarEffect);

保存视频

我们已经学会了如何应用效果和裁剪,现在是时候保存视频了。MediaEditing API 还有一个重要的类叫做 MediaCompositionMediaClip 代表单个媒体文件,而 MediaCompositionMediaClip 对象的集合。它允许您管理组合中的所有 MediaClip 对象。

组合具有多个片段的视频是一项复杂的任务,最好能够预览一下,对吧?MediaComposition 提供了自身的预览功能。因此,要预览您已应用效果的视频,您需要首先将 MediaClip 对象添加到 MediaComposition 中,然后生成预览流。将该流设置为 MediaElement 的源。您还可以设置预览的高度和宽度。

// Create object of MediaComposition class
var objMediaComposition = new MediaComposition();

// Add MediaClip to composition after applying effects
objMediaComposition.Clips.Add(objMediaClip);

// Generate preview stream & set as source to MediaElement
MediaElement.SetSource(objMediaComposition. GeneratePreviewMediaStreamSource(360, 240));

现在要保存 MediaClip,您需要调用其异步方法 RenderToFileAsync(IStorageItem file)

// Create file using save picker or in local/temporary folder
var file = await ApplicationData.Current.LocalFolder.CreateFileAsync(“MyVideo.mp4”);

// Render MediaComposition to file.
await objMediaComposition.RenderToFileAsync(file);

就是这样,您在 Windows Phone 上进行媒体编辑的梦想得以实现。现在您可以从您的 WP 应用中编辑媒体文件了。

© . All rights reserved.