使用 HTML5 视频并回退到其他格式

Mozilla 支持项目 (Mozilla Support Project) 和 support.mozilla.com(简称 SUMO)是一个开放的、由志愿者驱动的社区,每周帮助超过 300 万 Firefox 用户获得支持并解决他们最喜欢的浏览器的疑难问题。Firefox 支持社区维护着一个包含 30 多种语言文章的知识库,并通过我们的支持论坛或实时聊天服务直接与用户互动。他们整理了以下关于如何同时使用开放视频和基于 Flash 的视频,以便为用户提供嵌入式视频的演示,无论用户的浏览器是什么。本文由 Laura Thomson、Cheng Wang 和 Eric Cooper 撰写。

注意:本文展示了如何使用 JavaScript 将视频对象添加到页面。对于大多数页面,我们建议您阅读这篇文章,其中包含有关如何使用 video 标签提供简单的标记回退的信息。基于标记的回退比 JavaScript 解决方案更优雅,通常建议在 Web 上使用。

Web 上开放视频采用的一个挑战是确保在线视频在目前不支持开放视频的浏览器上也能表现良好。与其要求使用这些浏览器的用户下载视频文件并使用单独的播放器,新的 <video> 标签会优雅地降级,允许 Web 开发人员为每个人提供良好的体验。随着 Firefox 3.5 升级了 Web,在这个过渡时期,用户可以根据其浏览器支持的情况,无缝地显示开放视频或使用现有插件的视频。

在 SUMO 中,我们使用此系统提供解决问题步骤的屏幕截图,例如 关于如何将 Firefox 设置为默认浏览器的文章

如果您使用 Firefox 3.5 或其他支持开放视频的浏览器访问该页面,并点击“观看这些说明的视频”链接,您将获得一个使用 Ogg 格式文件的屏幕截图。如果您使用不支持 <video> 的浏览器访问,则将获得使用开源 .flv 播放器和相同视频(以 .flv 格式编码,或在某些情况下使用 SWF Flash 格式)的完全相同的用户体验。这些替代观看方法使用几乎无处不在的 Adobe Flash 插件,这是在 Web 上显示视频最常见的方式之一。

代码的工作原理如下。

在包含屏幕截图的页面中,我们包含了一些 JavaScript 代码。以下是该代码的摘录,但您可以从 Mozilla SVN 查看或检出完整列表。

代码首先设置一个对象来表示播放器。

Screencasts.Player = {
width: 640,
height: 480,
thumbnails: [],
priority: { 'ogg': 1, 'swf': 2, 'flv': 3 },
handlers: { 'swf': 'Swf', 'flv': 'Flash', 'ogg': 'Ogg' },
properNouns: { 'swf': 'Flash', 'flv': 'Flash', 'ogg': 'Ogg Theora' },
canUseVideo: false,
isThumb: false,
thumbWidth: 160,
thumbHeight: 120
};

我们为每种可能的视频格式分配一个优先级。您会注意到我们还有 'canUseVideo' 属性,其默认值为 false

稍后在代码中,我们测试用户的浏览器以查看它是否支持视频。

var detect = document.createElement('video');
if (typeof detect.canPlayType === 'function' &&
    detect.canPlayType('video/ogg;codecs="theora,vorbis"') == 'probably' ) {
      Screencasts.Player.canUseVideo = true;
      Screencasts.Player.priority.ogg =
          Screencasts.Player.priority.flv + 2
}

如果我们可以创建一个 video 元素并且它指示它可以播放 Ogg Theora 格式,我们将 canUseVideo 设置为 true 并将 Ogg 文件的优先级提高到高于 .flv 文件的优先级。(请注意,您还可以检测浏览器是否可以播放 .mp4 文件以开箱即用地支持 Safari。)

最后,我们使用优先级来选择实际播放的文件,方法是遍历文件列表以找到优先级最高的那个文件。

for (var x=0; x < file.length; x++) {
  if (!best ) {
    best = file[x];
  } else {
    if (this.priority[best] < this.priority[file[x]])
      best = file[x];
  }
}

有了这些部分,浏览器只会显示最高优先级的视频,并且以其可以处理的格式显示。

如果您想了解更多关于 Mozilla 支持项目的信息或参与帮助 Firefox 用户,请查看他们的 入门指南

