我正在使用此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”中,播放器按钮可见但是当我点击播放按钮时,不播放任何视频。当我们右键单击它时会显示“将视频保存为...”选项,并且下载的文件可以通过桌面媒体播放器正常运行。
请帮我正确的代码。
答案 0 :(得分:5)
HTML5 Video
tage需要支持 Range Requests 。
当您提供静态文件时,服务器会在内部提供此支持,但在HttpHandler
的情况下,您需要自己提供此支持。通常,这意味着在请求中处理Range
和If-Range
标头,并使用Content-Range
,Date
和{{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();
.....
}