Windows Azure

透過 Windows Azure Media Services 使視訊內容大眾化

Bruno Terkaly
Ricardo Villalobos

下載代碼示例

定于驚人的增長,在未來幾年內的明確無誤的趨勢之一是流式視頻內容。根據思科視覺網路索引 (VNI) 2011年,與該活動相關的互聯網流量將四倍,到 2015 年。多因素在後面這種現象,包括:減少存儲成本 ; 可擴展的雲計算和存儲資源 ; 高頻寬網路 ; 和大量的視頻功能的設備,如平板電腦和智慧手機設備。創建、 編碼和分發視頻,從未更實際和負擔得起,甚至隨意的愛好者。

有正在視頻內容的方式正在發生重大戰役交付,並受版權法的保護。我們很多人目睹了音樂產業經歷令人驚異的轉型,移動到基於互聯網的媒體公司大唱片公司的權力。主要運營商和電纜供應商今天關注新興增長的視頻點播和使用互聯網管道分發,包括 YouTube、 Ustream 和 justin.tv,僅舉幾例。

微軟不袖手旁觀坐所有出現這種情況。在 2012 年 5 月,這家軟體公司發佈 Windows Azure,這將有助於使民主化視頻創建、 管理和交付給人民群眾的新媒體服務功能。Windows Azure 媒體服務 (只是"媒體服務"以下簡稱為簡潔起見) 支援許多不同的裝置類型,從到高端視頻工作站的平板電腦的智慧手機。此組的功能 — — 以前代號為"靈氣"— — 使個人開發者和企業能夠構建基於雲計算的媒體解決方案,用於接收、 處理、 管理和提供媒體內容。

解決問題

這些新的媒體服務功能自動化、 標準化和具成本效益的解決方案帶來的媒體管理空間,大大降低壁壘和複雜性了通過提供三個主要好處:

  1. 自動的可擴充性,通過利用基於使用者需求的雲計算提供了,包括所增加的需求,容量帶來的好處。
  2. 基於 rest 風格的 API,使開發人員能夠創建、 管理和維護方便的自訂工作流的 Microsoft.net 框架用戶端庫以及豐富可程式設計介面。
  3. 包括元件可以插入到上述工作流的任何一步的多個公司的合作夥伴生態系統。

這些全面的媒體服務的創建、 管理和分發內容的公司提供的各種共同問題解決方案。第一個是成本,因為建立一個能夠播放視頻資料中心是昂貴。無需提供伺服器、 編碼器、 網路設備和相關的軟體進入代表高阻隔。媒體服務解決的第二個問題是自訂工作流的全行業的問題。許多公司在媒體領域創造了自己專有的業務合同,因此很難跨不同的供應商使用多種格式和協定協調相關的服務。規範視頻獲取處理的方式提高協調和生產力,當您有多個參與者在創建和管理的內容。

開放標準

媒體服務基於開放的標準,意味著他們可以利用的幾乎任何用戶端,包括 JAVA,PHP,目標-C 與 jQuery,僅舉幾例。可通過一個通用的 rest 風格 API,利用開放資料協定 (OData),以説明靈活的查詢功能完整套件的功能。也是.net C# SDK — — 建立在 rest 風格的 API — — 的便利和簡化了對框架的訪問為使用這種語言的開發人員 (參見圖 1)。

圖 1 的兩種方法以程式設計方式使用 Windows 天青媒體服務

其餘/OData API

開發人員可以通過代表性狀態傳輸 (REST) API 層訪問媒體服務元件。其餘部分基於 HTTP,因為它可以消耗從幾乎在任何地方使用多種語言、 應用程式和平臺。簡而言之,其餘 API 是跨 Web 訪問媒體服務層的普及、 公共、 程式設計介面。

休息是構建基於開放標準的應用程式的網路用戶端-伺服器體系結構策略。其餘部分提供了一個無國籍、 緩存和標準協定 (HTTP) 發送網路電腦之間的資訊。

.NET API

當然,也有.net 用戶端 SDK (該換行的其餘部分 API 呼叫,並簡化了生成基於.net 的媒體服務用戶端應用程式的過程)。

這篇文章將側重.net API。以後的文章將解決其餘部分為基礎的辦法。

利用媒體服務的 API

為了更好地理解 Windows Azure 的媒體服務功能的好處,這篇文章著重具體的情況。想像一下,需要具有多個家庭成員或朋友,他們可能有多種多樣的行動裝置共用的家庭視頻。圖 2 顯示了向世界提供自訂處理視頻內容所需的整體工作流。

