Getting started with the Expression Encoder Object Model (RTM Version)
This post is an update to the previous Getting started with the Expression Encoder Object Model post, but updated to work with the RTM version of Expression Encoder V2 as the progress event handler changed a little from Beta to RTM.
(This post assume you’ve already installed Expression Encoder V2 available from here, and that you have Visual Studio 2005 or 2008 installed.)
First of all start Visual Studio and select File… New Project… You can choose which type of application you would prefer, like a WPF or Windows Forms application. For my test here, I’m just going to choose a Console Application. Give it a suitable name.
Go ahead and click OK.
Before you can start coding against the Expression Encoder object model you need to add references to the applicable assemblies. Select Project…Add Reference from the menu. When the dialog comes up you need to select
Microsoft.Expression.Encoder
Microsoft.Expression.Encoder.Types
Microsoft.Expression.Encoder.Utilites
and because some of our types derive from ObservableCollection you also need to select
WindowsBase.
You can select them one at a time or hold down CTRL and multi-select each one before clicking OK.
Now we're ready to do some coding.
To make it easier to pick up the Encoder classes let's first of all add a using statement. Just add the following near the top of the file where the other using statements are.
using Microsoft.Expression.Encoder;
One of the main classes that you'll end up dealing with in Expression Encoder is the MediaItem class. This allows you to find out information about a video or audio file and ultimately allow you to encode it. To create one of these you just pass the filename of the media file you want.to the constructor.
e.g.
MediaItem mediaItem = new MediaItem(@"C:\input\video.avi");
Obviously, you'll change the filename to the one you want to use.
Once this has been created you'll be able to access a bunch of information about the file
e.g.
FileDuration
OriginalAspectRatio
OriginalVideoSize
This is also the way you'll control how the video is encoded. If you type mediaItem followed by a "." you should trigger the Intellisense drop down which shows you all the properties and methods on this item. You should see a lot of properties that correspond to options in the UI of the main Encoder application. If you want Intellisense comments to appear and want to check out the help file, see this post.
For now we'll just use the defaults.
Before we can encode the file we need to create and add it to a Job.
This is simply done by the following statements.
Job job = new Job();
job.MediaItems.Add(mediaItem);
If you want to encode multiple files in the same job you can go ahead and create multiple MediaItem's and add them to the job.
Before you encode you need to set the directory where the output will go. This is done by setting the OutputDirectory property.
job.OutputDirectory = @"C:\output";
By default Expression Encoder will create output in sub folders named using the Job Id. These will be something along the lines of your machine name followed by the current date and time, e.g. "DEAN 4-21-2008 11.00.47 PM".
You can turn this feature off by setting the CreateSubfolder property.
job.CreateSubfolder = false;
Then the output will be created in the output directory directly.
For the simplest case, that’s all you need before encoding the job. This is done by just calling the Encode method.
job.Encode();
Putting it all together your program should look something like this.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Expression.Encoder;
namespace MyEncoderApplication
{
class Program
{
static void Main(string[] args)
{
MediaItem mediaItem = new MediaItem(@"C:\input\video.avi");
// Create a job and the media item for the video we wish
// to encode.
Job job = new Job();
job.MediaItems.Add(mediaItem);
// Set the output directory and encode
job.OutputDirectory = @"C:\output";
job.Encode();
}
}
}
Now you should be able to compile and run the application. After it's finished running, you should have the encoded output file underneath the output directory. It should have a filename that matches the original, but with a .wmv file extension.
If you run the application and it crashes, then that is probably because an exception was thrown that is not currently being caught. For example if your MediaItem points to a file that doesn't exist or isn't a valid media file, you will see that an InvalidMediaFileException is thrown. You can then run it under the debugger to get more details.
Assuming everything worked OK then for your next step you'll probably want to show some progress during the encode. First of all you need to a add a progress event handler function. Something like the following
static void OnProgress(object sender, EncodeProgressEventArgs e)
{
Console.WriteLine(e.Progress);
}
Obviously here we're just dumping the progress to the screen on each line. If you were writing a GUI app you would probably update a progress bar or something similar.
To tell Encoder to call this function you need the following line when you're creating the job.
job.EncodeProgress
+= new EventHandler<EncodeProgressEventArgs>(OnProgress);
Now you’re code should look something like the following.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Expression.Encoder;
namespace MyEncoderApplication
{
class Program
{
static void Main(string[] args)
{
MediaItem mediaItem = new MediaItem(@"C:\input\video.avi");
// Create a job and the media item for the video we wish
// to encode.
Job job = new Job();
job.MediaItems.Add(mediaItem);
// Set up the progress callback function
job.EncodeProgress
+= new EventHandler<EncodeProgressEventArgs>(OnProgress);
// Set the output directory and encode.
job.OutputDirectory = @"C:\output";
job.Encode();
}
static void OnProgress(object sender, EncodeProgressEventArgs e)
{
Console.WriteLine(e.Progress);
}
}
}
When you compile and run the application you should now see a bunch of numeric values going to 100, something like the following.
That’s it for a basic encoding app. From here you can now try experimenting with various properties on the MediaItem. For example, if you want to try tweaking the output profile, you can look at this post – Changing the output profile.
Note that if you’re running a 64-bit OS then you may also need to change your Target Platform within Visual Studio from “Any CPU” to "x86” as Expression Encoder is 32-bit.
Comments
Anonymous
May 08, 2008
PingBack from http://blogs.msdn.com/expressionencoder/archive/2008/04/22/8418128.aspxAnonymous
May 09, 2008
What about live encoding? Is that possible with this object model?Anonymous
May 17, 2008
NU AM MAI VORBIT DAR DORESC SA COMUNICAM PRIN INTERMEDIUL NET . CE STUDII AI ? UNDE LUCREZI SI ASVREA SA SIU DE UNDE ESTI DIN CE TARA PROVII?ORASUL IN CARELOCUIESTI?Anonymous
May 17, 2008
NU AM MAI VORBIT DAR DORESC SA COMUNICAM PRIN INTERMEDIUL NET . CE STUDII AI ? UNDE LUCREZI SI ASVREA SA SIU DE UNDE ESTI DIN CE TARA PROVII?ORASUL IN CARELOCUIESTI?Anonymous
May 22, 2008
Sorry, we don't currently support live encoding using the object model. Regards Dean.Anonymous
June 02, 2008
The Expression Encoder 2 ReadMe states that the MPEG-2 decoder is not included in the Trial version? I downloaded the trial recently from MSDN. What do these users do if they want the MPEG-2 decoder? I especially don't want the buy the separate Encoder v2 version since I'll later be getting the Studio v2 as a licensed user of Visual Studio 2008 Team Suite.Anonymous
June 03, 2008
Does the Job support async progress reporting?Anonymous
June 11, 2008
You should be able to install a third party MPEG-2 encoder and have that work. Regards Dean.Anonymous
June 11, 2008
Hi Andrew, The actual Encode method is synchronous but you can call it from another thread and get progress information. There is an example in the SDK (WPFEncode) that shows progress information as the Encode progresses. Regards Dean.Anonymous
January 12, 2009
Hi is there a way to load the job preset xml file which I would save from the program so the encoding would be done with all the settings which are in the file?Anonymous
January 12, 2009
Yes there is a method called ApplyPreset on the Job and the MediaItem classes. One applies it to the entire job and one applies it to the specific media item. Hope this helps. Dean.