我们正在使用FileStreamResult为基于Silverlight MediaElement的视频播放器提供视频数据:
public ActionResult Preview(Guid id) {
return new FileStreamResult(
Services.AssetStore.GetStream(id, ContentType.Preview),
"application/octet-stream");
}
不幸的是,Silverlight视频播放器在开始播放之前会下载整个视频文件。由于我们的Preview
操作不支持下载部分内容,因此会出现此行为。
(旁注:如果文件托管在IIS虚拟目录中,我们可以在视频中的任何位置继续播放,但是出于安全和审核原因,我们无法提供直接下载链接。这不是一种选择。)
我们如何改进Controller Action以支持部分HTTP内容?
我假设我们首先必须通知客户端我们支持它(向HEAD请求添加“Accept-Ranges:bytes”标头),然后我们必须评估HTTP“Range”标头并流式传输所请求的文件范围响应代码为206.这将与IIS6上托管的ASP.NET MVC一起使用吗?是否已有一些代码?
另见:
答案 0 :(得分:5)
CodePlex上有一个项目可以提供这种功能。
http://mediastreamingmvc.codeplex.com/
看一看。它是专门为此场景创建的,您希望有一个动作来表示对虚拟资源的请求,并在需要时返回部分内容,而不需要开发人员做很多事情来支持它(动作过滤器和结果类型的选择。)< / p>
答案 1 :(得分:0)
答案 2 :(得分:-1)
然后你需要重新实现限制模块:)
我们的想法是计算视频流的比特率,然后根据需要向客户端发送。因此,您需要(非常简短地)从流中读取一个块并将其发送到客户端并休眠一秒钟。
Thread.Sleep(1000)对于处理IIS资源并不是一个好主意,因此您需要以异步方式执行操作。 IAsyncResult将是你的朋友。
各种优化都有很大的空间。
最后一件事......我让它以普通的httphandler工作,而不是MVC ActionResult。 如果你的网站有可能,我建议你做一个处理程序。