销售电话: 1-800-867-1380

使用适用于 .NET 的 Media Services SDK 创建编码作业

更新时间: 2014年7月

要通过 Internet 传送数字视频,你必须对媒体进行压缩。数字视频文件相当大,可能因过大而无法通过 Internet 传送或者无法在你客户的设备上正常显示。编码是压缩视频和音频以便你的客户能够查看媒体的过程。

编码作业是 Media Services 中最常见的处理操作之一。可通过创建编码作业将媒体文件从一种编码转换为另一种编码。进行编码时,可以使用 Media Services 内置的 Media Encoder。还可以使用 Media Services 合作伙伴提供的编码器;第三方编码器可通过 Azure Marketplace 获取。可以使用为编码器定义的预设字符串或预设配置文件来指定编码任务的详细信息。若要查看可用预设的类型,请参阅 Windows Azure Media Services 的任务预设。如果你使用了第三方编码器,那么你应该验证你的文件。

使用 Media Services 时,一种常见情况如下:

  1. 上载一个输入文件(称为夹层文件)。例如,H.264、MP4 或 WMV(有关受支持格式的列表,请参阅 Media Services Encoder 支持的格式)。

  2. 将夹层文件编码为 H.264 MP4 自适应比特率集。

    note备注
    建议你始终将夹层文件编码为自适应比特率 MP4 集,然后使用动态打包静态封装将该集转换为所需的格式。

    如果要将夹层文件直接编码为平滑流,可以使用 更新保留单元类型和提高编码 RU中所述的任何“平滑流”预设。但是,不建议这样做,除非夹层文件非常小。

    如果要将 WMV 文件转换为平滑流,则必须先将该文件编码为 H.264。WMV 是一种通常具有 ASF 容器格式的视频编解码器。H.264 是一种可与 MP4 容器格式一起使用的视频编解码器。平滑流使用 MP4 的一种变体,称为分片 MP4 或 f-mp4。平滑流是一种自适应流格式,它需要一组不同比特率并且全都使用在比特率之间对齐的碎片进行编码的文件。可以将一组使用对齐的碎片编码的 MP4 文件转换为 f-mp4,而无需重新编码,但是对于 WMV 文件,情况并非如此。有关详细信息,请参阅 Smooth Streaming Technical Overview(平滑流技术概述)。 

  3. 通过创建点播定位符来发布包含自适应比特率 MP4 集的资产。

  4. 将内容传送到客户端。使用动态打包传送相应格式的内容(例如,MPEG DASH、平滑流和 HLS)。

    如果要保护你的内容,请参阅保护媒体部分中的主题。

本主题介绍上载 MP4 文件并使用 Azure Media Encoder 生成 H.264 MP4 自适应比特率集。它还介绍如何创建 MPEG DASH、HLS 和平滑流 URL。

以下主题说明了如何设置 Media Services 部署。

  1. Setup for Development on the Media Services SDK for .NET

    请注意,本主题中的代码使用 Azure Media Services .NET SDK Extensions。Media Services .NET SDK Extensions 是一组扩展方法和帮助器函数,可简化代码,并令使用 Media Services 进行开发变得更加容易。

  2. 使用 Media Services SDK 连接到 Media Services

以下示例说明了如何基于 "H264 Adaptive Bitrate MP4 Set 720p" 预设字符串创建编码作业。可以在主题 更新保留单元类型和提高编码 RU中找到预设字符串的列表。

本部分中的代码执行以下操作:

  1. 上载单个 .mp4 文件。

  2. 将 .mp4 文件编码为一组自适应比特率 MP4。

    将你的资产编码为 H.264 自适应比特率集后,你便可以利用动态封装了。动态打包允许你使用指定的协议传送流,而无需进一步封装。

  3. 通过创建点播定位器来发布资产。

  4. 获取 MPEG DASH、平滑流和 HLS 流 URL。有关详细信息,请参阅使用用于 .NET 的 Media Services SDK 传送资产

确保更新该代码,以便指向输入 MP4 文件所在的文件夹。

private static readonly string _mediaFiles =
Path.GetFullPath(@"../..\Media");

private static readonly string _singleMP4File =
    Path.Combine(_mediaFiles, @"SingleMP4\BigBuckBunny.mp4");

