我正在尝试设置一个非常基本的 html5 页面,用于加载 20MB 的 .mp4 视频。 看来浏览器需要下载整个内容,而不是只播放视频的第一部分并流式传输其余部分。
这篇文章是我在搜索时发现的最接近的东西...我尝试了手刹和数据转轮,似乎都没有什么区别:
关于如何做到这一点或是否可能有什么想法?
这是我正在使用的代码:
<video controls="controls">
<source src="/video.mp4" type="video/mp4" />
Your browser does not support the video tag.
</video>
moov
(元数据)位于mdat
(音频/视频数据)之前。 这也称为“快速启动”或“网络优化”。 例如,Handbrake 有一个“Web Optimized”复选框,ffmpeg 有输出选项-movflags faststart
。您可以使用
curl -I http://yoursite/video.mp4
或使用浏览器中的开发人员工具(Chrome、Firefox)检查网络服务器发送的标头(如果页面已缓存,请重新加载页面)。 HTTP 响应标头应包含 Content-Type: video/mp4 和 Accept-Ranges: bytes,并且不包含 Content-Encoding:。
这是我用来在 C# (MVC) 中创建 Web API 控制器的解决方案,该控制器将提供具有字节范围(部分请求)的视频文件。 部分请求允许浏览器仅下载播放所需的视频,而不是下载整个视频。 这使得它更加高效。
请注意,这仅适用于最新版本。
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;
}
在为您的网站选择最佳视频播放器时,HTML5 播放器通常比 Flash 更受青睐,因为它具有更好的性能、安全性以及与现代 Web 标准的兼容性。在各种可用的 HTML5 视频播放器中,我强烈推荐 sopplayer。 sopplayer 是 GitHub 上提供的开源 HTML5 视频播放器,它为将网络视频集成到您的网站提供无缝且功能丰富的体验。以下是 sopplayer 脱颖而出的一些原因: