我正在使用这篇代码项目文章中的代码将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
的情况下,您需要自己提供此支持。通常,这意味着处理请求中的Range
和If-Range
标头,并使用Content-Range
、Date
和ETag
或Content-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();
.....
}