关闭

网络串流播放_HTML5如何优化视频文件以便在网络上更快地串流播放

时间: 2018-11-10阅读: 1610标签: 优化

随着 Flash 的落寞 以及 移动设备的爆发性增长 ,越来越多的内容以 html5 视频的方式传递。在上一篇文章中你甚至能看到 使用 html5 视频替换 GIF 动图来优化网站访问速度 这样的技巧。然而事实上,视频格式本身就有一堆优化技巧可用来改善它们的性能表现。其中非常重要的一点,就是视频文件可以合理优化以便作为 HTML5 视频在网络上串流播放。否则的话,播放视频文件可能会有数百毫秒的延迟,同时导致数兆字节的带宽被浪费,只因网站访客试图播放你的视频。在这篇文章里,我将向你展示如何优化视频文件以便在网络上更快地串流播放。


MP4 串流是如何工作的?

HTML5 视频是无需像 Flash 那样需要插件支持即可观看视频的跨浏览器方案。到现今 2016 年, 经过 H.264 编码的视频存储在 MP4 容器之中 (以下我将简单地称其为 MP4 视频),并统一成为所有在线 HTML5 视频的标准格式。所以,当我们谈及优化 HTML5 视频时,我们真正讨论的是如何优化 MP4 文件以便更快地串流播放。至于如何做到,则与 MP4 文件的结构以及视频串流如何工作有很大关系。

MP4 文件由名为 "atoms" 的数据块构成。有存储字幕或章节的 atoms ,同样也有存储视频和音频数据的 atoms 。至于视频和音频 atoms 处于哪个位置,以及如何播放视频诸如分辨率和帧速等,这些元数据信息都存储于一个名为 moov 的特殊 atom 之中。你可以将 moov atom 理解成 MP4 文件的某种 目录列表 。

当你播放视频时,程序搜寻整个 MP4 文件,定位 moov atom,然后使用它找到视频和音频数据的开头位置,并开始播放。然而, atoms 可能以任何顺序存储,所以程序无法提前得知 moov atom 在文件的哪个位置。如果你已经拥有整个视频文件,搜寻并找到 moov atom 问题并不大。然而,当你还没有拿到整个视频文件(比如说你串流播放 HTML5 视频时),恐怕就希望可以有另外一种方式。而这,就是串流播放视频的关键点!你无需事先下载整个视频文件,就可以立即开始观看。

当串流播放时,你的浏览器会请求视频并接受文件头部,它会检查 moov atom 是否在文件开头。如果 moov atom 没有在文件开头,则它要么得下载整个文件并试图找到 moov ,要么下载视频文件的不同小块并寻找 moov atom,反复搜寻直到遍历整个视频文件。

搜寻 moov atom 的整个过程需要耗费时间和带宽。很不幸的是,在 moov 被定位之前的这段时间里,视频都不能开始播放。从下面的截图中,我们能看到浏览器播放未经优化的 MP4 视频时的瀑布图。


你能看到浏览器在播放视频前进行了 3 次请求。第一个请求中,浏览器使用 HTTP range request 下载了视频文件的前 552 KB 字节。通过 HTTP 返回码的 206 Partical Content 报告,以及仔细查看请求头部数据,我们可以得知这一点。然而, moov atom 并没有被找到,浏览器仍不能开始播放视频。接下来,浏览器又使用一次范围请求(range request)拉取视频文件最末尾的 211 KB 字节。这次则包含了 moov atom,可以告知浏览器视频和音频从何处开始播放。终于,浏览器做了第三次也是最后一次请求,获得视频/音频数据,并开始播放视频。到这里,我们已经浪费了超过半兆字节的带宽,并将视频的播放推迟了 210 毫秒!仅仅是因为浏览器无法找到 moov atom。

如果你没有配置服务器以支持 HTTP 范围请求(range request),事情甚至会变得更糟。浏览器将不能来回部分请求来找到 moov ,而 必须下载整个视频文件 。这也是为何你应该 优化服务器支持部分下载技术 的另一原因。

将 MP4 视频用作 HTML5 串流的理想方式,就是重组视频文件,使得 moov 正好位于文件开头。这样的话,浏览器可以避免下载整个文件,或者浪费时间进行额外请求以找到 moov 。为串流优化过的视频网站请求瀑布图,如下图所示:


将 moov 置于文件开头,视频将会更快地加载和播放,带来更好的用户体验。


优化 MP4 以便更快的网络串流

我们已经知道,要想优化视频为 HTML5 串流播放,则需要重组 MP4 atoms,以便 moov atom 位于文件开头。那么我们究竟要如何做呢?大多数视频编码软件都有“为 web 优化”或“为串流优化”的选项,正是用来做这件事情的。当创建视频时,你应该检查一下视频编码设置,以确保它被优化。比如在下面的截图中,我们看到开源软件Handbrake有一个“Web Optimized”的选项,它将确保 moov atom 处于文件开头。


