导出 (0) 打印
全部展开

使用用于 .NET 的 Media Services SDK 管理资产

更新时间: 2014年7月

本主题说明了如何完成以下Media Services管理任务:

note备注
若要编写代码来管理现有Media Services资产,首先必须获取对Media Services服务器上下文的引用,如主题使用 Media Services SDK for .NET 连接到 Media Services所述。在以下代码示例中,上下文对象由名为 _context 的变量表示。

一个常见的任务是获取对Media Services中现有资产的引用。以下代码示例说明了如何基于资产 ID 从服务器上下文对象上的 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;
}

使用Media Services代码中的处理任务时,你经常需要基于 ID 获取对现有作业的引用。以下代码示例说明了如何获取对 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());
}

一个重要的相关任务是列出Media Services中的资产及其关联的作业。以下代码示例向你说明了如何列出每个 IJob 对象。然后,对于每个作业,它会显示作业的相关属性、所有相关任务、所有输入资产以及所有输出资产。本示例中的代码可用于各种其他任务。例如,如果你希望列出以前运行的一个或多个编码作业的输出资产,则可使用此代码,因为此代码说明了如何访问输出资产。当你获取了对某个输出资产的引用时,则可通过直接下载或提供 URL 的方式将内容传送给其他用户或应用程序。有关资产传送选项的详细信息,请参阅使用用于 .NET 的 Media Services SDK 传送资产

// 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());
}

在Media Services中,你可以定义资产或其文件的访问策略。访问策略定义文件或资产的权限(哪种类型的访问以及持续时间)。在Media Services代码中,通常可通过创建一个 IAccessPolicy 对象并将其与现有资产相关联来定义访问策略。然后,你可以创建一个 ILocator 对象,通过该对象直接访问Media Services中的资产。本文档系列随附的 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 集合。

以下代码示例列出了服务器上的所有定位符。对于每个定位符,它显示相关资产的 ID 和访问策略。它还显示权限类型、过期日期以及资产的完整路径。

note备注
某资产的定位符路径只是该资产的基本 URL。若要创建用户或应用程序可以浏览的单个文件的直接路径,你的代码必须将特定文件路径添加到定位符路径中。有关如何执行此操作的详细信息,请参阅主题使用用于 .NET 的 Media Services SDK 传送资产

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");

}

若要删除作业,你必须检查 State 属性中指示的作业状态。可以删除“已完成”或“已取消”的作业,但如果作业处于其他某些状态,如“已排队”、“已调度”或“正在处理”,则必须先取消作业,然后才能将其删除。

以下代码示例显示了一个用于删除作业的方法,该方法先检查作业状态,如果状态为“已完成”或“已取消”,则将其删除。此代码基于本主题中前一部分的内容(即获取对作业的引用):获取作业引用

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;
        }

    }
}


以下代码示例说明了如何基于策略 ID 获取对某个访问策略的引用,然后删除该策略。

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