HTML5 – 如何stream大型.mp4文件?

我试图设置一个非常基本的html5页面,加载一个20MB的.mp4video。 看起来,浏览器需要下载整个video,而不是只播放video的第一部分,其余部分则是stream媒体。

这篇文章是我search时发现的最接近的东西…我尝试了双手制动和数据围绕都没有出现有所作为:

任何想法如何做到这一点,如果有可能?

这是我正在使用的代码:

<video controls="controls"> <source src="/video.mp4" type="video/mp4" /> Your browser does not support the video tag. </video> 
  1. 确保moov (元数据)位于mdat (audio/video数据)之前 。 这也被称为“快速启动”或“网页优化”。 例如, Handbrake有一个“Web优化”checkbox ,而ffmpeg和avconv的输出选项是-movflags faststart
  2. 确保您的networking服务器正在报告正确的内容types(video/ mp4)。
  3. 确保您的Web服务器configuration为提供字节范围请求 。
  4. 确保您的Web服务器不在压缩文件的mp4文件上应用gzip或deflate压缩。

您可以使用curl -I http://yoursite/video.mp4或使用浏览器中的开发人员工具( Chrome , Firefox )来检查Web服务器发送的标头(如果已caching,则重新加载页面)。 HTTP响应头应该包含Content-Type:video / mp4Accept-Ranges:bytes ,并且不包含Content-Encoding:。

这里是我用来在C#(MVC)中创buildWeb API控制器的解决scheme,它将为video文件提供字节范围(部分请求)。 部分请求允许浏览器只下载尽可能多的video,而不是下载整个video。 这使得它更有效率。

注意这只适用于最近的版本。

 var stream = new FileStream(videoFilename, FileMode.Open, FileAccess.Read , FileShare.Read); var mediaType = MediaTypeHeaderValue.Parse($"video/{videoFormat}"); if (Request.Headers.Range != null) { try { var partialResponse = Request.CreateResponse(HttpStatusCode.PartialContent); partialResponse.Content = new ByteRangeStreamContent(stream, Request.Headers.Range, mediaType); return partialResponse; } catch (InvalidByteRangeException invalidByteRangeException) { return Request.CreateErrorResponse(invalidByteRangeException); } } else { // If it is not a range request we just send the whole thing as normal var fullResponse = Request.CreateResponse(HttpStatusCode.OK); fullResponse.Content = new StreamContent(stream); fullResponse.Content.Headers.ContentType = mediaType; return fullResponse; }