匯出 (0) 列印
全部展開

使用 Media Services SDK for .NET 管理資產

更新日期: 2014年7月

本主題介紹如何完成下列的 媒體服務 管理工作 (Task):

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

時常執行的一項工作 (Task) 是取得 媒體服務 中現有資產的參考。以下程式碼範例顯示如何根據資產識別碼,從伺服器內容物件的 Assets 集合取得資產參考。

以下程式碼範例使用 Linq 查詢來取得現有 IAsset 物件的參考。

static IAsset GetAsset(string assetId)
{
    // Use a LINQ Select query to get an asset.
    var assetInstance =
        from a in _context.Assets
        where a.Id == assetId
        select a;
    // Reference the asset as an IAsset.
    IAsset asset = assetInstance.FirstOrDefault();

    return asset;
}

當您利用 媒體服務 程式碼操作處理工作 (Task) 時,往往需要根據識別碼取得現有物件的參考。以下程式碼範例顯示如何取得 IJob 集合中之 Jobs 物件的參考。

Warning警告
啟動長時間編碼工作時可能需要取得工作參考,並且需要檢查執行緒上的工作狀態。在這種情況下,當方法從執行緒傳回時,您必須擷取重新整理後的工作參考。

static IJob GetJob(string jobId)
{
    // Use a Linq select query to get an updated 
    // reference by Id. 
    var jobInstance =
        from j in _context.Jobs
        where j.Id == jobId
        select j;
    // Return the job reference as an Ijob. 
    IJob job = jobInstance.FirstOrDefault();

    return job;
}

隨著您在存放區中的資產數目增加,將資產列出將非常實用。下列程式碼範例說明如何透過伺服器上的 Assets 集合執行迴圈。程式碼範例也會將每個資產的一些屬性值寫入主控台。例如,每個資產可能包含多個媒體檔案。程式碼範例會寫出與每個資產相關聯的所有檔案。

note附註
若要在主控台中查看所有顯示的資產資訊,可以在 Visual Studio 中範例方法右大括弧上設定中斷點。否則,在您還來不及檢視資料之前,主控台就會關閉。另選項是將所有列出的資產資訊寫入檔案。隨附的專案顯示如何利用像此程式碼範例一樣列出資產的方法,將資產清單寫入檔案。


static void ListAssets()
{
    string waitMessage = "Building the list. This may take a few "
        + "seconds to a few minutes depending on how many assets "
        + "you have."
        + Environment.NewLine + Environment.NewLine
        + "Please wait..."
        + Environment.NewLine;
    Console.Write(waitMessage);

    // Create a Stringbuilder to store the list that we build. 
    StringBuilder builder = new StringBuilder();

    foreach (IAsset asset in _context.Assets)
    {
        // Display the collection of assets.
        builder.AppendLine("");
        builder.AppendLine("******ASSET******");
        builder.AppendLine("Asset ID: " + asset.Id);
        builder.AppendLine("Name: " + asset.Name);
        builder.AppendLine("==============");
        builder.AppendLine("******ASSET FILES******");

        // Display the files associated with each asset. 
        foreach (IAssetFile fileItem in asset.AssetFiles)
        {
            builder.AppendLine("Name: " + fileItem.Name);
            builder.AppendLine("Size: " + fileItem.ContentFileSize);
            builder.AppendLine("==============");
        }
    }

    // Display output in console.
    Console.Write(builder.ToString());
}

其中一項重要的相關工作,即是列出 媒體服務 中的資產及其相關工作。以下程式碼範例顯示如何列出每個 IJob 物件,再顯示每個工作 (Job) 的相關屬性、所有相關工作 (Task)、所有輸入資產及所有輸出資產。此範例中的程式碼可能對其他許多工作 (Task) 而言很實用。例如,您若是想要列出先前執行之一或多個編碼工作的輸出資產,此程式碼顯示如何存取輸出資產。有了輸出資產的參考之後,就可以利用下載或提供 URL,將內容傳遞給其他使用者或應用程式。如需傳遞資產之選項的詳細資訊,請參閱使用 Media Services SDK for .NET 傳遞資產

