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>
- 确保
moov
(元数据)位于mdat
(audio/video数据)之前 。 这也被称为“快速启动”或“网页优化”。 例如, Handbrake有一个“Web优化”checkbox ,而ffmpeg和avconv的输出选项是-movflags faststart
。 - 确保您的networking服务器正在报告正确的内容types(video/ mp4)。
- 确保您的Web服务器configuration为提供字节范围请求 。
- 确保您的Web服务器不在压缩文件的mp4文件上应用gzip或deflate压缩。
您可以使用curl -I http://yoursite/video.mp4
或使用浏览器中的开发人员工具( Chrome , Firefox )来检查Web服务器发送的标头(如果已caching,则重新加载页面)。 HTTP响应头应该包含Content-Type:video / mp4和Accept-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; }