使用 HTML5 视频标记通过 ashx 处理程序播放来自 sql 服务器 blob 的视频文件



我正在使用这篇代码项目文章中的代码将MP4视频文件上传到SQL server(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"中,播放器按钮可见,但是当我单击播放按钮时,不会播放视频。当我们右键单击它时,它显示"将视频另存为..."选项,下载的文件在桌面媒体播放器上运行良好。

请帮助我使用正确的代码。

HTML5 Video tage 需要支持范围请求

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

文章 ASP.NET MVC 中的范围请求 – RangeFileResult 详细介绍了如何创建具有范围请求支持的 ASP.NET MVC ActionResult - 您应该能够将所有逻辑从ExecuteResult方法移动到ProcessRequest HttpHandler方法,而不会出现任何问题。

使用静态视频源测试<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();
    .....
}

最新更新