视频和 Firefox OS

HTML5 之前

那是黑暗的时代,哈利,黑暗的时代 - 鲁伯斯·海格

在 HTML5 之前,在网络上显示视频需要 浏览器插件Flash

幸运的是,Firefox OS 支持 HTML5 视频,因此我们无需支持这些旧格式。

网络上的视频支持

尽管现代浏览器支持 HTML5,但它们支持的视频格式各不相同。

总之,要支持大多数浏览器,使用最少的格式,您需要 MP4WebM 视频格式(Firefox 优先使用 WebM)。

多种尺寸

现在您已经了解了可以使用哪些格式,您需要决定视频分辨率,因为使用高速 Wi-Fi 的台式机用户会希望获得比使用 3G 的移动用户更好的质量视频。

Rormix,我们决定使用 720p 用于台式机,360p 用于移动连接,以及 180p 特别用于 Firefox OS,以降低数据资费较高的国家/地区的成本。

没有硬性规定 - 这取决于您的目标市场。

流式传输?

最好的流式传输解决方案是根据用户的连接状态自动为用户提供不同尺寸的视频(自适应流式传输),但这种技术的支持 很差

HTTP 实时流式传输 在 Apple 设备上运行良好,但在 Android 上 支持不佳

在撰写本文时,最具前景的技术是 MPEG DASH,它是一个国际标准。

总之,我们还需要等待一段时间才能获得被广泛接受的自适应流式传输技术(Firefox 不支持 HLS 或 MPEG DASH)。

DIY 自适应流式传输

在没有自适应流式传输的情况下,我们需要尝试确定在开始时加载的最佳视频质量。以下是一份快速指南,可帮助您做出决定。

Wi-Fi 或 3G

使用 已认证 的 Firefox OS 应用程序,您可以检查用户是否在 Wi-Fi 上。

var lock    = navigator.mozSettings.createLock();
var setting = lock.get('wifi.enabled');

setting.onsuccess = function () {
  console.log('wifi.enabled: ' + setting.result);
}

setting.onerror = function () {
  console.warn('An error occured: ' + setting.error);
}

https://mdn.org.cn/en-US/docs/Web/API/Settings_API

您可以在 W3C 设备 API 上找到更多信息。

检测屏幕尺寸

向屏幕尺寸小于 720p 的用户发送 720p 视频毫无意义。有许多方法可以获取用户屏幕的不同边界;innerWidthwidth 可以让您获得良好的了解。

function getVidSize()
{
  //Get the width of the phone (rotation independent)
  var min = Math.min($(window).innerHeight(),$(window).innerWidth());
  //Return a video size we have
  if(min < 320)      return '180';
  else if(min < 550) return '360';
  else               return '720';
}

http://www.quirksmode.org/m/tests/widthtest.html

确定互联网速度

使用 Web 技术很难准确地了解用户的互联网速度 - 通常需要将大型图像加载到用户的设备上并进行计时。这样做的缺点是需要向用户发送更多数据。一些服务,例如:http://speedof.me/api.html 存在,但仍然需要将数据下载到用户的设备上。(Stackoverflow 提供了一些其他选项。)

您可以通过使用 HTML5 更聪明一些,并检查用户开始播放视频到加载一定量的视频之间的时间。这样,我们无需在用户的设备上加载任何额外的数据。以下是一个简短的 VideoJS 示例

var global_speedcount = 0;
var global_video = null;
global_video = videojs("video", {}, function(){
//Set up video sources
});

global_video.on('play',function(){
  //User has clicked play
  global_speedcount = new Date().getTime();
});

function timer()
{
  var diff = new Date().getTime() - global_speedcount;
  //Remove this handler as it is run multiple times per second!
  global_video.off('timeupdate',timer);
}

global_video.on('timeupdate',timer);

此代码在用户点击播放时开始计时,当浏览器开始播放视频时,它会将计时信息发送到 timeupdate。您也可以使用此函数来检测是否发生了大量缓冲。

检测高分辨率设备

最后要确定的一件事是用户是否拥有高像素密度屏幕。在这种情况下,即使他们的屏幕很小,它仍然可能具有大量的像素(因此需要更高分辨率的视频)。

Modernizr 有一个用于检测高分辨率屏幕的插件。

if (Modernizr.highresdisplay)
{
  alert('Your device has a high resolution screen');
}

WebP 缩略图

并非要引发争论,但我们在 Rormix 发现文件大小平均减少了 30%(WebP 与 JPEG),而质量没有损失(在某些情况下减少了 50%)。在数据计划昂贵的国家/地区,数据越少越好。

我们将所有缩略图都编码为多种分辨率的 WebP,并将其发送到支持它们的每台设备,以减少发送到用户的流量。

移动端注意事项

如果您在移动设备上播放 HTML5 视频,它们的行为会有所不同。在 iOS 上,它会在 iPhone/iPod 上自动进入全屏模式,但在平板电脑上则不会。

像 VideoJS 这样的库已 从移动设备中删除了控件,直到它们的稳定性提高。

有用的库

有一些有用的 HTML5 视频库

Mozilla 链接

Mozilla 有关于网络视频的一些很棒的文章

其他有用的链接

关于 Mark Wheeler

Rormix 的首席技术官 - 值得观看的音乐

更多 Mark Wheeler 的文章…


6 条评论

  1. Daniel Davis

    这是一份关于网络视频的一般清单,不仅仅针对 Firefox OS。

    不过,我很好奇,为什么您要使用 JavaScript 来检测屏幕尺寸,而您可以在视频的源元素中使用媒体查询呢?
    http://www.iandevlin.com/blog/2012/08/html5/responsive-html5-video

    2014 年 12 月 6 日 凌晨 00:38

    1. Mark Wheeler

      Daniel,

      您说得对。屏幕尺寸检测只是确定要使用什么质量视频的公式的一部分,我个人更喜欢将所有检测质量的代码放在同一个地方(在这种情况下,全部放在 JS 中 - 而不是与 CSS 混在一起)。

      此外,如果您需要支持旧浏览器(使用 Flash),则 源元素 中的媒体查询 将不起作用

      2014 年 12 月 8 日 下午 20:33

  2. Daniel Davis

    感谢您的回复。这说得通。

    媒体查询将在源元素的“media”属性中,而不是 CSS 中,但我明白您的意思。这似乎是个人偏好问题,但我同意,JS 是为了为旧浏览器提供响应式视频而必需的。

    2014 年 12 月 9 日 上午 07:11

  3. Benergy Sam

    很好的教程,谢谢

    2014 年 12 月 9 日 上午 10:47

  4. Shmerl

    您知道 MPEG-DASH 是否是免专利技术吗?我在这个问题上没有找到明确的信息。

    2015 年 1 月 1 日 下午 19:29

    1. Shmerl

      此外,Firefox 是否可以使用 Media Source Extensions 支持 MPEG-DASH?尽管尚未准备就绪,但它正在 Firefox 中进行开发。MPEG-DASH 是一种服务器端技术,而 MSE 是客户端 JavaScript API,它允许使用 MPEG-DASH。

      2015 年 1 月 1 日 下午 19:31

本文的评论已关闭。