匯出 (0) 列印
全部展開
本主題尚未接受評分 - 為這個主題評分

使用 Media Services SDK for .NET 傳遞資產

更新日期: 2014年2月

本主題是 Windows Azure Media Services 標題為「Building Applications with the Media Services SDK for .NET」之系列文章的一部分,介紹一些傳遞選項,以傳遞您先前新增至 Media Services 的媒體資產。您可以在許多應用狀況中傳遞 Media Services 內容。您可以下載媒體資產,或者使用定位器 URL 存取資產 (本主題所述內容即為此類傳遞狀況)。您可以將媒體內容傳送至另應用程式,或是另內容提供者。如果要提升效能與擴充性,也可以使用內容傳遞網路 (CDN) (如 Azure CDN) 傳遞內容。傳遞的內容可以包含單純儲存在 Media Services 中的媒體資產,如「使用 Media Services SDK for .NET 擷取資產」主題所述。或是,可以包含您也以各種方式處理或編碼過的媒體資產,如「以適用於 .NET 的 Media Service SDK 處理資產」主題所述。在最新版 Media Services 中,傳遞內容的選項有:下載、提供各種定位器 URL 以直接存取需求資產,或是串流伺服器上或 Windows Azure CDN 上的資產。如需傳遞選項包含即時資料流內容的近期推出版本的詳細資訊,請參閱 Media Services 論壇對話「Media Services 功能狀態:未來的版本

本主題介紹如何完成傳遞 Media Services 內容的下列工作:

note附註
若要處理任何媒體資產,必須先有 Media Services 伺服器內容的參考,如「透過 Media Services SDK 連線至 Media Services」主題所述。內容物件在下列程式碼範例中以名為 _context 的變數代表。

下載媒體資產

本節中的程式碼範例顯示如何從 Media Services 下載媒體資產。您可以下載 Assets 集合中提供的任何儲存資產。另一種典型下載狀況是從 OutputMediaAssets 集合下載資產,此集合是執行工作後產生的一或多個媒體資產集。此程式碼範例顯示如何從工作下載輸出媒體資產,不過您可以應用相同的方法來下載其他資產。未能在 12 小時內完成的下載將會失敗。

以下程式碼範例顯示如何下載從工作產生的輸出資產。程式碼只會下載 OutputMediaAssets 集合的第資產。不過您可以逐一查看此集合,以下載存在的多個資產。程式碼針對每個資產,在其 AssetFiles 集合中執行迴圈,並下載每個別檔案。

note附註
此範例也會呼叫 GetJob 方法以取得工作參考,如「使用 Media Services SDK for .NET 管理資產」主題所示。

static IAsset DownloadAssetToLocal(string jobId, string outputFolder)
{
    // This method illustrates how to download a single asset. 
    // However, you can iterate through the OutputAssets
    // collection, and download all assets if there are many. 

    // Get a reference to the job. 
    IJob job = GetJob(jobId);
    // Get a reference to the first output asset. If there were multiple 
    // output media assets you could iterate and handle each one.
    IAsset outputAsset = job.OutputMediaAssets[0];

    IAccessPolicy accessPolicy = _context.AccessPolicies.Create("File Download Policy", TimeSpan.FromDays(30), AccessPermissions.Read);
    ILocator locator = _context.Locators.CreateLocator(LocatorType.Sas, outputAsset, accessPolicy);

    BlobTransferClient blobTransfer = new BlobTransferClient
    {
        NumberOfConcurrentTransfers = 10,
        ParallelTransferThreadCount = 10
    };

    var downloadTasks = new List<Task>();
    foreach (IAssetFile outputFile in outputAsset.AssetFiles)
    {
        // Use the following event handler to check download progress.
        outputFile.DownloadProgressChanged += DownloadProgress;
        string localDownloadPath = Path.Combine(outputFolder, outputFile.Name);
        Console.WriteLine("File download path:  " + localDownloadPath);
        downloadTasks.Add(outputFile.DownloadAsync(Path.GetFullPath(localDownloadPath), blobTransfer, locator, CancellationToken.None));
    }

    Task.WaitAll(downloadTasks.ToArray());

    return outputAsset;
}

static void DownloadProgress(object sender, DownloadProgressChangedEventArgs e)
{
    Console.WriteLine(string.Format("Asset File:{0}  {1}% download progress. ", ((IAssetFile)sender).Name, e.Progress));
} 

建立依需求內容的 SAS 定位器

在 Media Services 中依需求存取資產的另一種方式,是建立連結至伺服器上之資產的 URL。此 URL 稱為定位器。Media Services 中的定位器也與存取資產的以時間為基礎權限 (例如讀取、寫入及列出權限) 關聯。您能夠建立以直接存取依需求媒體資產的定位器類型,稱為共用存取簽章 (SAS) 定位器。每個資產可以有 ILocator 物件的集合,您可以使用 Locators 內容來存取這些物件。

note附註
當您使用本主題中所述的方法建立媒體內容的定位器時,由於 Azure Storage 必須處理儲存與傳播,因此可能會有 30 秒的延遲。

