エクスポート (0) 印刷
すべて展開

Media Services SDK for .NET を使用して資産を配信する

更新日: 2013年4月

このトピックでは、メディア コンテンツをクライアントに配信する際の最も一般的な 3 つのオプションについて説明します。

  • 以下のいずれかの形式でアダプティブ コンテンツをストリーミングする:MPEG DASH、Apple HTTP Live Streaming (HLS)、Smooth Streaming。

    ストリーミング URL を作成したら (このトピックで説明する手順で)、以下のプレーヤーを使用してそれらをテストすることができます。

    Smooth Streaming URL をテストするには、smf.cloudapp.net/healthmonitor プレーヤーを使用します。

    MPEG DASH URL をテストするには、dashif.org/reference/players/javascript/ プレーヤーを使用します。

    HLS URL をテストするには、Safari、iOS デバイスまたは 3ivx-hls-player を使用します。

  • プログレッシブ ダウンロードの MP4 ファイルを使用します。

  • アセット ファイルをローカル コンピューターにダウンロードする。

メディア コンテンツの配信に関する情報、概念、用語の詳細については、「コンテンツの配信」を参照してください。

Warning警告
Media Services では、ストリーミング コンテンツの URL の構築に IAssetFile.Name プロパティの値を使用します (たとえば、http://{WAMSAccount}.origin.mediaservices.windows.net/{GUID}/{IAssetFile.Name}/streamingParameters など)。このため、パーセント エンコーディングは許可されていません。Name プロパティの値には、次の文字は使用できません パーセント エンコーディング予約文字:!*'();:@&=+$,/?%#[]"。また、「.」はファイル名拡張子に 1 つしか使用できません。

次のトピックでは、Media Services 開発用のセットアップ方法について説明します。

  1. Media Services SDK for .NET での開発のセットアップ

    このトピックのコードでは、Azure Media Services .NET SDK Extensions が使用されています。Media Services .NET SDK Extensions には、コードを簡略化し、Media Services を使用した開発を簡単にする一連の拡張メソッドやヘルパー関数が含まれています。

  2. Media Services SDK を使用して Media Services に接続する

すでに Media Services アカウントに保存されている資産 (Assets コレクション経由で利用可能) を配信 (ダウンロードまたはストリーム) できます。また、ジョブのエンコードまたはパッケージを実行して生成した資産 (OutputMediaAssets コレクション経由で利用可能) をダウンロードまたはストリームすることもできます。このトピックの例では、ジョブの出力メディア資産へのアクセス方法と配信方法について説明します。

このセクションのコードは、次の処理を実行します。

  1. 新しい資産を作成し、ローカル ディレクトリから中間 MP4 ファイルをアップロードする。

  2. 1 つのタスクでジョブを準備し、以前の中間資産をマルチビットレート資産にトランスコードする。

  3. ジョブを送信し、完了するまで待機する。

  4. エンコーディング ジョブを生成した出力資産を取得する。

  5. 配信元ロケーターを作成して出力資産を発行する。

  6. アダプティブ ストリーミング用に Smooth Streaming、HLS、MPEG-DASH の URL を生成する。

    一連のアダプティブ ビットレートの MP4 ファイルに基づいてコンテンツをストリームするには、まず 1 つ以上のオンデマンド ストリーミングの予約ユニットを取得する必要があります。詳細については、「Dynamic Packaging」を参照してください。

  7. プログレッシブ ダウンロードと、ローカル ディレクトリへのファイルのダウンロードに使用する SAS ロケーターを作成する。

    プログレッシブ ダウンロードするコンテンツは暗号化できません。

  8. 資産内の各 MP4 ファイルのプログレッシブ ダウンロード URL を生成する。

  9. ローカル フォルダーに出力資産をダウンロードする。

noteメモ
このサンプルでは、Azure Media Services .NET SDK Extensions を使用します。SDK extensions では、詳細の多くが非表示になります。メソッドの実装方法を確認する場合は (次のメソッドによるストリーミング URL の構築方法など:GetSmoothStreamingUri(), GetHlsUri(), andGetMpegDashUri())、次の github にあるコードで参照できます:azure-sdk-for-media-services-extensions

コードを更新して、入力 MP4 ファイルが置かれているフォルダーをポイントするようにしてください。

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

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

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 Microsoft.WindowsAzure.MediaServices.Client;


namespace MediaServicesDeliveringContent 
{ 
    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) 
        {
            _cachedCredentials = new MediaServicesCredentials(_mediaServicesAccountName,
                                                                                _mediaServicesAccountKey);
            _context = new CloudMediaContext(_cachedCredentials); 

            Console.WriteLine("Creating new asset from local file..."); 
 
            // Create a new asset and upload a mezzanine file from a local path. 
            IAsset inputAsset = _context.Assets.CreateFromFile(
                _singleMP4File, 
                AssetCreationOptions.None, 
                (af, p) => 
                { 
                    Console.WriteLine("Uploading '{0}' - Progress: {1:0.##}%", af.Name, p.Progress); 
                }); 
 
            Console.WriteLine("Asset created."); 
 
            // Prepare a job with a single task to transcode the previous mezzanine asset 
            // into a multi-bitrate asset. 
            IJob job = _context.Jobs.CreateWithSingleTask( 
                MediaProcessorNames.WindowsAzureMediaEncoder, 
                MediaEncoderTaskPresetStrings.H264AdaptiveBitrateMP4Set720p, 
                inputAsset, 
                "Sample Adaptive Bitrate MP4", 
                AssetCreationOptions.None); 
 
            Console.WriteLine("Submitting transcoding job..."); 
 
            // 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; 
 
            Console.WriteLine("Transcoding job finished."); 
             
            // The OutputMediaAssets[0] contains the first 
            // (and in this case the only) output asset 
            // produced by the encoding job.
            IAsset outputAsset = job.OutputMediaAssets[0]; 
 
            Console.WriteLine("Publishing output asset..."); 
 
            // Publish the output asset by creating an Origin locator.  
            // Define the Read only access policy and
            // specify that the asset can be accessed for 30 days.  
            _context.Locators.Create( 
                LocatorType.OnDemandOrigin, 
                outputAsset, 
                AccessPermissions.Read, 
                TimeSpan.FromDays(30));

            // Generate the Smooth Streaming, HLS and MPEG-DASH URLs for adaptive streaming.  
            Uri smoothStreamingUri = outputAsset.GetSmoothStreamingUri();
            Uri hlsUri = outputAsset.GetHlsUri();
            Uri mpegDashUri = outputAsset.GetMpegDashUri();

            // To stream your content based on the set of 
            // adaptive bitrate MP4 files, you must first get 
            // at least one On-demand Streaming reserved unit. 
            // For more information, see http://msdn.microsoft.com/en-us/library/jj889436.aspx.
            Console.WriteLine("Output is now available for adaptive streaming:");

            // Show the streaming URLs. 
            Console.WriteLine(smoothStreamingUri);
            Console.WriteLine(hlsUri);
            Console.WriteLine(mpegDashUri);
                
            //
            // Create a SAS locator that is used for progressive download
            // or to download files to a local directory.  
            // The content that you want to progressively download cannot be encrypted.
            _context.Locators.Create( 
                LocatorType.Sas, 
                outputAsset, 
                AccessPermissions.Read, 
                TimeSpan.FromDays(30)); 

            // Get all the MP4 files in the output asset.
            IEnumerable<IAssetFile> mp4AssetFiles = outputAsset
                    .AssetFiles
                    .ToList()
                    .Where(af => af.Name.EndsWith(".mp4", 
                        StringComparison.OrdinalIgnoreCase));

            // Generate the Progressive Download URLs for each MP4. 
            List<Uri> mp4ProgressiveDownloadUris = 
                mp4AssetFiles.Select(af => af.GetSasUri()).ToList();

            Console.WriteLine("You can progressively download the following MP4 files:");
            mp4ProgressiveDownloadUris.ForEach(uri => Console.WriteLine(uri)); 
 
             string outputFolder = Path.Combine(_mediaFiles, @"job-output");

            if (!Directory.Exists(outputFolder)) 
            { 
                Directory.CreateDirectory(outputFolder); 
            } 
 
            Console.WriteLine("Downloading output asset files to local folder..."); 
 
            // Download the output asset to a local folder. 
            outputAsset.DownloadToFolder( 
                outputFolder, 
                (af, p) => 
                { 
                    Console.WriteLine("Downloading '{0}' - Progress: {1:0.##}%", af.Name, p.Progress); 
                }); 
 
            Console.WriteLine("Downloaded files are located in '{0}'.", Path.GetFullPath(outputFolder)); 
        } 
    } 
} 

関連項目

表示:
© 2014 Microsoft