Använd Media Encoder Standard för att automatiskt generera en stege med bithastighet

media services logo


Översikt

Den här artikeln visar hur du använder Media Encoder Standard (MES) för att automatiskt generera en stege med bithastighet (bithastighetsupplösningspar) baserat på indataupplösningen och bithastigheten. Den automatiskt genererade förinställningen överskrider aldrig indataupplösningen och bithastigheten. Om indata till exempel är 720p vid 3 Mbit/s förblir utdata i bästa fall 720p och börjar med priser som är lägre än 3 Mbit/s.

Kodning endast för direktuppspelning

Om din avsikt är att koda källvideon endast för strömning bör du använda förinställningen "Anpassningsbar direktuppspelning" när du skapar en kodningsuppgift. När du använder förinställningen Anpassningsbar direktuppspelning kommer MES-kodaren intelligent att kapa en stege med bithastighet. Du kommer dock inte att kunna kontrollera kodningskostnaderna, eftersom tjänsten avgör hur många lager som ska användas och med vilken lösning. Du kan se exempel på utdatalager som skapats av MES som ett resultat av kodning med förinställningen Anpassningsbar direktuppspelning i slutet av den här artikeln. Utdatatillgången innehåller MP4-filer där ljud och video inte interfolieras.

Kodning för direktuppspelning och progressiv nedladdning

Om din avsikt är att koda källvideon för direktuppspelning samt att producera MP4-filer för progressiv nedladdning bör du använda mp4-förinställningen "Content Adaptive Multiple Bitrate MP4" när du skapar en kodningsuppgift. När du använder MP4-förinställningen Content Adaptive Multiple Bitrate använder MES-kodaren samma kodningslogik som ovan, men nu innehåller utdatatillgången MP4-filer där ljud och video interfolieras. Du kan använda en av dessa MP4-filer (till exempel den högsta bithastighetsversionen) som en progressiv nedladdningsfil.

Kodning med Media Services .NET SDK

I följande kodexempel används Media Services .NET SDK för att utföra följande uppgifter:

  • Skapa ett kodningsjobb.
  • Hämta en referens till Media Encoder Standard kodaren.
  • Lägg till en kodningsaktivitet i jobbet och ange att du vill använda förinställningen Anpassad direktuppspelning .
  • Skapa en utdatatillgång som innehåller den kodade tillgången.
  • Lägg till en händelsehanterare för att kontrollera jobbförloppet.
  • Skicka in jobbet.

Skapa och konfigurera ett Visual Studio-projekt

Konfigurera utvecklingsmiljön och fyll i app.config-filen med anslutningsinformation, enligt beskrivningen i Media Services utveckling med .NET.

Exempel

using System;
using System.Configuration;
using System.Linq;
using Microsoft.WindowsAzure.MediaServices.Client;
using System.Threading;

namespace AdaptiveStreamingMESPresest
{
    class Program
    {
        // Read values from the App.config file.
        private static readonly string _AADTenantDomain =
            ConfigurationManager.AppSettings["AMSAADTenantDomain"];
        private static readonly string _RESTAPIEndpoint =
            ConfigurationManager.AppSettings["AMSRESTAPIEndpoint"];
        private static readonly string _AMSClientId =
            ConfigurationManager.AppSettings["AMSClientId"];
        private static readonly string _AMSClientSecret =
            ConfigurationManager.AppSettings["AMSClientSecret"];

        // Field for service context.
        private static CloudMediaContext _context = null;

        static void Main(string[] args)
        {
            AzureAdTokenCredentials tokenCredentials =
                new AzureAdTokenCredentials(_AADTenantDomain,
                    new AzureAdClientSymmetricKey(_AMSClientId, _AMSClientSecret),
                    AzureEnvironments.AzureCloudEnvironment);

            var tokenProvider = new AzureAdTokenProvider(tokenCredentials);

            _context = new CloudMediaContext(new Uri(_RESTAPIEndpoint), tokenProvider);

            // Get an uploaded asset.
            var asset = _context.Assets.FirstOrDefault();

            // Encode and generate the output using the "Adaptive Streaming" preset.
            EncodeToAdaptiveBitrateMP4Set(asset);

            Console.ReadLine();
        }

        static public IAsset EncodeToAdaptiveBitrateMP4Set(IAsset asset)
        {
            // Declare a new job.
            IJob job = _context.Jobs.Create("Media Encoder Standard Job");

            // Get a media processor reference, and pass to it the name of the 
            // processor to use for the specific task.
            IMediaProcessor processor = GetLatestMediaProcessorByName("Media Encoder Standard");

            // Create a task
            ITask task = job.Tasks.AddNew("Media Encoder Standard encoding task",
            processor,
            "Adaptive Streaming",
            TaskOptions.None);

            // Specify the input asset to be encoded.
            task.InputAssets.Add(asset);
            // Add an output asset to contain the results of the job. 
            // This output is specified as AssetCreationOptions.None, which 
            // means the output asset is not encrypted. 
            task.OutputAssets.AddNew("Output asset",
            AssetCreationOptions.None);

            job.StateChanged += new EventHandler<JobStateChangedEventArgs>(JobStateChanged);
            job.Submit();
            job.GetExecutionProgressTask(CancellationToken.None).Wait();

            return job.OutputMediaAssets[0];
        }
        private static void JobStateChanged(object sender, JobStateChangedEventArgs e)
        {
            Console.WriteLine("Job state changed event:");
            Console.WriteLine("  Previous state: " + e.PreviousState);
            Console.WriteLine("  Current state: " + e.CurrentState);
            switch (e.CurrentState)
            {
                case JobState.Finished:
                    Console.WriteLine();
                    Console.WriteLine("Job is finished. Please wait while local tasks or downloads complete...");
                    break;
                case JobState.Canceling:
                case JobState.Queued:
                case JobState.Scheduled:
                case JobState.Processing:
                    Console.WriteLine("Please wait...\n");
                    break;
                case JobState.Canceled:
                case JobState.Error:

                    // Cast sender as a job.
                    IJob job = (IJob)sender;

                    // Display or log error details as needed.
                    break;
                default:
                    break;
            }
        }
        private static IMediaProcessor GetLatestMediaProcessorByName(string mediaProcessorName)
        {
            var processor = _context.MediaProcessors.Where(p => p.Name == mediaProcessorName).
            ToList().OrderBy(p => new Version(p.Version)).LastOrDefault();

            if (processor == null)
                throw new ArgumentException(string.Format("Unknown media processor", mediaProcessorName));

            return processor;
        }
    }
}

Utdata

Det här avsnittet visar tre exempel på utdatalager som skapats av MES som ett resultat av kodning med förinställningen Anpassningsbar direktuppspelning .

Exempel 1

Källa med höjden "1080" och framerate "29.970" producerar 6 videoskikt:

Skikt Höjd Bredd Bitrate(kbps)
1 1080 1920 6780
2 720 1280 3520
3 540 960 2210
4 360 640 1150
5 270 480 720
6 180 320 380

Exempel 2

Källa med höjden "720" och framerate "23.970" producerar 5 videoskikt:

Skikt Höjd Bredd Bitrate(kbps)
1 720 1280 2940
2 540 960 1850
3 360 640 960
4 270 480 600
5 180 320 320

Exempel 3

Källa med höjden "360" och framerate "29.970" producerar 3 videoskikt:

Skikt Höjd Bredd Bitrate(kbps)
1 360 640 700
2 270 480 440
3 180 320 230