以下程式碼範例顯示建立工作產生之輸出資產的 SAS 定位器的必要步驟。此範例假設您已執行工作及存取其 OutputMediaAssets 集合,以取得程式碼範例中參考之 outputAsset 變數的參考。您執行此程式碼以產生輸出資產的 SAS 定位器之後,即可使用產生的 URL 直接存取 Media Services 中的檔案。如需將此程式碼加入工作的完整可執行程式碼範例,請參閱本主題開頭所提及的 Visual Studio 程式碼範例專案。

此程式碼範例會執行您在建立 SAS 定位器時所要執行的幾個主要步驟:

  • 定義存取原則。這會決定權限的類型,以及存取資產的持續時間。

  • 呼叫 CreateLocator 方法以建立 SAS 定位器 (var locator = _context.Locators.CreateLocator(LocatorType.Sas, asset, accessPolicy);)。將現有的資產 (例如工作的輸出資產)、存取原則及開始時間傳遞給方法。

    note附註
    CreateLocator 方法傳回的 URL 並非資產內之檔案的完整 URL。而只是資產的基底路徑。若要建構資產內之特定檔案的完整 URL,必須完成以下步驟。

  • 建立資產中之特定檔案的 URL。其方式是將資產中之檔案的特定檔案名稱加入定位器 Path 內容。