资源

* 注意:要在 Mac OSX 上使用 Safari 4 查看此演示,您需要使用 Xiph Quicktime 插件(可从 http://www.xiph.org/quicktime/download.html 获取)为 Quicktime 添加 Ogg 支持。

关于 Laura Thomson

Laura Thomson 的更多文章……


37 条评论

  1. Sevenspade

    稍后在代码中,我们测试用户的浏览器以查看它是否支持视频。
    if (typeof document.createElement('video').play === 'function' ) { Screencasts.Player.canUseVideo = true; Screencasts.Player.priority.ogg = Screencasts.Player.priority.flv + 2 }

    创建并丢弃 video 元素——无法重用;该节点被遗留在任何地方——只是为了测试 video 元素是否受支持?说真的?为什么不直接测试 HTMLVideoElement 是否存在?

    2009 年 6 月 18 日 21:53

  2. Kroc Camen

    但是,但是,……*颤抖的嘴唇*我已经解决了这个问题——无需 JavaScript。

    http://camendesign.com/code/video_for_everybody

    我的系统上没有安装 Flash,_拜托_ Mozilla,请在您所有的博客和网站上采用 HTML5。我无法看到您的公告,这似乎与你们在使 HTML5 视频变得出色的工作背道而驰!

    2009 年 6 月 19 日 00:36

  3. [...] 使用开放视频同时保持与旧浏览器的兼容性:https://hacks.mozilla.ac.cn/2009/06/html5-video-fallbacks/ [...]

    2009 年 6 月 19 日 01:38

  4. John Drinkwater

    如果您想要无需 JavaScript 的回退,请查看 http://camendesign.com/code/video_for_everybody

    2009 年 6 月 19 日 01:59

  5. Da Scritch

    这个“解决方案”完全不好,因为您使用了 HTML 和 Flash 之外的其他技术来读取它。您应该只遵循最小的因素,即 HTML,并且完美地工作。

    这就像使用 swfobject.js 嵌入 Flash 一样糟糕。

    请在其他人使用它之前将其删除。

    2009 年 6 月 19 日 06:48

  6. CWW

    实际上,http://camendesign.com/code/video_for_everybody 解决方案存在以下问题:1) 屏幕截图由网站用户上传,因此需要提供无需 ogv(或 mp4)的选项,因为我们缺乏服务器端转换功能。2) 许多人没有安装 Flash 10。(尤其是在支持方面,我们会遇到各种过时软件的用户)。因此,唯一需要的文件格式需要是 H264 或更低版本。3) 最流行的屏幕录制软件(Jing)实际上会创建 SWF 文件,无法从中提取视频源。

    如果您完全控制您的媒体并且能够创建和托管三种不同的文件格式(ogv、mp4、h264)或让 Flash 9 用户处于劣势,那么 Kroc Camen 的解决方案非常棒(我敢说更好)。在这种情况下,我们既没有这种优势,但网站调查显示,每周 300 万网站用户中只有不到几百人关闭了 JS(而且这些人可能是志愿者而不是寻求帮助的用户),因此 JS 解决方案很合适。(是的,我应该将其放在博文中,但这就是当博文由某人(我)撰写时发生的事情,这个人没有编写代码,只是看到了演示。)

    2009 年 6 月 19 日 07:51

  7. pd

    这篇博文和关于“开放”视频的其他几篇博文简直是垃圾信息宣传的垃圾堆。

    如果您真的要将视频“开放”给浏览器,那么您应该完成实施对用户系统上安装的*任何*编解码器支持的工作。

    DirectShow 支持在几个月前已达到工作二进制版本的程度。我下载了它,并能够愉快地播放从 XviD 到 MPG 的任何内容。以下是 URL

    http://pearce.org.nz/firefox-directshow-video-2008_10_24.win32.zip

    这是一个示例页面

    http://pearce.org.nz/player/

    这是一个 Mozilla 试图证明其方法合理的错误

    https://bugzilla.mozilla.org/show_bug.cgi?id=435339

    现在是不是该让“开放”真正意味着对任何人开放了?而不是对 Mozilla 的意识形态开放?

    万维网何时才能真正成为人民的网络,而不是浏览器供应商选择向我们展示的网络?

    Mozilla 的底层理念是伪装成“技术官僚”的数字共产主义独裁统治,还是像你们让我们相信的那样,是仁慈的数字社会主义?

    我赌 5 美元,Mozilla 的审查员不会发布这条评论!

    2009 年 6 月 19 日 08:05

  8. Derek

    Kroc,你的网站坏了。在你修复它之前,停止垃圾邮件。

    2009 年 6 月 19 日 10:24

  9. Justin Dolske

    “视频适用于所有人”方法的一个潜在问题是,video 标签内的内容(所谓的回退内容)仍然由浏览器解析和创建。因此,例如,如果您的 Flash 视频自动播放,您将听到它和 OGG 视频同时播放。

    请参阅 https://bugzilla.mozilla.org/show_bug.cgi?id=487398

    2009 年 6 月 19 日 12:04

  10. David Baron

    HTML video 元素的设计难道不是为了让您将旧浏览器的回退作为 video 元素的内容吗?为什么这里需要 JavaScript?

    2009 年 6 月 19 日 16:54

  11. Kaiwai

    @Derek

    您为什么不停止使用那些糟糕的 Web 浏览器呢——Kroc 的网站可以在 Firefox、Safari、Chrome 和 Opera 上正常工作。您显然正在使用 Internet Explorer——帮我们所有人一个忙,找个黑洞把自己埋起来吧。

    2009 年 6 月 19 日 18:05

  12. John Drinkwater

    pd,
    允许超出狭窄范围的格式可能会损害 Web,因为然后由于网络效应,每个 Web 设备都必须满足这些额外的编解码器、容器等。
    我看不到 iPhone、CrunchPad、G1、N97 等支持如果在网络上鼓励使用全部范围的编码,则需要的全部编解码器。
    所以请停止相信,Mozilla 通过开放而变得思想封闭,因为他们并非如此。

    CWW,
    Krocs 解决方案只需要 .MP4 和 .ogv 文件(只有两个),并且使用 Firefogg 等扩展程序,用户可以从其浏览器上传 Theora 视频……
    但是,请您将此帖子从 hacks.mozilla.org 中删除,它开了个坏头。
    如果您只需要一个视频、Flash 和回退的演示,那么请这样做——无需 JavaScript。

    此致,

    2009 年 6 月 20 日 04:39

  13. Christopher Blizzard

    @John – 我感谢您所说的话(以及您签署的信?),以及 Kroc 的想法。我已经要求 Kroc 撰写另一篇文章,我们可以在这里发布,其中描述了使用回退功能发布视频的非 JavaScript 方法。如果他决定撰写,我很乐意从此帖交叉链接到那篇文章。

    2009 年 6 月 20 日 05:53

  14. Kroc Camen

    @Christopher Blizzard

    你好,Chris!感谢您的回复。在所有可能实际链接到该信函的地方,以便 Mozilla 工程师有机会看到它,我忘了这里。因此,如果人们想知道所有争议的原因,请阅读此处

    http://camendesign.com/blog/letter_to_mozilla_re_video

    Chris,我已经回复了你发给我的邮件,提议我们可以对替换文章做些什么。希望您同意!

    2009 年 6 月 20 日 12:28

  15. [...] livros o que é importante para combater a ditadura dos plugins neste campo) Muito interessante este exemplo com fallback para outros [...]

    2009 年 6 月 20 日 14:30

  16. William Lacy

    OGGTV 上的 HTML5 OGG 视频播放测试页面仅在具有原生 OGG 多媒体播放功能的特殊 Opera 浏览器上有效。我必须等到所有 Mozilla javascript 错误都得到解决后,才能将一整套 HTML5 OGG 扩展添加到站点的框架中。

    测试视频稍后将使用更新的 OGGTV 进行更改。

    2009 年 6 月 20 日 15:19

  17. CorporateUser

    许多公司出于安全原因会过滤 JavaScript 或在设置中将其禁用。我的雇主(一家银行)也是如此。

    因此,此类环境中的用户对这种建议的实现方案不太满意——在我看来,这也像是用卡车而不是汽车本身的轮胎来移动汽车。但是,你们这些像神一样的开发人员可能比我更了解这一点,我仅仅是 Web 的一个头脑简单的用户;-)

    因此,再次重申:对于我们所有企业用户,请不要在没有绝对必要的情况下传播 JavaScript。

    感谢您,感谢一家 IE 占主导地位的大公司中一位谦逊的 Firefox 布道者。

    2009 年 6 月 21 日 00:00

  18. Eevee

    啊,拜托,别这样。我实在受不了那些使用复杂 JavaScript 来实现本可以用简单 HTML 完成的事情的网站了。它在 NoScript 下无法工作(通常也没有有用的回退方案),更难检查,也更难在客户端修改。这不是 Web 应该成为的样子,Mozilla。

    2009年6月21日 凌晨2:27

  19. Mike

    我们打算在我们的 Oracle 参考库网站(http://psoug.org)上使用 Kroc Camen 的实现,因为这才是它**应该**被实现的方式。JavaScript **不是**必需的,也不应该被使用。

    非常感谢 Kroc 发布了使用 HTML5 嵌入视频的正确方法。对于那些希望以正确方式(而不是 FUBAR 方式)进行操作的人,Kroc 的页面在这里:http://camendesign.com/code/video_for_everybody

    -Mike

    2009年6月21日 上午10:35

  20. Nick

    我更倾向于以下方法:在标记中仅使用 video 元素和回退内容。然后在页面加载时运行一个 JS 脚本,将 video 元素转换为不支持 HTML5 视频的浏览器的相应 object 元素。

    唯一可能无法看到嵌入视频但技术上可以的用户是那些启用了 Flash 但禁用了 JavaScript 的用户。而这部分用户在大多数受众中所占比例微乎其微。

    2009年6月21日 上午11:35

  21. Lars Trieloff

    我一直在研究一种直接在 HTML 中使用 video 标记的方法,但会使用一个 JavaScript 包装库来提供一个 Flash 回退,该回退仍然实现了大多数 HTML5 mediaelement API。这使得即使在使用 Flash 回退时,也可以使用一个标准化的跨浏览器 API 来启动、停止和恢复视频播放。由于技术的逐步改进,HTML 仍然包含 video 元素,以便混合和聚合继续工作。

    这里有一篇博文描述了我的方法:http://gettingsoftware.posterous.com/html5flash-using-html5-video-and-audio-right,源代码可以在 Github 上找到。

    2009年6月21日 下午2:06

  22. sxpert

    @PD
    你欠我们每个人 5 美元 ;)

    2009年6月21日 晚上11:58

  23. […] 原文地址:using HTML5 video with fallbacks to other formats 系列地址:颠覆网络35天 […]

    2009年6月22日 凌晨0:07

  24. Steven Rowat

    我同意到目前为止评论中普遍的情绪:不,拜托,不要使用 JavaScript!我相信,这是 Web 的一个重要十字路口:一个开放、标准、易于使用的 HTML 视频现在至关重要,以避免另一个十年的企业混淆。据我所知,audio 标签(这是我主要关注的)与视频一样,在整个 Web 上都面临同样的问题,因此我请求 Mozilla 对其也采取同样的措施:真正制定一个具有最佳回退方案的真正 HTML 5 实现;无需 JavaScript。

    2009年6月22日 上午10:12

  25. Kroc Camen

    @Mike @Lars Trieloff

    那些不执行 JavaScript 的 RSS 阅读器怎么办?

    Lars,一个通用的 API 绝对是需要的,我认为如果我们能够将 Video for Everybody 与 HTML5Flash 结合起来,这样就不需要 JavaScript 来观看视频(包括 Flash 用户),但 JavaScript API 允许人们做更多高级的事情并与页面交互,这对每个人都有好处。

    2009年6月22日 上午10:15

  26. […] 本博客之前的一篇文章中,我们讨论了使用 JavaScript 动态创建视频元素。虽然这是一种很好的用法 […]

    2009年6月22日 晚上11:25

  27. Lars Trieloff

    @Steven:对于像视频播放这样的基本操作,不需要 JavaScript——同意。但是,如果你想在 Web 上构建一个非线性视频编辑器,创建你自己的控件等等,你需要 JavaScript。这就是我的解决方案的目标所在。我也期待在未来的示例中整合 Video for Everyone,以便简化操作。

    @Kroc:RSS 阅读器是一个不同的主题,因为
    – 它们的升级周期比浏览器短,因此它们很快就能原生实现 html5 视频
    – 基于 Web 的阅读器无论如何都会使用 JavaScript,它们甚至可以使用 html5flash 来实现 html5 视频
    – 有 MediaRSS,它类似于带有多个源元素的 video 元素

    在我看来,真正需要关注的是在标记中包含 video 元素,以便用户代理了解正在发生的事情,并为非 FF/非 Chrome/非 Safari 用户提供回退。在我的用例中,禁用 JavaScript 的用户不太常见,并且禁用 JavaScript 通常与禁用 Flash 和插件相关,这将使大多数回退无法使用。

    2009年6月23日 上午8:24

  28. Steven Rowat

    @Lars
    “…视频播放等基本操作不需要 JavaScript。”
    很好,谢谢;只需要再问一下“基本操作”包括什么内容

    我的需求,我相信其他人出于各种原因和用例也会有类似的需求,是这样的:是否可以在屏幕上显示的标准音频(和视频)标签控制器上,无需 JavaScript,通过 CSS 修改颜色、透明度、大小和控件功能?

    例如,我正在做一个网站,每个网站都有超过 100 首诗的网页。每首诗都是独一无二的,都有独特的图像背景,并且包含它的页面旨在作为一个整体来体验:包括,如果添加了音频控制器,则对控制器颜色、透明度以及可用控件的大小和类型有不同的需求。当前的 Windows Media、QuickTime 和基于 Linux 的控制器缺乏一些或全部基本颜色、大小、透明度和控件的可配置性,并且在不同的操作系统和浏览器上仍然有所不同。在许多诗歌中,WM 和 QT 控制器显得过于突兀和不协调,以至于我放弃了尝试使用它们,而是等待 HTML5 音频/视频标签,在那里我打算再次尝试——我希望能够跨浏览器和操作系统设置一致的控制器。

    所以,我的问题是:现在是否可以进行这种控制器的配置——并且无需 JavaScript?

    2009年6月23日 上午11:02

  29. Lars Trieloff

    @Steven – 不,控制器无法使用 CSS 进行样式设置。这就是我的库发挥作用的地方(你可以查看源代码,它并不难做)

    规范中写道

    controls 属性是一个布尔属性。如果存在,则表示作者未提供脚本化控制器,并希望用户代理提供其自己的控件集。

    如果该属性存在,或者如果媒体元素禁用了脚本,则用户代理应向用户公开一个用户界面。此用户界面应包括启动播放、暂停播放、跳转到内容中的任意位置(如果内容支持任意跳转)、更改音量以及以更适合用户的方式显示媒体内容(例如全屏视频或在独立的可调整大小的窗口中)的功能。还可以提供其他控件。

    这还列出了所有“基本内容”:播放/暂停/跳转/音量

    2009年6月23日 下午12:10

  30. Steven Rowat

    @Lars
    谢谢,这很有帮助,我会看看你的代码。

    我使用 PHP 生成 HTML 代码,所以如果它能弥补 CSS 不能做的事情,对我来说会很棒;但我认为在这里不可能,因为只有浏览器读取的 JavaScript 或 HTML 才能在这种客户端问题中应用。这是正确的吗?

    2009年6月23日 下午2:20

  31. […] 这里有一些关于回退机制的更多信息。 […]

    2009年7月7日 晚上8:04

  32. […] 演示如何在 <video> 中播放 flv 文件的文章 […]

    2009年7月8日 凌晨3:22

  33. […] 一封反对 JavaScript 在操纵 html5 结构方面弊端的公开信。谢天谢地,他们都过上了幸福的生活[更正了原文],尽管这无疑表明了所涉及的困难 & […]

    2009年7月10日 凌晨1:06

  34. Fred K

    我知道现在提出有点晚了,但我有两个问题
    1) 为什么开发人员——无论大小——都需要创建/获取同一视频文件的两个不同版本才能覆盖尽可能广泛的受众?(并且还希望微软不会决定推出他们自己的媒体格式并排斥其他格式。)至少两个。如果添加了 Flash,则为三个。这与 HTML 5 的精神完全背道而驰,在我看来,这可能会阻碍其普及速度。在我看来,如果我使用 element 发布一个 mp4 文件(例如),那么拥有或决定安装相应浏览器插件的用户应该能够观看该文件。如果我发布一个 ogg 文件,也是如此。我们现在看到的是双方在推行各自的编解码器,不允许播放对方的格式,而微软则在幕后等待。这不好。Mozilla/Opera 和 Apple/Google 需要尽快解决这个问题。然后微软就可以加入进来——不是吗?

    2) 显然,文件扩展名 .ogv 使 Firefox 中无法播放 ogg 视频。这很奇怪,因为当使用 ffmpeg2theora 将文件转换为 ogg 视频(我在 Mac 上,ffmpeg2theora 是推荐的转换器)时,它会自动将它们制作成 *.ogv* 文件。并且由于此信息几乎不存在(即 .ogv 文件在需要 ogg 文件才能播放 HTML 5 视频的主要浏览器中无法播放),因此需要进行大量的挖掘才能理解到底发生了什么。如果你只允许一种文件格式,请确保关于此的信息非常清晰且易于获取。如果没什么别的,也要避免我再得一次溃疡……(我会把这个问题告诉 ffmpeg2 的人,但你(Mozilla)和 Opera 需要开始将此信息公开。)

    谢谢

    2009年9月27日 晚上6:36

  35. Daniel D

    虽然我现在才提出,但我还是忍不住要附和 Fred 第一个问题中提到的观点
    我也认为没有必要将每个文件都编码两次。这纯粹是浪费磁盘空间!
    对于业余爱好者内容提供者来说,这似乎无关紧要,但如果你是——比如说——一个学术机构,要在一个视频点播服务中提供讲座录音,那么很快就会累积起来。
    为了什么?
    编码 H.264,将其打包到 MPEG 4 容器中,并(通过 Flash 回退)可以将其提供给几乎所有人——好吧,除了 Firefox 用户。

    让我澄清一下
    是为了混淆 Web 视频中的 Flash,对吧?
    那么,为什么在地球上要以一种无法优雅地处理编解码器不匹配的方式来实现它呢?
    如果——出于任何意识形态的原因——Mozilla 最初选择不支持 MPEG 4 并选择 Ogg/Theora(几乎没有人使用,但嘿,它是开放的)作为替代,那么为什么不至少优雅地处理 MPEG 4 内容呢?
    例如——询问(插件)系统是否有任何内容可以处理该类型,如果没有,则传递给回退?

    我强烈怀疑,以这种方式实现它不会花费太多精力……

    我是认真的,伙计们
    编解码器优越性的争斗*不应该让你的用户来承担!

    (*再说一次,从技术角度来看,Theora _并不_优于 H.264——如果我没记错的话;它唯一提供的优势是它是开放的)

    另外
    把我加入“不要鼓励为此使用 JavaScript!”的人员名单中。

    谢谢

    2009年11月2日 凌晨3:12

  36. Roger Watson

    我刚刚使用 iPhone 访问了 Kroc Camen 的网站,演示视频在 iPhone 上无法播放。
    此外,我使用他的方法让视频在 iPad 上播放,但视频在 iPad 上也无法播放(实际上播放和暂停控件没有显示出来(它们在那里,但由于某种原因不可见),但如果你按下屏幕上你知道播放按钮应该在的位置,视频就会播放)。
    此外,如果你在电脑上运行 Safari,则必须按下暂停按钮才能播放视频,按下播放按钮才能暂停视频。
    拜托!
    Kroc,真是个骗子!

    2010年4月24日 上午10:04

  37. Kelly

    到目前为止,HTML5 中 video 标签的所有实现都需要花费(用网络术语来说)很长时间才能加载然后播放。

    我在 Mac 上的 Safari 和 Firefox 中访问同一个网站,并在 Windows 上执行相同的操作。

    在所有情况下(到目前为止),html5 视频都需要 10 到 25 秒(!) 才能播放。在这个世界上,时间太长了。

    至少 Flash 甚至 QuickTime 在 5 秒内就开始播放。你可以暂停并等待,并且似乎比等待 10 秒钟没有任何事情发生时更有控制权。

    我唯一关心的是快速轻松地将内容传递给受众,而这正是所有用户的 100% 愿望。不,我们开发者不是用户,即使我们在下班后也不算……这是一种不同的思维方式。

    除非你在电影预告片网站上,否则视频应该在 5 秒内开始播放,否则内容就算失败。

    2010年6月17日 09:16

本文评论已关闭。