如何将流上载到Azure Media Services

本文关键字:Azure Media Services 上载 | 更新日期: 2023-09-27 18:00:22

我们使用的是ASP。NET MVC 4允许用户通过我们的网站上传视频和音频。我想使用Azure媒体服务作为后端。

在学习Azure教程时,我遇到的问题是Azure Media Services SDK似乎不允许上传原始数据流。相反,我能找到的唯一上传方法是使用路径字符串参数。

我希望避免将文件保存到磁盘(默认情况下,它已经流式传输到磁盘),并能够将请求发布的文件直接流式传输至Azure。

这是我迄今为止的代码:

public void SaveMedia(string fileName, System.IO.Stream stream)
{
    CloudMediaContext mediaCloud = new CloudMediaContext("account", "key");
    AssetCreationOptions assetOptions = new AssetCreationOptions();
    var asset = mediaCloud.Assets.Create(fileName, assetOptions);
    var assetFile = asset.AssetFiles.Create(fileName);
    var accessPolicy = mediaCloud.AccessPolicies.Create(fileName, TimeSpan.FromDays(3), AccessPermissions.Write | AccessPermissions.List);
    var locator = mediaCloud.Locators.CreateLocator(LocatorType.Sas, asset, accessPolicy);
    assetFile.Upload("????????????");
    locator.Delete();
    accessPolicy.Delete();
}

如何做到这一点?这会与使用ASP处理上传的任何"最佳实践"相冲突吗。NET MVC 4和Azure媒体服务?

如何将流上载到Azure Media Services

您不应该使用Azure Media Services进行上传,它不是为Azure存储blob的入站流而设计的,这就是您所描述的。

直接使用Azure存储SDK(使用v1.7以避免重新绑定问题)。Storage SDK允许流写入blob。要做到这一点,你需要首先获得一个SAS写入定位器(看起来你在那里),然后使用定位器。路径分段以查找资源容器。然后使用存储SDK中的CloubBlobClient直接上传——它在某个地方提供了流写入功能。

请注意,在上面的代码中:您没有指定AssetCreationOptions。无,因此它将假设存储中的文件将是存储加密的(默认传输机制是安全的,而不是不安全的)。我认为你不会在上传之前对文件流进行存储加密,所以你最好将其设置为AssetCreationOptions。没有一个

就我个人而言,我不会走这条路。阅读我关于"创建自己的youtube"的博客文章:http://blog-ndrouin.azurewebsites.net/?p=1471

在它中,有一个完整的客户端上传内容的例子,使用服务器端提供的SAS url(其中有你的帐户凭据,你可能不想在客户端上浮动!)。

但是,客户端必须能够使用该SAS URL将PUT放入存储中。在我的例子中,我使用了一个C#命令行应用程序。除非您的网页与目标存储帐户位于同一域,否则您将无法在HTML5中执行此操作。如果你的网页(或管理上传的I帧)与你的存储帐户不在同一个域中,这将触发HTML5中对Azure存储REST层的CORS"OPTIONS"调用,该层还不支持CORS。

存储帐户中托管的HTML5 I帧的替代方案是:Sliverlight或Flash上传垫片,在存储帐户的$root中有一个跨域文件(或者可能是存储帐户中的插件对象,以避免跨域文件请求)。

我不建议在POST中将文件流上传到服务器。这使您的web服务成为所有入站文件的瓶颈;而长时间的POST并不是特别稳定:你的app-pool可能会在上传过程中被回收,你就完蛋了。

PS。我们的团队(Windows Azure Media Services)主要监控此论坛:

http://social.msdn.microsoft.com/Forums/en-US/MediaServices/threads