Windows Azure Media Services 標準的なVODワークフローのサンプルコード C#版

ここの説明は、MSDNドキュメントなどに譲るとしまして、さくっと動くサンプルコードを共有します。

ご参考:

以下、コード全文です。

・エラーハンドルをお願いします。

・デスクトップに、Asset IDと、SmoothStreaming、HLSのプレイヤー用のURLをファイル出力します。

・エンコードはDynamic Packaging前提です。このままでは、

Dynamic Packaging: http://msdn.microsoft.com/ja-jp/library/jj889436.aspx

using System;

using System.Configuration;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

using System.Threading;

using System.Diagnostics;

using Microsoft.WindowsAzure.MediaServices.Client;

namespace StandardWAMS

{

    class Program

    {

        //!!! CloudMediaContext はスレッドセーフではないので注意すること

        private static CloudMediaContext context = null;

        private const int MediaProcessCheckInterval = 10000;

        static void Main(string[] args)

        {

            /// ********* 1. Windows Azure Media Services 接続 ******

            Console.WriteLine(“******** 1. Windows Azure Media Services 接続 ******”);

            context = new CloudMediaContext(

                    ConfigurationManager.AppSettings[“accountName”],

                    ConfigurationManager.AppSettings[“accountKey”]

                    );

            context.ParallelTransferThreadCount = 100;


            /// ******** 2. Ingest (アップロードと登録) **************

            Console.WriteLine(“******** 2. Ingest (アップロードと登録) **************”);

            var targetFile = new FileInfo(ConfigurationManager.AppSettings[“uploadfile”]);

            // 2.1. 空のAssetを作成

            var ingestAsset = context.Assets.Create(

                targetFile.Name,

                AssetCreationOptions.StorageEncrypted);

            // 2.2. 空のAssetFileを作成

            var ingestAssetFile = ingestAsset.AssetFiles.Create(

                    targetFile.Name);

            // ***** [同期実行] *****

            // 2.3. Upload を実行します

            //ingestAssetFile.Upload(targetFile.FullName);

            // ***** 同期実行終わり *****

            // ***** [非同期実行] *****

            // 2.3. AccessPolicyを作成します。ここでは3時間のみ書き込み許可

            var uploadAccessPolicy = context.AccessPolicies.Create(targetFile.Name,

                        TimeSpan.FromHours(3),

                        AccessPermissions.Write | AccessPermissions.List);

            // 2.4. SAS Locatorを作成

            var locator = context.Locators.CreateLocator(LocatorType.Sas,

                            ingestAsset,

                            uploadAccessPolicy);

            // 2.5. Upload を実行します

            // —- ファイル転送 途中経過取得用 —-

            BlobTransferClient transferClient = new BlobTransferClient();

            transferClient.TransferProgressChanged += (s, e) =>

            {

                Console.WriteLine(” ** 経過 {0}%”, e.ProgressPercentage);

            };

            // ———————————-

            var uploadTask = ingestAssetFile.UploadAsync(

                    targetFile.FullName,

                    transferClient,

                    locator,

                    System.Threading.CancellationToken.None);

            uploadTask.Wait();

            // — この段階でファイルの転送が完了 —

            // ***** 非同期実行終わり *****

            ingestAssetFile.IsPrimary = true;

            ingestAssetFile.Update();

            WriteToFile(Environment.GetEnvironmentVariable(“USERPROFILE”) +

                                            @”\Desktop\AssetID.txt”,

                                            ingestAsset.Id);

            ///// ********* 2.10. Management

            ///// クエリの参考例

            //var ingestAssets = from a in context.Assets

            //                     where a.Id == “nb:cid:UUID:397be6d3-11ed-4bc3-b307-b10ff4051054”

            //                     select a;

            //var ingestAsset = ingestAssets.FirstOrDefault();

            //var ingestAssetFiles = from a in ingestAsset.AssetFiles

            //                      select a;

            //var ingestAssetFile = ingestAssetFiles.FirstOrDefault();

            // ******** 3. Process *********************************

            Console.WriteLine(“******** 3.Process – エンコード *********************”);

            // 3.1. Job 作成

            var job = context.Jobs.Create(“Windows Media Video  Dynamic Package エンコード : “ + DateTime.Now.ToLongTimeString());


            // ******** エンコード : WMV to fMP4

            var windowsAzureMediaEncoder = context.MediaProcessors

                                                .Where(p => p.Name == “Windows Azure Media Encoder”)

                                                .ToList().OrderBy(p => new Version(p.Version)).LastOrDefault();

            // Media Encoder の一覧

            // http://msdn.microsoft.com/en-us/library/jj129580.aspx

            // 3.2. タスクの作成

            var encodeTask = job.Tasks.AddNew(“WMV to MP4 – “ + DateTime.Now.ToLongTimeString(),

                                windowsAzureMediaEncoder,

                                “H264 Adaptive Bitrate MP4 Set SD 4×3”,

                //”H264 Broadband SD 4×3″,

                                TaskOptions.None);

            // 定義済みのTaskPreset

            // http://msdn.microsoft.com/en-us/library/jj129582.aspx

            // 3.3. 入出力Asset指定

            encodeTask.InputAssets.Add(ingestAsset);

            encodeTask.OutputAssets.AddNew(

                string.Format(“{0} – MP4:{1}”,

                    ingestAssetFile.Name,

                    DateTime.Now.ToLongTimeString()),

                AssetCreationOptions.None);

            job.StateChanged += (s, e) =>

            {

                Console.WriteLine(” ** Jobの状態が変化しました);

                Console.WriteLine(” **   Previous: “ + e.PreviousState);

                Console.WriteLine(” **   Current : “ + e.CurrentState);

            };

            // 処理時間の計測

            var sw = new Stopwatch();

            sw.Start();

            // 3.4. ジョブ実行

            job.Submit(); // 同期はPOSTまで。ジョブの実行完了まで待つわけではありません。

            // —– ジョブ実行の途中経過の取得をする設定 ———————

            var progressJobTask = job.GetExecutionProgressTask(CancellationToken.None);

            //progressJobTask.Wait();

            // ————————————————————

            var jobCompleted = false;

            // ジョブの途中経過を取得

            while (!jobCompleted)

            {

                switch (job.State)

                {

                    case JobState.Error:

                        jobCompleted = true;

                        StringBuilder errorDescription = new StringBuilder();

                        errorDescription.AppendLine(” ** 詳細:”);

                        foreach (var task in job.Tasks)

                        {

                            foreach (ErrorDetail detail in task.ErrorDetails)

                            {

                                errorDescription.AppendLine(” ** Task Id: “ + task.Id);

                                errorDescription.AppendLine(” **  Error Code: “ + detail.Code);

                                errorDescription.AppendLine(” **  Error Message: “ + detail.Message);

                            }

                        }

                        Console.WriteLine(エラーが発生しました);

                        Console.WriteLine(errorDescription);

                        Console.WriteLine(何かキーを押してください。);

                        Console.ReadLine();

                        // 完全停止

                        return;

                    case JobState.Processing:

                        Console.WriteLine(”  ** 処理中:{0} – {1}”, job.Name, DateTime.Now.ToLongTimeString());

                        foreach (var task in job.Tasks)

                        {

                            Console.WriteLine(”  ** {0} – {1:0.00}%”, task.Name, task.Progress);

                        }

                        Console.WriteLine(”  ** 10秒毎に再確認します。);

                        Console.WriteLine();

                        break;

                    case JobState.Finished:

                        jobCompleted = true;

                        break;

                    default:

                        Console.WriteLine(” *** Jobの状態: {0}”, job.State);

                        break;

                }

                Thread.Sleep(MediaProcessCheckInterval);

            }

            sw.Stop();

            Console.WriteLine(“*** エンコード処理完了 ***”);

            Console.WriteLine(” ** エンコード     実行時間: {0}”, job.RunningDuration);

            Console.WriteLine(” **  WMV to MP4 実行時間: {0}”, job.Tasks[0].RunningDuration);

            Console.WriteLine(” ** エンコード総時間:   {0}”,

                                sw.Elapsed.ToString());

            // ******** 4. Delivery *********************************

            // *** Dynamic Packagingを前提に、Smooth Streaming用、HTTP Live Streaming用のオリジンサーバーを設定しています。

            Console.WriteLine(“******** 4. Delivery *********************************”);

            // 4.1. Access Policy 作成

            var deliveryAccessPolicy = context.AccessPolicies.Create(“Streaming”,

                                    TimeSpan.FromHours(Double.Parse(ConfigurationManager.AppSettings[“PublishDurationHour”])),

                                    AccessPermissions.Read | AccessPermissions.List);

            var OutputAsset = job.OutputMediaAssets[0];

            // 4.2. Locator 作成

            var DynamicPackagingStreamingPointLocator = context.Locators.CreateLocator(

                            LocatorType.OnDemandOrigin,

                            OutputAsset,

                            deliveryAccessPolicy,

                            DateTime.UtcNow.AddMinutes(-5));

            // 4.3. プレイヤーに渡すURL生成

            var Manifest = (from f in OutputAsset.AssetFiles

                            where f.Name.EndsWith(“.ism”)

                            select f).First();

            WriteToFile(Environment.GetEnvironmentVariable(“USERPROFILE”) +

                        @”\Desktop\SSPath.txt”,

                        DynamicPackagingStreamingPointLocator.Path + Manifest.Name + “/manifest”);

            WriteToFile(Environment.GetEnvironmentVariable(“USERPROFILE”) +

                        @”\Desktop\HLSPath.txt”,

                        DynamicPackagingStreamingPointLocator.Path + Manifest.Name + “/Manifest(format=m3u8-aapl)”);

            Console.WriteLine(“******************************************************”);

            Console.WriteLine(全ての処理が終了しました。);

            Console.WriteLine(何かキーを押してください。);

            Console.ReadLine();

        }

        /// <summary>

        /// Utility: 文字列のファイル出力

        /// </summary>

        /// <param name=”outFilePath”></param>

        /// <param name=”fileContent”></param>

        static void WriteToFile(string outFilePath, string fileContent)

        {

            System.IO.StreamWriter sr = System.IO.File.CreateText(outFilePath);

            sr.Write(fileContent);

            sr.Close();

        }

    }

}

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中