Overall Workflow Required to Distribute Video Content
分發視頻內容所需的圖 2 整體工作流

饡撽蟘咘

上傳和編碼的內容

讓我們從開始分發視頻內容的基本任務。圖 3 中的代碼來實現兩個重要目標的視頻作品的人。第一個是要上載的原始內容,所以它可以處理。第二個目標是實際進行編碼它可由多個設備使用的這種方式中的內容。有很多不同格式的視頻,如 MPEG、 MPEG-2 (QuickTime)、 RealMedia、 H.264 (MP4) 和 Windows 媒體,只是其中的幾個 — — 甚至 youtube 上有其自己的編碼格式。編碼格式不是平等的。其中很多被為了小,從而實現快速 Web 下載和渲染。其他人,如 H.264,強調品質無視頻檔的大小的關切。

圖 3 上載和執行編碼作業

static void Main(string[] args)
{
  // Part 1 - Connect to Media Services
  //          Setup upload progress event
  //          Upload a video to encode
  CloudMediaContext mediaContext =
    new CloudMediaContext("[ ACCOUNT NAME ]","[ ACCOUNT KEY ]");
  mediaContext.Assets.OnUploadProgress += Assets_OnUploadProgress;
  var asset = mediaContext.Assets.Create(    
    @"C:\windows\Performance\WinSat\winsat.wmv");
  // Part 2 - Create a task, specify encoding details
  Console.Clear();
  IJob job = mediaContext.Jobs.CreateJob("Sample Job");
  var expressionEncoder = mediaContext.MediaProcessors.Where(
    mp => mp.Name == "Expression Encoder").Single();
  var task = job.Tasks.Add(
    mediaProcessor: expressionEncoder,
    configuration: "H.264 HD 720p VBR");
  task.Inputs.Add(asset);
  task.Outputs.Add("Sample Task Output Asset");
  // Part 3 - Submit the encoding job to begin processing
  while (job.State != JobState.Finished)
  {
    job = mediaContext.Jobs.Refresh(job.Id);
    Console.SetCursorPosition(0, 0);
    Console.WriteLine("Job Name: " + job.Name);
    Console.WriteLine("Job ID: " + job.Id);
    Console.WriteLine();
    Console.WriteLine("Job State: {0,-20}", job.State);
    Console.WriteLine("Task Progress: {0:0.00}%  ",
      job.Tasks.Single().Progress);
    Thread.Sleep(500);
  }
  Console.WriteLine();
  Console.WriteLine("Job Complete!");
  Console.ReadLine();
}
// Part 4 - Display completion progress (See Part 1, where the callback was set up)
static void Assets_OnUploadProgress(object sender, 
  UploadProgressEventArgs e)
{
  Console.WriteLine(e.Progress);
}

圖 4 說明按照章節標記通過部分 4 部分 1 圖 3 中的代碼。

在圖 3 中 (請參閱件 1-4) 的原始程式碼圖 4 評論

第 1 部分

這段代碼來實現三個基本目標:

1.創建一個 CloudMediaCoNtext 物件,提供對介質服務進行身份驗證的憑據。在代碼的其餘部分使用此上下文管理和處理媒體資產。

2.設置調用 Assets_OnUploadProgress,用於向使用者上載過程完成的百分比報到的回檔代碼。

3.上載原始視頻檔 (winsat.wmv),以便可以對其進行處理。

注意:這裡使用的術語是"資產",在這種情況下,指的是原始視頻。

第 2 部分 此代碼的目標是創建一項任務,其中包括媒體處理器、 一個配置,並輸入和輸出。請注意編碼進行配置設置為"H.264 HD 720p VBR"。我們將使用微軟的表達編碼器。其他媒體處理器會提供額外的媒體行業合作夥伴添加除媒體服務的價值。
第 3 部分 這是實際處理的開始位置。你能想到的是具有一組任務的工作流的工作。任務可以連結在一起,它們可以並行運行。
第 4 部分 此代碼是只需獲取視頻上傳過程中自動執行的回檔。它通常用來上載過程完成的百分比向警方報到。

管理內容