此示例使用 Azure Media Services .NET SDK Extensions。 

using Microsoft.WindowsAzure.MediaServices.Client;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace MediaServicesPackaging
{
    class Program
    {
        private static readonly string _mediaFiles =
            Path.GetFullPath(@"../..\Media");

        private static readonly string _singleMP4File =
            Path.Combine(_mediaFiles, @"SingleMP4\BigBuckBunny.mp4");

        private static MediaServicesCredentials _cachedCredentials = null;
        private static CloudMediaContext _context = null;

        // Media Services account information.
        private static readonly string _mediaServicesAccountName =
            ConfigurationManager.AppSettings["MediaServicesAccountName"];
        private static readonly string _mediaServicesAccountKey =
            ConfigurationManager.AppSettings["MediaServicesAccountKey"];

        static void Main(string[] args)
        {
            // Create and cache the Media Services credentials in a static class variable.
            _cachedCredentials = new MediaServicesCredentials(
                            _mediaServicesAccountName,
                            _mediaServicesAccountKey);

            // Use the cached credentials to create CloudMediaContext.
            _context = new CloudMediaContext(_cachedCredentials);

            // Use the SDK extension method to create a new asset by 
            // uploading a mezzanine file from a local path.
            IAsset asset = _context.Assets.CreateFromFile(
                _singleMP4File,
                AssetCreationOptions.None,
                (af, p) =>
                {
                    Console.WriteLine("Uploading '{0}' - Progress: {1:0.##}%", af.Name, p.Progress);
                });

            // Encode an MP4 file to a set of multibitrate MP4s.
            IAsset assetMultibitrateMP4s =
                EncodeMP4ToMultibitrateMP4s(asset);

            // Publish the asset.
            _context.Locators.Create(
                LocatorType.OnDemandOrigin,
                assetMultibitrateMP4s,
                AccessPermissions.Read,
                TimeSpan.FromDays(30));

            // Get the URLs.
            Console.WriteLine("Smooth Streaming URL:");
            Console.WriteLine(assetMultibitrateMP4s.GetSmoothStreamingUri().ToString());
            Console.WriteLine("MPEG DASH URL:");
            Console.WriteLine(assetMultibitrateMP4s.GetMpegDashUri().ToString());
            Console.WriteLine("HLS URL:");
            Console.WriteLine(assetMultibitrateMP4s.GetHlsUri().ToString());
        }

        public static IAsset EncodeMP4ToMultibitrateMP4s(IAsset asset)
        {
            // Create a new job.
            IJob job = _context.Jobs.Create("Convert MP4 to Smooth Streaming.");

            // In Media Services, a media processor is a component that handles a specific processing task, 
            // such as encoding, format conversion, encrypting, or decrypting media content.
            //
            // Use the SDK extension method to  get a reference to the Azure Media Encoder.
            IMediaProcessor encoder = _context.MediaProcessors.GetLatestMediaProcessorByName(
                MediaProcessorNames.AzureMediaEncoder);

            // Add task 1 - Encode single MP4 into multibitrate MP4s.
            ITask adpativeBitrateTask = job.Tasks.AddNew("MP4 to Adaptive Bitrate Task",
                encoder,
                "H264 Adaptive Bitrate MP4 Set 720p",
                TaskOptions.None);

            // Specify the input Asset
            adpativeBitrateTask.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 in the clear (unencrypted).
            adpativeBitrateTask.OutputAssets.AddNew("Multibitrate MP4s",
                                    AssetCreationOptions.None);

            // Submit the job and wait until it is completed.
            job.Submit();
            job = job.StartExecutionProgressTask(
                j =>
                {
                    Console.WriteLine("Job state: {0}", j.State);
                    Console.WriteLine("Job progress: {0:0.##}%", j.GetOverallProgress());
                },
                CancellationToken.None).Result;

            // Get the output asset that contains the smooth stream.
            return job.OutputMediaAssets[0];
        }
    }
}

构建程序并运行。

另请参阅

本文是否对您有所帮助?
(1500 个剩余字符)
感谢您的反馈
Microsoft 正在进行一项网上调查,以了解您对 MSDN 网站的意见。 如果您选择参加,我们将会在您离开 MSDN 网站时向您显示该网上调查。

是否要参加?
显示:
© 2015 Microsoft