Another task that provides Azure Media Services is encoding the assets we have in our account. As I said in the introductory post, it is possible to perform this task through the portal itself, using the bottom menu (ENCODE):
We can also perform this same task via .NET following these steps:
using Microsoft.WindowsAzure.MediaServices.Client; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace EncodingAssets { class Program { static void Main(string[] args) { //0. Constants const string accountName = "gismedia"; const string accountKey = "HTT3sfeRvTXIGlGdJU7EVQVRWrKSfV0q0tHnvCHxrVA="; var assetName = "WOW_Mists_of_Pandaria_MP4"; var OutputAssetName = "WOW_Mists_of_Pandaria_H264_Smooth"; var encodingPreset = "H264 Smooth Streaming 720p"; //1. Nuget: Install-Package windowsazure.mediaservices //2. Create context CloudMediaContext _context = new CloudMediaContext(accountName, accountKey); //3. Get asset var asset = _context.Assets.Where(a => a.Name == assetName).FirstOrDefault(); //4. Declare a job var job = _context.Jobs.Create(string.Format("Encoding {0} to {1}", assetName, encodingPreset)); //5. Get processor var processor = _context.MediaProcessors.Where(p => p.Name == "Windows Azure Media Encoder").ToList().OrderBy(wame => new Version(wame.Version)).LastOrDefault(); //6. Create task var task = job.Tasks.AddNew("Encoding task", processor, encodingPreset, TaskOptions.None); //7. Specify the asset task.InputAssets.Add(asset); //8. Output asset with the result task.OutputAssets.AddNew(OutputAssetName, AssetCreationOptions.None); //9. Handle to check the progress job.StateChanged += StateChanged; job.Submit(); //10. Check job execution and wait for job to finish Task progressJobTask = job.GetExecutionProgressTask(CancellationToken.None); progressJobTask.Wait(); //11. Check final status Console.WriteLine("Job final state: {0}", job.State); Console.ReadLine(); } static void StateChanged(object sender, JobStateChangedEventArgs e) { Console.WriteLine("Job stated change event:"); Console.WriteLine(" Previous state: {0}", e.PreviousState); Console.WriteLine(" Current state: {0}", e.CurrentState); } } }
- Constants: Azure Media Services account, asset name we want to code, name of the resulting asset, the preset we want to use (use the name as listed on the website when we perform the task from there:
- Install windowsazure.mediaservices via Nuget
- Connect the application with the account.
- Get the asset that we want to encode. In this example, we get the asset through the name but the best way to recover it is through the Id, since the name of the assets can be repeated.
- Create a job: It will be responsible for managing the task.
- Get the processor Windows Azure Media Encoder that will perform the task of encoding.
- Create a task within the job. We can have multiple tasks within a job, which will be launched sequentially.
- Add to the task which is the asset on which we want to perform the operation.
- Choose a name for the final asset.
- Associate a handler to StateChanged event in order to know what is happening with the job.
- Wait to complete the task
- Check the result of the work once completed.
If you launch the example, we see the following output on the console:
From the portal you can see that in the CONTENT section have a new asset with the new name (in this case WOW_Mists_of_Pandaria_H264_Smooth) and, if we publish it through the bottom menu, you will see that the format of the URL corresponds with Smooth Streaming format:
http://[ACCOUNT_NAME].origin.mediaservices.windows.net/[LOCATOR_ID]/Mists_of_Pandaria.ism/Manifest
Hope this helps.
Happy encoding!