// List all jobs on the server, and for each job, also list 
// all tasks, all input assets, all output assets.
static void ListJobsAndAssets()
{
    string waitMessage = "Building the list. This may take a few "
        + "seconds to a few minutes depending on how many assets "
        + "you have."
        + Environment.NewLine + Environment.NewLine
        + "Please wait..."
        + Environment.NewLine;
    Console.Write(waitMessage);

    // Create a Stringbuilder to store the list that we build. 
    StringBuilder builder = new StringBuilder();

    foreach (IJob job in _context.Jobs)
    {
        // Display the collection of jobs on the server.
        builder.AppendLine("");
        builder.AppendLine("******JOB*******");
        builder.AppendLine("Job ID: " + job.Id);
        builder.AppendLine("Name: " + job.Name);
        builder.AppendLine("State: " + job.State);
        builder.AppendLine("Order: " + job.Priority);
        builder.AppendLine("==============");


        // For each job, display the associated tasks (a job  
        // has one or more tasks). 
        builder.AppendLine("******TASKS*******");
        foreach (ITask task in job.Tasks)
        {
            builder.AppendLine("Task Id: " + task.Id);
            builder.AppendLine("Name: " + task.Name);
            builder.AppendLine("Progress: " + task.Progress);
            builder.AppendLine("Configuration: " + task.Configuration);
            if (task.ErrorDetails != null)
            {
                builder.AppendLine("Error: " + task.ErrorDetails);
            }
            builder.AppendLine("==============");
        }

        // For each job, display the list of input media assets.
        builder.AppendLine("******JOB INPUT MEDIA ASSETS*******");
        foreach (IAsset inputAsset in job.InputMediaAssets)
        {

            if (inputAsset != null)
            {
                builder.AppendLine("Input Asset Id: " + inputAsset.Id);
                builder.AppendLine("Name: " + inputAsset.Name);
                builder.AppendLine("==============");
            }
        }

        // For each job, display the list of output media assets.
        builder.AppendLine("******JOB OUTPUT MEDIA ASSETS*******");
        foreach (IAsset theAsset in job.OutputMediaAssets)
        {
            if (theAsset != null)
            {
                builder.AppendLine("Output Asset Id: " + theAsset.Id);
                builder.AppendLine("Name: " + theAsset.Name);
                builder.AppendLine("==============");
            }
        }

    }

    // Display output in console.
    Console.Write(builder.ToString());
}

在 媒體服務 中,可以定義資產或其檔案的存取原則。存取原則定義檔案或資產的權限 (存取權線類型及持續時間)。在您的 媒體服務 程式碼中,通常會建立 IAccessPolicy 物件,然後將其與現有的資產產生關聯,進而定義存取原則。然後再建立 ILocator 物件,這可讓您直接存取 媒體服務 中的資產。本文件系列所附的 Visual Studio 專案包含許多程式碼範例,示範如何建立及指派存取原則與定位器給資產。

以下程式碼範例顯示如何列出伺服器上的所有存取原則,並顯示與每個原則相關的權限類型。另一種檢視存取原則的實用方式,是列出伺服器上所有的 ILocator 物件,然後您可以針對每個定位器,使用其 AccessPolicy 屬性列出相關的存取原則。

static void ListAllPolicies()
{
    foreach (IAccessPolicy policy in _context.AccessPolicies)
    {
        Console.WriteLine("");
        Console.WriteLine("Name:  " + policy.Name);
        Console.WriteLine("ID:  " + policy.Id);
        Console.WriteLine("Permissions: " + policy.Permissions);
        Console.WriteLine("==============");

    }
}

定位器是提供存取資產之直接路徑的 URL,以及定位器相關存取原則所定義的資產權限。每個資產可以在其 ILocator 屬性上,包含與其相關聯的一組 Locators 物件集合。伺服器內容也有包含所有定位器的 Locators 集合。

