0

我正在使用 Azure 媒体服务和 Silverlight 播放器来播放流式 url

我能够摄取视频文件并将其编码为资产文件,但是当我播放流式 URL 时,我遇到了问题。

我使用以下代码来获取网址...

context = new CloudMediaContext(_accountName, _accountKey);
 IAsset myAsset = GetAsset("UUID:7a32b941-30bd-4c96-bf4e-26df5022eec5");
 var theManifest = from f in myAsset.AssetFiles
 where f.Name.EndsWith(".ism")
 select f;
 var manifestFile = theManifest.First();
 IAccessPolicy streamingPolicy = _context.AccessPolicies.Create("Streaming policy",
 TimeSpan.FromDays(10),
 AccessPermissions.Read);
 ILocator originLocator = _context.Locators.CreateSasLocator(myAsset, streamingPolicy, DateTime.UtcNow.AddMinutes(-500));
 GetAssetSasUrlList(myAsset, originLocator);
 string urlForClientStreaming = originLocator.Path + manifestFile.Name + "/manifest";
 Console.WriteLine("URL to manifest for client streaming: ");
 Console.WriteLine(urlForClientStreaming);

这个网址就像——

https://mediasvc06w4dq5k8vd08.blob.core.windows.net/asset-064ed2d5-e42d-4c49-98eb-a712db5c614f?st=2012-12-26T23%3A04%3A22Z&se=2013-01-05T23%3A04%3A22Z&sr=c&si 9350bd2f-ec23-40b2-b27a-248bba01b97e&sig=oGgesnr8mXjCdTM5Dz%2FQpFRBDR0g0%2F60ECoXY14EvsA%3DBigBuckBunny.ism/manifest

它不工作。

当我直接将此网址粘贴到浏览器上时,出现以下错误

AuthenticationFailedServer 未能对请求进行身份验证。确保 Authorization 标头的值正确形成,包括签名。RequestId:154422cf-822e-4bbc-af2a-fa69273dfb89 时间:2012-12-27T08:57:30.9509847ZSignature 字段格式不正确。

但是,如果我从门户网站(www.manage.windowsazure.com)发布资产——我会喜欢在 protal 上关注 url。

http://mediaervices.origin.mediaservices.windows.net/5edbeae7-c3e6-45c5-bc5c-70f46b526cb5/BigBuckBunny.ism/Manifest

它适用于我的silverlight播放器..

现在的问题是我没有从代码中获取以 http 开头的 url,并且以 https 开头的 url 不适用于我的播放器。

我猜是它的安全问题,并试图在 winows azure 中托管我的播放器并尝试在那里播放但没有成功。

4

1 回答 1

3

不,不是安全问题。您正在为 Smooth 资产请求 SAS url,您需要一个 Origin URL。正确的代码片段在这里,在我的博客上: http ://blog-ndrouin.azurewebsites.net/?p=1931

具体来说:

    private static string GetStreamingUrl(CloudMediaContext context, string outputAssetId)
    {
        var daysForWhichStreamingUrlIsActive = 365;

        var outputAsset = context.Assets.Where(a => a.Id == outputAssetId).FirstOrDefault();

        var accessPolicy = context.AccessPolicies.Create(outputAsset.Name, TimeSpan.FromDays(daysForWhichStreamingUrlIsActive), AccessPermissions.Read | AccessPermissions.List);

        var assetFiles = outputAsset.AssetFiles.ToList();

        var assetFile = assetFiles.Where(f => f.Name.ToLower().EndsWith("m3u8-aapl.ism")).FirstOrDefault();
        if (assetFile != null)
        {
            var locator = context.Locators.CreateLocator(LocatorType.OnDemandOrigin, outputAsset, accessPolicy);

            Uri hlsUri = new Uri(locator.Path + assetFile.Name + "/manifest(format=m3u8-aapl)");
            return hlsUri.ToString();
        }

        assetFile = assetFiles.Where(f => f.Name.ToLower().EndsWith(".ism")).FirstOrDefault();
        if (assetFile != null)
        {
            var locator = context.Locators.CreateLocator(LocatorType.OnDemandOrigin, outputAsset, accessPolicy);
            Uri smoothUri = new Uri(locator.Path + assetFile.Name + "/manifest");
            return smoothUri.ToString();
        }

        assetFile = assetFiles.Where(f => f.Name.ToLower().EndsWith(".mp4")).FirstOrDefault();
        if (assetFile != null)
        {
            var locator = context.Locators.CreateLocator(LocatorType.Sas, outputAsset, accessPolicy);
            var mp4Uri = new UriBuilder(locator.Path);
            mp4Uri.Path += "/" + assetFile.Name;
            return mp4Uri.ToString();
        }
        return string.Empty;
    }
于 2013-02-21T08:42:52.080 回答