WP 8.1 is one of the major updates for Windows Phone. WP 8.1 has unveiled new APIs, new universal apps concept, inclusion of WinRT APIs, new UI controls and much more. One of the new APIs introduced is media editing API.
In earlier days, we were using Movie Maker or other 3rd party desktop software to trim the video, to make a composition of multiple video, to apply various effects, etc. We were required to have a computer with more memory & high-end processors, but now our smartphones are powerful enough to do such tasks. So let’s get a deep dive in new media editing API of Windows Phone 8.1.
Windows Media Editing API
Media editing API has
MediaClip class, whose object represents a single media, i.e., video, image or a solid color video clip. To perform any kind of editing operation on a media file, you must first create
MediaClip provides three
static methods to create object.
Which creates a
MediaClip object from a video file.
MediaClip.CreateFromImageFileAsync(IStorageFile file, TimeSpan originalDuration)
Which creates a
MediaClip object from an image file. The parameter “
originalDuration” has use while we create composition of media files. It represents how long the image would be displayed in the composed video clip.
MediaClip.CreateFromColor(Color color, TimeSpan originalDuration)
Which creates a solid color video clip that displays a single color for a specified length of time. Solid color video clips are typically used to create an explicit gap between video segments.
After creating media clip, you will have an object of a particular file. Then you can apply effects as well as editing. Let’s go through them one by one.
Trimming the video is now just two steps process.
MediaClip object has two properties (i)
TrimTimeFromEnd. After creating
MediaClip, you just have to set these two properties. After setting it, the
MediaClip will have trimmed media. You can change later on the trimming times as many times as you want. We will see further how to render this
MediaClip into a file.
MediaClip objMediaClip = await MediaClip.CreateFromFileAsync(file)
objMediaClip.TrimTimeFromStart = new TimeSpan(0,1,20);
objMediaClip.TrimTimeFromEnd = objMediaClip.OriginalDuration - new TimeSpan(0,2,9);
Slow Motion & Video Stabilization Effects
Microsoft has MFT (Media Foundation Transform) platform, through which one can developer C++ WinRT components. These can be used to apply various video playback & filter effects.
Windows.Media.Effects namespace is dedicated to pre-defined effects, which can be used to apply on any video file. One of the effects is slow motion effects.
Windows.Media.Effects has class
SlowMotionEffectDefinition, which is used to apply slow motion effects to media. That class has one property called
TimeStretchRate. It refers to how slow the video will be. It takes double value of less than 1. Hence, if you set
0.5, the video speed will be half of the original. Setting its value greater than 1 throws an exception. So don’t consider its use for fast motion video effects.
Now to apply the slow motion effect to any video, first you have to create its
MediaClip object which is essential for media editing.
MediaClip object has
IList<IVideoEffectDefinition> property called
VideoEffectDefinitions. So first of all, you have to create object of
SlowMotionEffectDefinition and set
TimeStretchRate property. Then, add that object to
VideoEffectDefinitions list. That’s it, your video is now in slow motion. We will see later on how to preview and how to save video with effects.
var objSlowMotionEffectDefinition = new SlowMotionEffectDefinition();
objSlowMotionEffectDefinition.TimeStretchRate = 0.6;
Similarly, you can also add video stabilization effect. The
VideoStabilization effect can help reduce shakiness in video. That effect resides in
Windows.Media namespace. It has only one class named
VideoEffects, which is a
static class. To add this effect, you don’t have to create an object. It has
static string property
VideoStabilization, which is activatable class ID of that video effect definition.
var objVideoStabilization = new VideoEffectDefinition(VideoEffects .VideoStabilization);
Filter & Other Video Effects
Nokia Imaging SDK provides a plethora of filters for image processing. Unfortunately, it doesn’t work for videos. We can solve this problem by developing C++ WinRT components using MFT. According to MSDN, Media Foundation transforms (MFTs) provide a generic model for processing media data. MFTs are used for decoders, encoders, and digital signal processors (DSPs). In short, anything that sits in the media pipleine between the media source and the media sink is an MFT.
MSDN has provided a sample with several effect source code, wiz grayscale, fisheye, pinch, warp and invert. The sample also shows how to apply these effects in playback. No words for saving after applying the effects. So to apply MSDN sample’s effect is quite similar to slow motion & video stabilization effect. You have to first add WinRT C++ components from MSDN sample to your own project and then you have to define activatable class IDs in WP 8.1 project’s manifest file. Add below the given lines by opening manifest file in text editor before
<ActivatableClass ActivatableClassId="PolarTransform.PolarEffect" ThreadingModel="both"/>
<ActivatableClass ActivatableClassId="InvertTransform.InvertEffect" ThreadingModel="both"/>
Now each effect has its own activatable class ID, you have to first create object of
VideoEffectDefinition class & pass that activatable class ID as argument in constructor. Finally, add object of
MediaClip, that’s it.
var objGrayScaleEffect = new VideoEffectDefinition("GrayscaleTransform.GrayscaleEffect");
var objInvertEffect = new VideoEffectDefinition("InvertTransform.InvertEffect");
In MSDN sample fisheye, pinch & warp effect is defined in single WinRT component. To apply any of effect among them, you need to pass configuration parameter, with activatable class.
VideoEffectDefinition's constructor has one more overload, which takes a key-value pair to configure the effect.
PropertySet configuration = new PropertySet();
var objPolarEffect = new VideoEffectDefinition("PolarTransform.PolarEffect", configuration);
We have learned how to apply effects & trimming, now it’s our turn to save the video.
MediaEditing API has one more important class called
MediaClip represents a single media file, while
MediaComposition is a group of
MediaClip objects. It allows you manage all the
MediaClip objects in composition.
Composing a video with multiple clips is a complex task, it is better to have a preview of it, isn’t it?
MediaComposition provides a preview of itself. So to preview the video on which you have applied effects, you have to first add
MediaClip object to
MediaComposition and then generate preview stream. Set that stream as source to
MediaElement. You can also set height & width of preview.
var objMediaComposition = new MediaComposition();
MediaElement.SetSource(objMediaComposition. GeneratePreviewMediaStreamSource(360, 240));
Now to save
MediaClip, you have to call its asynchronous method
var file = await ApplicationData.Current.LocalFolder.CreateFileAsync("MyVideo.mp4");
That’s it, your dream of media editing on Windows Phone is accomplished. Now you can edit media files from your WP apps.