使用IIS/Asp.Net从内存中流式传输AVI文件

3
我在磁盘上有一些AVI文件,但它们是加密的。我想知道是否有办法解密并将它们流式传输到浏览器(使用MemoryStream或类似的东西),而无需编写任何文件?
我知道有Windows Media Services,但我正在使用Vista机器,而Windows Media Services只能安装在Windows Server 2003和2008上。
有没有什么简单的方法可以完成这个任务,或者Media Services / Windows Server是唯一的选择?如果有,我会使用像自定义IHttpHandler(.ashx文件)之类的东西吗?
编辑:
我决定使用自定义IHttpHandler。我需要什么基本代码才能播放视频?
1个回答

1

我不想使用MemoryStream来处理视频。假设你可以在加密的AVI文件上创建一个CryptoStream(在System.Security.Cryptography命名空间中找到),那么你应该能够将ReadCryptoStream传输到IHttpHandler中的Response.OutputStreamWrite方法中。类似于:

 byte[] buffer = new byte[65556];  // adjust the buffer size as yo prefer.
 CryptoStream inStream = YourFunctionToDecryptAVI(aviFilePath);
 int bytesRead = inStream.Read(buffer, 0, 65556); 
 while (bytesRead != 0)
 {
    context.Response.OutputStream.Write(buffer, 0, bytesRead); 
    bytesRead = inStream.Read(buffer, 0, 65556);
    if (!context.Response.IsClientConnected) break;
 }
 Response.Close();  //see edit note.

确保关闭响应缓冲区并指定内容类型。

编辑:

通常我不喜欢调用close,它看起来太过严厉。然而,在分块编码不需要它的情况下,在流式视频的情况下,客户端可能不喜欢它。此外,在大数据传输中关闭连接并不是什么大问题。


当我尝试这个时,媒体播放器会出现“无法连接服务器”的错误。 - mcjabberz
如果您以这种方式编写数据,请确保首先使用Clear()清除响应,然后将其BufferOutput属性设置为False。这将导致ASP.NET输出“Transfer-Encoding: chunked”HTTP标头,因此数据真正地进行流式传输。 - Remy Lebeau
@Remy:我倾向于不在处理程序中使用.Clear,这是多余的操作,如果它真的起到了作用,那么已经出现了问题。 - AnthonyWJones
这是<a href="http://pastebin.com/m16846c15">我的精确代码</a>。我仍然遇到Media Player卡住的同样问题。PS:非常感谢大家的帮助!!! - mcjabberz
你的代码块似乎没有解密?AVI文件有多大?尝试使用小的AVI文件,将restore buffering设置为true并删除close语句。这将检查基本功能。 - AnthonyWJones
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接