首页 文章

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

提问于
浏览
5

我正在使用此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 回答

  • 5

    HTML5 Video tage需要支持 Range Requests .

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

    文章Range Requests in ASP.NET MVC – RangeFileResult详细描述了如何创建具有范围请求支持的ASP.NET MVC ActionResult - 您应该能够将所有逻辑从 ExecuteResult 方法移动到 ProcessRequest 方法 HttpHandler ,没有任何问题 .

  • 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();
        .....
    }
    

相关问题