static void BuildAndSaveAssetSasUrlList(IAsset outputAsset)
{
    // Declare an access policy for permissions on the asset. 
    // You can call an async or sync create method. 
    IAccessPolicy policy =
        _context.AccessPolicies.Create("My 30 day readonly policy",
            TimeSpan.FromDays(30),
            AccessPermissions.Read);

    // Create a SAS locator to enable direct access to the asset 
    // in blob storage. You can call a sync or async create method.  
    // You can set the optional startTime param as 5 minutes 
    // earlier than Now to compensate for differences in time  
    // between the client and server clocks. 
    ILocator locator = _context.Locators.CreateLocator(LocatorType.Sas, outputAsset,
        policy,
        DateTime.UtcNow.AddMinutes(-5));


    // Declare a list to contain all the SAS URLs.
    List<String> fileSasUrlList = new List<String>();

    string outFilePath = Path.GetFullPath(_outputFilesFolder + @"\" + "FileSasUrlList.txt");

    // If the asset has files, build a list of URLs to 
    // each file in the asset and return. 
    foreach (IAssetFile file in outputAsset.AssetFiles)
    {
        string sasUrl = BuildFileSasUrl(file, locator);
        fileSasUrlList.Add(sasUrl);

        Console.WriteLine(sasUrl);

        // Write the URL list to a local file. You can use the saved 
        // SAS URLs to browse directly to the files in the asset.
        WriteToFile(outFilePath, sasUrl);
    }
}

static string BuildFileSasUrl(IAssetFile file, ILocator locator)
{
    // Take the locator path, add the file name, and build 
    // a full SAS URL to access this file. This is the only 
    // code required to build the full URL.
    var uriBuilder = new UriBuilder(locator.Path);
    uriBuilder.Path = uriBuilder.Path + "/" + file.Name;
            
    // Optional:  print the locator.Path to the asset, and 
    // the full SAS URL to the file
    Console.WriteLine("Locator path: ");
    Console.WriteLine(locator.Path);
    Console.WriteLine();
    Console.WriteLine("Full URL to file: ");
    Console.WriteLine(uriBuilder.Uri.AbsoluteUri);
    Console.WriteLine();


    //Return the SAS URL.
    return uriBuilder.Uri.AbsoluteUri;
}

static void WriteToFile(string outFilePath, string fileContent)
{
    StreamWriter sr = File.CreateText(outFilePath);
    sr.WriteLine(fileContent);
    sr.Close();
}

建立 Smooth Streaming 或 HLS 內容的原始定位器

在 Media Services 中,也有一種方式可以直接存取串流媒體內容。您可以建立原始定位器,它可讓您直接存取原始伺服器上的 Smooth Streaming 或 Apple HTTP 即時資料流 (HLS) 內容。與 SAS 定位器範例類似,您可以建立定位器,然後建立到特定檔案的完整 URL,然後存取內容。您使用原始定位器建立資產中之串流資訊清單檔案的完整 URL (資訊清單檔案的副檔名為 .ism)。然後您可以將 URL 提供給能夠播放串流內容的用戶端應用程式,例如 Microsoft Silverlight。

note附註
當您使用本主題中所述的方法建立媒體內容的定位器時,由於 Azure Storage 必須處理儲存與傳播,因此可能會有 30 秒的延遲。

以下程式碼範例顯示建立工作產生之輸出資產的原始定位器的必要步驟。此範例假設您已經取得包含 Smooth Streaming 檔案之資產的參考,而且程式碼中參考了名為 assetToStream 的變數。您執行此程式碼產生資產的原始定位器之後,應該就能夠使用產生的 URL 直接在串流用戶端播放器 (例如 Silverlight) 中播放串流內容。

此程式碼範例會執行您在建立原始定位器時所要執行的幾個主要步驟:

  • 取得資產中的串流資訊清單檔案的參考。這是副檔名為 .ism 的檔案。

  • 定義存取原則。這會決定權限的類型,以及存取資產的持續時間。

  • 呼叫 CreateLocator 方法 (var originLocator = _context.Locators.CreateLocator(LocatorType.OnDemandOrigin, assetToStream, policy, DateTime.UtcNow.AddMinutes(-5))) 以建立原始定位器。將含有串流媒體檔案的現有資產、存取原則及開始時間傳遞給方法。

    note附註
    CreateLocator 方法傳回的 URL 只是資產的基底路徑。若要建構串流資訊清單檔案的完整 URL,必須完成以下步驟。

  • 建立資訊清單檔案的 URL。其方式是串連定位器 Path 值與資訊清單檔案名稱。然後附加適當的格式至原始定位器路徑。如果用戶端要求的是 Smooth Streaming 格式,則在定位器路徑後附加 file.ism/Manifest 字串。如果用戶端要求的是 HLS,則附加 file.ism/Manifest(format=m3u8-aapl) 字串。

note附註
若要測試指向 Smooth Streaming 內容的原始定位器 URL,請複製程式碼範例建立的資訊清單檔案的 URL。依照「開始使用 IIS Smooth Streaming」主題下方的「安裝範例用戶端」小節所述,建立簡單的 Silverlight 播放用戶端。若要從原始定位器 URL 播放串流媒體內容,則不必依照本主題其餘部分所述設定 IIS Media Services。依照指示下載範例用戶端,並建立主控 Silverlight 以播放串流內容的簡單 HTML 頁面。依照指示將範例建立的原始定位器 URL 貼到 HTML 頁面的 MediaUrl 屬性中,並在瀏覽器中載入頁面以播放串流內容。

note附註
若要測試指向 HLS 內容的原始定位器 URL,請複製程式碼範例建立的資訊清單檔案的 URL。如果您沒有 iOS 裝置可以新增 URL,可以建立能夠在 Safari 瀏覽器中播放串流內容的簡單 HTML 頁面。建立方式請參閱「搭配 IIS Media Services 使用 Apple HTTP 即時資料流」(英文) 主題中,「建立在 Safari 中使用的 HTML 5 頁面」這一小節。

public enum MediaContentType
{
    SmoothStreaming,
    HLS
}
public static ILocator GetStreamingOriginLocator(string targetAssetID, MediaContentType contentType)
{
    // Get a reference to the asset you want to stream.
    IAsset assetToStream = GetAsset(targetAssetID);

    // Get a reference to the streaming manifest file from the  
    // collection of files in the asset. 
    var theManifest =
                        from f in assetToStream.AssetFiles
                        where f.Name.EndsWith(".ism")
                        select f;

    // Cast the reference to a true IAssetFile type. 
    IAssetFile manifestFile = theManifest.First();
            
    // Create a 30-day readonly access policy. 
    IAccessPolicy policy = _context.AccessPolicies.Create("Streaming policy",
        TimeSpan.FromDays(30),
        AccessPermissions.Read);

    // Create a locator to the streaming content on an origin. 
    ILocator originLocator = _context.Locators.CreateLocator(LocatorType.OnDemandOrigin, assetToStream,
        policy,
        DateTime.UtcNow.AddMinutes(-5));
            
    // Display some useful values based on the locator.
    // Display the base path to the streaming asset on the origin server.
    Console.WriteLine("Streaming asset base path on origin: ");
    Console.WriteLine(originLocator.Path);
    Console.WriteLine();

    // Create a full URL to the manifest file. Use this for playback
    // in smooth streaming and HLS media clients. 
    string urlForClientStreaming = originLocator.Path + manifestFile.Name + "/manifest";
    if (contentType == MediaContentType.HLS)
        urlForClientStreaming = String.Format("{0}{1}", urlForClientStreaming, "(format=m3u8-aapl)"); 

    Console.WriteLine("URL to manifest for client streaming: ");
    Console.WriteLine(urlForClientStreaming);
    Console.WriteLine();

    // Display the ID of the origin locator, the access policy, and the asset.
    Console.WriteLine("Origin locator Id: " + originLocator.Id);
    Console.WriteLine("Access policy Id: " + policy.Id);
    Console.WriteLine("Streaming asset Id: " + assetToStream.Id);

    // For convenience, write the URL to a local file. Use the saved 
    // streaming URL to browse directly to the asset in a smooth streaming client.  
    string outFilePath = Path.GetFullPath(_outputFilesFolder + @"\" + "StreamingUrl.txt");
    WriteToFile(outFilePath, urlForClientStreaming);


    // Return the locator. 
    return originLocator;
}
 

另請參閱


建置日期:

2014-04-18
本文對您有任何幫助嗎?
(剩餘 1500 個字元)
感謝您提供意見

社群新增項目

新增
Microsoft 正展開一份線上問卷調查,了解您對於 MSDN 網站的看法。 如果您選擇參加,您離開 MSDN 網站時即會顯示線上問卷調查。

您是否想要參加?
顯示:
© 2014 Microsoft. 著作權所有,並保留一切權利。