我正在尝试为Azure媒体服务中存储的媒体流畅传输创建有时间限制的URL。
我正在反对这里提供的代码。 Windows Azure Smooth Streaming example
我将视频文件上传到新资源。我使用Azure Media Service编码使用预设的“H264 Adaptive Bitrate MP4 Set 720p”对该视频文件进行编码。使用生成的编码资产,然后我尝试通过创建访问策略创建流URL,然后创建一个Locator,我用它来生成用于流式传输的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
的内容来验证只有一个AccessPolicy,该列表中始终只有一个访问策略。
在某些时候,这可能会有许多用户请求访问同一个资产。提供给这些客户的URL需要根据客户要求进行时间限制。
这不是创建用于平滑流式传输资产的URL的适当方法吗?
答案 0 :(得分:2)
我知道迟到的回复......
鉴于您需要创建一个可供任何人无限期使用的网址,我建议您:
HTH
答案 1 :(得分:1)
定位器不是为了进行每用户访问控制而设计的。使用数字版权管理系统。它们具有查看窗口,持久性和非持久性许可等概念。具体来说,我说的是在WAMS和PlayReady服务器中使用PlayReady加密来配置和提供许可证(Azure门户中还有EzDRM,还有BuyDRM等)。
定位器提供流媒体服务的基本开关切换。您最多可以创建5个,因为它们使用的是每个容器5个底层SAS限制。
答案 2 :(得分:1)
现在,借助Azure Media Services内容保护功能,您可以使用AES或PlayReady加密媒体文件,生成长期定位器。同时,您为内容密钥设置令牌授权策略,令牌持续时间可以设置为短时间段(足以让播放器检索内容密钥)。这样您就可以控制内容访问。有关详细信息,请参阅我的博客:http://azure.microsoft.com/blog/2014/09/10/announcing-public-availability-of-azure-media-services-content-protection-services/