5

我正在使用此codeproject 文章中的代码将 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”中,播放器按钮是可见的,但是当我单击播放按钮时,没有播放视频。当我们右键单击它时,它会显示“将视频另存为...”选项,并且下载的文件可以在桌面媒体播放器上正常运行。

请帮助我正确的代码。

4

2 回答 2

5

HTML5Video标记需要支持Range Requests

当您提供静态文件时,此支持由服务器内部提供,但如果HttpHandler您需要自己提供此支持。一般来说,这意味着在请求中处理Range和标头,并使用,和/标头If-Range提供适当的206 部分内容响应。Content-RangeDateETagContent-Location

ASP.NET MVC 中的 Range Requests – RangeFileResult一文详细描述了如何创建ActionResult具有Range Request支持的 ASP.NET MVC - 您应该能够毫无问题地将所有逻辑从ExecuteResult一个方法移动到另一个ProcessRequest方法HttpHandler

于 2012-10-08T14:16:23.417 回答
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();
    .....
}
于 2012-10-08T13:53:06.720 回答