以下程式碼範例列出伺服器上所有的定位器。它針對每個定位器,顯示相關資產與存取原則的識別碼。也會顯示權限的類型、到期日和資產的完整路徑。

note附註
資產的定位器路徑只是資產的基底 URL。若要建立使用者或應用程式能夠瀏覽之個別檔案的直接路徑,程式碼中必須在定位器路徑加入特定的檔案路徑。如需如何加入的詳細資訊,請參閱「使用 Media Services SDK for .NET 傳遞資產」主題。

static void ListAllLocators()
{
    foreach (ILocator locator in _context.Locators)
    {
        Console.WriteLine("***********");
        Console.WriteLine("Locator Id: " + locator.Id);
        Console.WriteLine("Locator asset Id: " + locator.AssetId);
        Console.WriteLine("Locator access policy Id: " + locator.AccessPolicyId);
        Console.WriteLine("Access policy permissions: " + locator.AccessPolicy.Permissions);
        Console.WriteLine("Locator expiration: " + locator.ExpirationDateTime);
        // The locator path is the base or parent path (with included permissions) to access  
        // the media content of an asset. To create a full URL to a specific media file, take 
        // the locator path and then append a file name and info as needed.  
        Console.WriteLine("Locator base path: " + locator.Path);
        Console.WriteLine("");
    }
}


下列範例會刪除資產。

static void DeleteAsset( IAsset asset)
{
    // delete the asset
    asset.Delete();

    // Verify asset deletion
    if (GetAsset(asset.Id) == null)
        Console.WriteLine("Deleted the Asset");

}

若要刪除工作 (Job),必須檢查 State 屬性所指示的工作 (Job) 狀態。已完成或已取消的工作 (Job) 可以刪除,而其他某些狀態,例如已佇列、已排程或處理中的工作 (Job) 則必須先取消,然後才能刪除。

以下程式碼範例顯示一種刪除工作 (Job) 的方法,就是先檢查工作 (Job) 狀態,當狀態為已完成或已取消時就刪除。這段程式碼依賴本主題前一節的取得工作 (Job) 的參考:取得工作 (Job) 參考

static void DeleteJob(string jobId)
{
    bool jobDeleted = false;

    while (!jobDeleted)
    {
        // Get an updated job reference.  
        IJob job = GetJob(jobId);

        // Check and handle various possible job states. You can 
        // only delete a job whose state is Finished, Error, or Canceled.   
        // You can cancel jobs that are Queued, Scheduled, or Processing,  
        // and then delete after they are canceled.
        switch (job.State)
        {
            case JobState.Finished:
            case JobState.Canceled:
            case JobState.Error:
                // Job errors should already be logged by polling or event 
                // handling methods such as CheckJobProgress or StateChanged.
                // You can also call job.DeleteAsync to do async deletes.
                job.Delete();
                Console.WriteLine("Job has been deleted.");
                jobDeleted = true;
                break;
            case JobState.Canceling:
                Console.WriteLine("Job is cancelling and will be deleted "
                    + "when finished.");
                Console.WriteLine("Wait while job finishes canceling...");
                Thread.Sleep(5000);
                break;
            case JobState.Queued:
            case JobState.Scheduled:
            case JobState.Processing:
                job.Cancel();
                Console.WriteLine("Job is scheduled or processing and will "
                    + "be deleted.");
                break;
            default:
                break;
        }

    }
}


以下程式碼範例顯示如何根據原則識別碼取得存取原則的參考,然後刪除原則。

static void DeleteAccessPolicy(string existingPolicyId)
{
    // To delete a specific access policy, get a reference to the policy.  
    // based on the policy Id passed to the method.
    var policyInstance =
            from p in _context.AccessPolicies
            where p.Id == existingPolicyId
            select p;
    IAccessPolicy policy = policyInstance.FirstOrDefault();

    policy.Delete();

}


另請參閱

顯示:
© 2014 Microsoft