平滑流媒体-Azure媒体服务共享访问策略限制



我正在尝试创建有时间限制的URL,以便平稳地流式传输存储在Azure media Services中的媒体。

我正在使用此处提供的代码。Windows Azure平滑流式传输示例

我上传了一个视频文件到一个新的资产。我使用Azure Media Service编码对该视频文件进行编码,并预设"H264自适应比特率MP4 Set 720p"。使用生成的编码资产,我尝试通过创建访问策略和定位器来创建流URL,然后使用定位器生成用于流的URL。

这是代码:

string urlForClientStreaming = "";
IAssetFile manifestFile = (from f in Asset.AssetFiles
                   where f.Name.EndsWith(".ism")
                   select f).FirstOrDefault();
if (manifestFile != null)
{ 
    // Create a 1 hour readonly access policy. 
    IAccessPolicy policy = _mediaContext.AccessPolicies.Create("Streaming policy",   TimeSpan.FromHours(1), AccessPermissions.Read);
    // Create a locator to the streaming content on an origin. 
    ILocator originLocator =     _mediaContext.Locators.CreateLocator(LocatorType.OnDemandOrigin, Asset,    policy, DateTime.UtcNow.AddMinutes(-5));
    urlForClientStreaming = originLocator.Path + manifestFile.Name + "/manifest";
    if (contentType == MediaContentType.HLS)
    urlForClientStreaming = String.Format("{0}{1}", urlForClientStreaming, "(format=m3u8-aapl)");
}
return urlForClientStreaming;

这很管用。直到第6次对同一资产执行该代码。然后你会收到这个错误:

"服务器不支持在单个容器上设置超过5个共享访问策略标识符。"

所以,这很好。我不需要每次都创建一个新的AccessPolicy,我可以重用我以前创建的一个,使用相同的策略构建一个Locator。然而,即使在那时,我也会得到关于单个容器上的5个共享访问策略的错误。

以下是使用以前使用的相同AccessPolicy创建定位器的新代码:

string urlForClientStreaming = "";
IAssetFile manifestFile = (from f in Asset.AssetFiles
                   where f.Name.EndsWith(".ism")
                   select f).FirstOrDefault();
if (manifestFile != null)
{ 
    // Create a 1 hour readonly access policy
    IAccessPolicy accessPolicy = null;
    accessPolicy =
      (from p in _mediaContext.AccessPolicies where p.Name == "myaccesspolicy" select p).FirstOrDefault();
     if (accessPolicy == null)
     {
         accessPolicy = _mediaContext.AccessPolicies.Create("myaccesspolicy", TimeSpan.FromHours(1), AccessPermissions.Read);
     }
    // Create a locator to the streaming content on an origin. 
    ILocator originLocator =     _mediaContext.Locators.CreateLocator(LocatorType.OnDemandOrigin, Asset,    policy, DateTime.UtcNow.AddMinutes(-5));
    urlForClientStreaming = originLocator.Path + manifestFile.Name + "/manifest";
    if (contentType == MediaContentType.HLS)
    urlForClientStreaming = String.Format("{0}{1}", urlForClientStreaming, "(format=m3u8-aapl)");
}
return urlForClientStreaming;

我不明白为什么说我创建了5个共享访问策略。在第二个代码块的情况下,我只创建过一个访问策略。我可以通过查看_mediaContext.AccessPolicies的内容来验证只有一个访问策略,该列表中总是只有一个接入策略。

在某个时刻,可能会有许多用户请求访问同一资产。根据我们客户的要求,提供给这些客户的URL需要有时间限制。

这不是创建一个URL以顺利传输资产的合适方式吗?

我知道回复晚了。。。

考虑到你需要创建一个可以被任何人无限期使用的单一URL,我建议你:

  1. 创建资产时创建一个长期定位器,例如一年-您可以像第二个示例中那样每次使用相同的访问策略
  2. 当你构建流媒体的URL时,从资产中获取该定位器
  3. 检查资产上剩余的时间长度-如果少于一定的时间(例如一个月),则使用ILocator.Update延长定位器,例如再延长一年。更新定位器的到期日期不会影响用于创建定位器的原始访问策略
  4. 利润

HTH

现在有了Azure Media Services内容保护功能,您可以使用AES或PlayReady加密媒体文件,生成一个长期定位程序。同时,您为内容密钥设置令牌授权策略,令牌持续时间可以设置为短时间(足够玩家检索内容密钥)。通过这种方式,您可以控制您的内容访问。更多信息,你可以参考我的博客:http://azure.microsoft.com/blog/2014/09/10/announcing-public-availability-of-azure-media-services-content-protection-services/

定位器不是为实现每个用户的访问控制而设计的。为此,请使用数字权限管理系统。他们有查看窗口、持久和非持久许可等概念。具体来说,我谈论的是在WAMS中使用PlayReady加密和PlayReady服务器来配置和提供许可证(Azure门户中有EzDRM,还有BuyDRM和其他)。

定位器提供流媒体服务的基本开关。您最多可以创建5个,因为它们使用的是每个容器5个的基本SAS限制。

最新更新