当从源视频创建 MP4 的时候,这是一个可行的解决方案。但是,如果你拥有的已经是 MP4 文件呢?

你仍然可以重组已有的视频,优化它以适应 web 串流播放。开源编码器FFMpeg命令行可以重组 MP4 文件,将 moov atom 放到文件开头。不像初始编码时那样消耗时间和 CPU,重组文件是一项更容易的操作,并且也不会以任何方式损失视频质量。下面是使用 ffmpeg 优化 input.mp4 文件的例子,输出文件名为 output.mp4 。

ffmpeg -i input.mp4 -movflags faststart -acodec copy -vcodec copy output.mp4

-movflags faststart 参数告诉 ffmpeg 重组 MP4 文件 atoms,将 moov 放到文件开头。我们同时告诉 ffmpeg 拷贝视频和音频数据,而非重新编码,这样其它任何东西都不会发生变动。

针对 Rigor 的客户,我们已经给 Zoompf-- 我们的性能分析和优化产品 --添加了一项新功能,它将会检测 MP4 文件是否已经为 HTML5 视频串流优化。如果你仅仅想要快速检查一下你的网站,可以使用 我们的免费性能报告服务 。


结论

无论你正在将 GIF 动图转换为 MP4 视频,还是手头已经有一大堆 MP4 视频,你都可以优化文件结构,以使得这些视频更快地加载和播放。通过重组 atoms 将 moov 放到文件开头,浏览器可以避免发送额外的 HTTP range request 请求来搜寻和定位 moovatom。而这,将允许浏览器立即开始串流播放视频。通常情况下,当你初始创建视频时,可以配置选项让其为串流播放而优化。如果你已有 MP4 文件,可以使用 ffmpeg 这类工具来重组文件,而不会更改其它的内容。


文章链接:https://macplay.github.io/posts/you-hua-mp4-shi-pin-yi-bian-geng-kuai-de-wang-luo-chuan-liu/  


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/1312

关闭

优化网页加载速度的方法总汇

优化方案的核心就3点:减少请求数、减少资源大小、找最快的服务器。如果你是一个网站的产品经理,快去找你们的开发确认是否有做过类似的优化吧。网页的加载流程。优化图片资源的格式和大小、开启网络压缩、使用浏览器缓存、减少重定向请求

css性能优化-will-change

will-change通过告知浏览器该元素会有哪些变化,使浏览器提前做好优化准备,增强页面渲染性能。不要将 will-change 应用到太多元素上,如果过度使用的话

首页白屏优化实践

自从前端三大框架React、Vue、Angular面世以来,前端开发逐渐趋向规范化、统一化,大多数时候新建前端项目,首先想到使用的技术一定是三大框架之一,框架给前端开发带来了极大的便利和规范,但是由于这三大框架都是JS驱动

网站优化重点注意事项

可能很多的小白还不清楚,网站优化的重点在哪里,到底是站内优化重要还是站外优化重要,要知道的是,百度除了相关说明的,外链对网站的帮助已经越来越小,但是并不是代表就可以不去做

移动 H5 首屏加速、优化方案

随着移动设备性能不断增强,web 页面的性能体验逐渐变得可以接受,又因为 web 开发模式的诸多好处(跨平台,动态更新,减体积,无限扩展)

Node学习笔记:优化crud增删改查

在安装过程中需要特别注意,需要将 Install MongoDB Compass 前默认的勾选取消,可以使用 mongod --version 命令查看 MongoDB 版本,若版本号输出正常则安装完毕

关于ES6尾调用优化

ES6包含了一个性能领域的特殊要求。这与一个涉及函数调用的特定优化形式相关:即尾调用优化(Tail Call Optimization,TCO)。简单地说,尾调用就是一个出现在另一个函数“结尾”处的函数调用

如何提升网站访问速度?

但网站打开速度变的不可科学的时候,怎么检测打开速度是多少?检测网站是否被劫持、域名是否被墙、DNS污染检测、网站打开速度检测等信息。如果你是网站使用者,你可以通过升级宽带、光纤、升级CPU内存

vue-cli4首次加载速度优化

GZIP压缩有动态跟静态两种,可以将由前端打包GZIP,通过 gzip_static:on会寻找以.gz结尾的文件,直接返回,不会占用cpu进行压缩,如果找不到则不进行压缩

我是如何将页面加载时间从6S降到2S的?

生活在信息爆炸的今天,我们每天不得不面对和过滤海量的信息--无疑是焦躁和浮动的,这就意味着用户对你站点投入的时间可能是及其吝啬的(当然有一些刚需站点除外)。如何给用户提供迅速的响应就显得十分重要了

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!