基於視頻的專案管理的挑戰之一是跟蹤的所有資產、 工作和任務。製作內容往往涉及幾十個原始檔案和潛在數百個編碼輸出作為創建的更多。能夠跟蹤和定位為額外的處理特定的項可以是一個令人生畏的體驗。自動化這一過程與標準的介面是改變遊戲規則。媒體服務中的管理介面將打開的門更密切的協作,利益攸關者,使其能夠更加有效地協調長時間運行的工作流。CloudMediaCoNtext 物件提供了直觀的介面,來查找任何與該工作流,舉辦一系列的集合,可以使用常見的庫,如 LINQ 查詢作為關聯的元素。

圖 5 中的代碼演示如何迴圈通過資產和顯示視頻檔以及其他檔案類型如圖像資訊的能力。請注意上下文物件擁有的資產的集合和資產的物件具有檔物件的集合。

各類資產相關帳戶內的圖 5

static void Main(string[] args)
{
  // Part 1 - Connect to Media Services
  //          Loop through assets, displaying file information
  CloudMediaContext mediaContext = 
    new CloudMediaContext("[ ACCOUNT NAME ]",
    "[ ACCOUNT KEY ]");
  Console.WriteLine("ASSET INFORMATION");
  foreach (IAsset asset in mediaContext.Assets)
  {
    // Display the collection of assets.
Console.WriteLine("Asset ID: " + asset.Id);
    Console.WriteLine("Name: " + asset.Name);
    // Display the files associated with each asset.
foreach (IFileInfo fileItem in asset.Files)
    {
      Console.WriteLine("File Name: " + fileItem.Name);
      Console.WriteLine("File Create Date: " + fileItem.Created);
      Console.WriteLine("File Size: " + fileItem.ContentFileSize);
    }
  }
}

圖 6 中的代碼說明了執行 LINQ 查詢以搜索特定資產的能力。 牢記成千上萬的檔有可能被託管,像這樣的搜索功能可以極大的説明。

圖 6,令人驚歎的 LINQ 資產使用的名稱或 ID 搜索時純樸

// Returns an asset, given an asset name
static IAsset GetAssetNameFromContext(
  CloudMediaContext mediaContext, string assetName)
{
  IAsset asset = mediaContext.Assets.Where(a => a.Name ==
    assetName).FirstOrDefault();
  if (asset != null)
    return asset;
  else
    return null;
}
// Returns an asset, given an asset Id
static IAsset GetAssetIdFromContext(
  CloudMediaContext mediaContext, string assetId)
{
  IAsset asset = mediaContext.Assets.Where(a => a.Id ==
    assetId).FirstOrDefault();
  if (asset != null)
    return asset;
  else
    return null;
}

訪問策略

控制哪些使用者能夠查看和訪問特定資產是架構的一種內置的能力的媒體服務。 要控制安全許可權,內容所有人可以以程式設計方式指定訪問策略,如讀/寫許可權,以及多長時間訪問將是可用的詳細資訊指定的位置。 這些都是與其他視頻的利益相關者共用的工作流的上下文中的強大功能。

這一節演示如何執行基本任務,通過訪問策略,如創建並將它們分配給某項資產,以及列出已創建的。 圖 7 所示的目的是代碼的要成立一個"讀"的政策,允許存取的只有 30 分鐘的視頻。 代碼開始通過上傳 winsat.wmv。 從那裡,創建是一個新的訪問策略,稱為 CanReadFor30Minutes,這意味著僅在上載過程的 30 分鐘內可以讀取該檔。 下一步是要連結到的上傳的視頻檔的訪問策略。

圖 7 暫時揭露一些視頻下載

static void Main(string[] args)
{
  // Part 1 - Specify an asset to upload
  //          Connect to Media Services
  string inputFilePath =
    @"C:\windows\Performance\WinSat\winsat.wmv";
  CloudMediaContext mediaContext =
    new CloudMediaContext("[ ACCOUNT NAME ]", "[ ACCOUNT KEY ]");
  // Part 2 - Upload an asset
  //          Create a policy for the asset
  //          Link access policy to asset
  IAsset asset = mediaContext.Assets.Create(inputFilePath);
  // Because this is a single-file asset, get the name of first file.
string fileName = asset.Files[0].Name;
  IAccessPolicy readPolicy = mediaContext.AccessPolicies.Create(
    "CanReadFor30Minutes",
    TimeSpan.FromMinutes(30),
    AccessPermissions.Read);
  // Part 3 - Define a locator based on the read policy
  //          and expiration date
  //          Print the path for the locator you created
  //          Get the locator path Uri
  //          Build the full path to the file associated
  //          with the locator.
ILocator locator = mediaContext.Locators.CreateSasLocator(
    asset, readPolicy);
  Console.WriteLine("Locator path: " + locator.Path);
  var uriBuilder = new UriBuilder(locator.Path);
  uriBuilder.Path += Path.AltDirectorySeparatorChar + fileName;
  Uri fullUrl = uriBuilder.Uri;
  // Part 4 - Print the full path to the file
  Console.WriteLine("Full URL to file: " + fullUrl);
}

定位器是持續其位置表示為一個 URI 的策略檔的副本。 定位器允許訪問該政策所指明的條款下的資產。 在這種情況下,要訪問的資產 (上傳視頻) 30 分鐘的時間內,我們需要使用完整的 URL,以及定位器檔。 請參見圖 7 中的 fullUrl。

下載處理的資產

最後,圖 8 中的目的是代碼的將視頻內容下載到本機存放區。 在這種情況下,H.264 編碼生成的輸出,從存儲為 winsat.wmv 的原始視頻檔 winsat.mp4。 您可以調用該函數,像這樣:

DownloadAsset ("nb:cid:UUID:a0297fe4-7080-4393-b874-7ddf0f759c40"、"c:\temp"@) ;

圖 8 從 Windows 天青媒體服務下載資產

static void DownloadAsset(string assetId, 
    string outputMediaFilesFolder)
{
  // Part 1 - Connect to Media Services
  //          Get an existing asset based on assetId passed in.
CloudMediaContext mediaContext =
    new CloudMediaContext("[ ACCOUNT NAME ]","[ ACCOUNT KEY ]");
  IAsset asset = mediaContext.Assets.Where(a => a.Id ==
    assetId).SingleOrDefault();
  // Part 2 - If the asset exists, download the first file in the asset
  //          Download to outputMediaFilesFolder      
  if (asset != null)
  {
    Console.WriteLine("Asset name: " + asset.Name);
    IFileInfo theFile = asset.Files.FirstOrDefault();
    // You could iterate through the asset.Files collection with a
    // foreach statement, and download all files for assets that
    // have multiple files.
// Example: foreach(IFileInfo file in asset.Files)
    // Download the file to the specified local folder.
if (theFile != null)
      theFile.DownloadToFile(Path.GetFullPath(outputMediaFilesFolder +
        Path.DirectorySeparatorChar + theFile.Name));
    else
      Console.WriteLine("No files available for this asset.");
  }
  else
  {
    Console.WriteLine("Asset not available.");
  }
}

Winsat.mp4 的 assetId 是 nb:cid:UUID:a0297fe4-7080-4393-b874-7ddf0f759c40。它是由其 assetId 請求的可下載的資源和指定目的檔案夾,下載的簡單情況。

雲計算的好處

Windows Azure 的媒體服務功能接近尾聲了,簡化編碼並分發到多個設備或需要不同的格式和各項決議的 Web 管道的視頻內容的過程。這被通過利用雲計算產品,其中包括基於需求變化的計算和存儲可擴充性的好處。這一點,以及豐富的基於 REST API 和.net 用戶端庫,方便創建、 管理和維護,可以增強元件在一個龐大的合作夥伴生態系統中創建的工作流的過程。

媒體服務代表的巨大飛躍在生產、 管理和提供視頻內容,使您能夠自動化和齊心協力各種各樣的數位資產並組織他們在一個集中的位置或甚至分散的位置。隨著視頻準備在未來幾年內在 Web 上的顯著增長,媒體服務將出現在完美的時刻。

稍後我們將涵蓋其餘 API 的詳細資訊,以及一些協力廠商支援自訂編碼器和高端功能。

Bruno Terkaly 是微軟的開發人員宣傳員。他深入的知識來自于多年的經驗在欄位中,編寫代碼中使用大量的平臺、 語言、 框架、 Sdk、 庫和 Api。他花時間編寫代碼,博客,給現場演示,生成基於雲計算的應用程式,特別使用 Windows Azure 平臺。

Ricardo Villalobos 是超過 15 年的經驗設計和供應鏈管理行業中創建應用程式的公司經驗豐富的軟體建築師。他從達拉斯大學供應鏈管理中持有不同的技術認證,以及一個 mba 學位,作為微軟的 Windows Azure 建築師福音工作。

由於下面的技術專家,檢討這篇文章:John DeutscherSamuel NgTim Teebken