通过ashx处理程序使用HTML5视频标签从SQL Server Blob播放视频文件

6
我将使用这篇codeproject文章中的代码,将MP4视频文件上传到SQL Server(varbinary(MAX))并从那里播放。我的要求是特别使用SQL server而不是从文件系统中存储和获取视频。以下是我用来播放视频的代码:
<video id='my_video_1'  controls
   width="640" height="264"
  data-setup="{"controls":true, "preload":none}" >
  <source src='<%# "VideoHandler.ashx?id=" + Eval("ID") %>' type='video/mp4'>  
</video>

如果我使用一个物理的视频文件作为视频源,那么它是有效的。然而上述代码不起作用。
在 "Internet Explorer" 中,标签呈现为黑色框和红色十字。
在 "Chrome" 中,播放器按钮可见,但当我点击播放按钮时,没有视频播放。右键单击时显示 "另存为..." 选项,下载的文件可以在桌面媒体播放器上正常运行。
请帮我提供正确的代码。

数据设置属性内的双引号是否会导致问题? - Tom Smilack
2个回答

5
HTML5的Video标签需要支持Range Requests
当您提供静态文件时,服务器内部提供此支持,但在HttpHandler的情况下,您需要自己提供此支持。通常,这意味着处理请求中的RangeIf-Range头,并使用Content-RangeDateETagContent-Location头提供适当的206 Partial Content响应。
文章“ASP.NET MVC中的范围请求- RangeFileResult”详细描述了如何创建一个带有Range Request支持的ASP.NET MVC ActionResult - 您应该能够将所有逻辑从ExecuteResult方法移动到HttpHandlerProcessRequest方法中,而不会出现任何问题。

1

使用静态视频源测试您的<video>代码块。一旦确定标记是正确的,测试处理程序,确保它正确编码视频并提供正确的接受方式。尝试在媒体播放器中播放等。

<video id='my_video_1' controls width="640" height="264"
  data-setup='{"controls":true, "preload":none}' >
  <source src='<%# "VideoHandler.ashx?id=" + Eval("ID") %>' 
     type='video/mp4 codecs="avc1.42E01E, mp4a.40.2"'>  
</video>


public void ProcessRequest (HttpContext context) 
{
    ....
    context.Response.AppendHeader("Content-Type", "video/mp4");`
    context.Response.AppendHeader("Accept-Ranges", "bytes");

    byte[] fileContents = GetYourBytesFromWhereEver();
    context.Response.OutputStream.Write(fileContents, 0, fileContents.Length);
    context.Response.Flush();
    .....
}

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