使用HTML5视频标记通过ashx处理程序从sql server blob播放视频文件

时间:2012-10-08 13:49:24

标签: c# asp.net html5 sql-server-2008 html5-video

我正在使用此codeproject article中的代码将MP4视频文件上传到SQL服务器(varbinary(MAX))并从那里播放。

我的要求是专门使用SQL服务器,而不是存储和从文件系统中提取视频。

这是我用来播放视频的代码:

<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”中,播放器按钮可见但是当我点击播放按钮时,不播放任何视频。当我们右键单击它时会显示“将视频保存为...”选项,并且下载的文件可以通过桌面媒体播放器正常运行。

请帮我正确的代码。

2 个答案:

答案 0 :(得分:5)

HTML5 Video tage需要支持 Range Requests

当您提供静态文件时,服务器会在内部提供此支持,但在HttpHandler的情况下,您需要自己提供此支持。通常,这意味着在请求中处理RangeIf-Range标头,并使用Content-RangeDate和{{1}提供正确的 206部分内容响应}或ETag标题。

文章Range Requests in ASP.NET MVC – RangeFileResult详细描述了如何使用范围请求支持创建ASP.NET MVC Content-Location - 您应该能够从{{移动所有逻辑1}} ActionResult ExecuteResult方法的方法,没有任何问题。

答案 1 :(得分: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();
    .....
}