使用标记实现 HTML5 视频回退

本博客的上一篇文章 中,我们谈论了使用 JavaScript 动态创建视频元素。虽然这对 Mozilla 的支持网站来说是一个很好的用例,但在本文中,我们提供了另一套方法,这些方法可能会在网络上得到更广泛的应用。实际上,您可以在 Mozilla 的 Firefox 3.5 新功能 视频、本博客中看到它,并且我们正在看到整个网络上的应用越来越多。

这里的示例应该适用于 Safari 4、Firefox 3.5 和 IE,使用 Flash 回退。如果您正在寻找一个完整的示例,其中包括对视频元素、QuickTime、Windows Media、iPhone 支持和最终的 Flash 支持,您可以尝试查看 适合所有人的视频。它已经过测试,支持 大量不同配置的浏览器,如果您正在寻找对所有内容的支持,这是一个不错的起点。

您也可以查看 Michael Verdi 的 带有回退的视频标签 文章,他使用了一种更简单但更容易理解的方法。

一个简单的示例

在网页中,视频标签 看起来像这样


这将把一个视频元素插入您的页面。Firefox 3.5 将加载视频,确定其大小,并将元素大小调整为视频的自然大小。

Firefox 3.5 支持 Ogg Theora 视频格式,这是一种用于视频的免费开源标准。Opera 和 Google Chrome 也将在以后的版本中包含对 Theora 的支持。Safari 4 在使用 Xiph Quicktime 组件时也可以支持相同的格式,但不能保证存在。Apple 已经授权使用 mpeg4 格式 在 Safari 4 中,并且默认支持。

如果您希望支持这两种格式,则需要能够提供多种格式。您还需要更改标记,以告知浏览器文件类型、首选顺序,然后让浏览器选择使用哪一种来显示视频元素。对于我们的示例,代码如下所示


在这种情况下,浏览器首先会检查它是否支持 video/ogg 视频类型。如果支持,它将使用该类型并加载它。如果它不支持,它将继续到下一个条目,即 mp4 文件,如果支持该文件,它将使用该文件。

虽然大多数现代浏览器都有支持视频元素的具体计划,但微软尚未明确其意图。因此,为了在不久的将来支持 IE 用户,您应该提供回退,直到微软采用新的 HTML5 标准的这一部分。在我们的示例中,我们将使用一个简单的 Flash 回退。

视频元素的一个好处是它很容易降级到旧浏览器。如果在上面的示例中,您的浏览器不支持 video 标签,也不支持 source 标签,它将简单地回退到它们中包含的内容。这使得在非常简单的方式支持回退变得非常容易。下面是一个使用 blip.tv 的 Flash 回退示例。


就是这样。此示例支持所有浏览器,降级良好,有助于一举推动网络发展。HTML5 尚未完成,但 Web 开发人员今天就可以开始利用现代浏览器提供的功能。

完整示例嵌入在下面。


50 条评论

  1. […] 展示了如何使用 JavaScript 将视频对象添加到页面。对于大多数页面,我们建议您阅读包含有关如何使用 video 标签提供简单标记回退的信息的文章。[…]

    2009 年 6 月 22 日 晚上 11:29

  2. Kroc Camen

    我将更新我的信件,感谢您,非常感谢。我终于可以在网络上观看视频了!我只想补充一点,实际的回退文本 *非常* 重要。如果他们无法播放视频,那么下载链接将有所帮助。像 Palm Pre 这样的设备目前需要它!

    顺便说一句,您在第二个示例代码中省略了吗?

    2009 年 6 月 23 日 凌晨 00:09

  3. Da Scritch

    Embed 不是一个好的解决方案:这是一个无用且过时的 HTML 标签。更好的方法是使用 Object 标签,并在其中进行回退。
    正如我在法语中解释的那样:http://dascritch.net/blog.php/post/2009/05/28/Rien-nest-anodin-dans-lopen-source

    2009 年 6 月 23 日 凌晨 00:39

  4. […] 来自 https://hacks.mozilla.ac.cn/2009/06/html5-video-fallbacks-markup/ 的“使用标记实现 HTML5 视频回退” […]

    2009 年 6 月 23 日 凌晨 02:52

  5. Tim

    @Da Scritch:我认为 embed 标签在 HTML 5 中正在卷土重来。就我个人而言,我不喜欢网络发展方向,但 meh。

    2009 年 6 月 23 日 凌晨 02:58

  6. Laurentj

    @da scritch:embed 不是一个过时的元素,它是 HTML5 的一部分:http://dev.w3.org/html5/spec/Overview.html#the-embed-element

    2009 年 6 月 23 日 凌晨 03:08

  7. Jimmy Hartzell

    太好了!每天都首选直接的 HTML 而不是 Javascript。

    2009 年 6 月 23 日 凌晨 03:51

  8. Bob van der Vleuten

    这个 video 标签肯定会成为 Flash 视频的竞争对手,因为越来越多的浏览器开始以良好的方式支持它。我迫不及待地想看到它潜力的释放!

    2009 年 6 月 23 日 凌晨 03:57

  9. […] hacks.mozilla.org 上的“使用标记实现 HTML5 视频回退”很有用,因为它展示了如何使用 video 元素,以及对于不支持 HTML5 的浏览器的回退。(标签:html html5 video howto degrading useful) […]

    2009 年 6 月 23 日 凌晨 04:05

  10. Shawn J. Goff

    很高兴看到这种方法在这里发布!

    2009 年 6 月 23 日 凌晨 04:34

  11. Mike Beltzner

    您忘记在第二个代码段中结束 video 标签了 :)

    2009 年 6 月 23 日 凌晨 04:54

  12. Bernard van Gastel

    我只感到难过的是,如果我在标签中指定了不支持的视频格式,回退内容将不会加载。我认为它降级得很糟糕:如果我只指定一个 h264 视频,Firefox 的视频播放器将加载一个黑屏,因为它无法播放视频。它应该显示回退内容。

    2009 年 6 月 23 日 凌晨 05:35

    1. N.R.

      是的,我也注意到 Firefox 无法正确回退。它应该显示回退内容,而不是显示黑框。有人应该向 Mozilla 提交一个错误。

      我们所做的是,我们创建了一个“HTML5 模式”切换按钮,它根据用户的请求用 video 标签代码替换 embed 代码。这是一种糟糕的变通方法,但它可以使用,直到 Firefox 修复其回退方法。

      如果您有兴趣,我们的解决方案可以在这里查看:http://tiktube.com/?video=317

      2010 年 1 月 29 日 凌晨 06:58

      1. Kit Grose

        这不是(严格来说)一个错误;Firefox 正确地实现了规范。

        我在 WHATWG 邮件列表中多次提出这个问题,并且今天从 Ian Hickson 那里得到了很好的答复:http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2010-February/025028.html

        2010 年 2 月 10 日 凌晨 01:51

      2. jhansi

        是的,我也注意到 Firefox 无法正确回退。它应该显示回退内容,而不是显示黑框。
        你能发送解决上述问题的 HTML5 代码吗…….

        2012 年 2 月 24 日 凌晨 00:42

  13. sxpert

    在我的 iPhone 3Gs 上似乎不起作用

    2009 年 6 月 23 日 凌晨 06:18

  14. t3RRa

    非常棒。HTML5 看起来将非常方便 :)

    2009 年 6 月 23 日 凌晨 06:29

  15. zcorpan

    代码示例应该省略 </embed> 标签(因为 embed 是一个空元素,就像 img 一样),并且应该包含 </video> 标签。

    Da Scritch,embed 在 HTML5 中有效,虽然它不支持回退。

    2009 年 6 月 23 日 凌晨 06:53

  16. Theodora Vorbix

    如何在 javascript 中控制 .play() 方法?我应该先调用 video.play,然后如果前者失败则调用 embed.play 吗?

    2009 年 6 月 23 日 凌晨 06:58

  17. Joe

    非常酷。对 Javascript 的强制使用确实令人担忧。我希望您决定将此提交为在 HTML5 中使用视频的推荐方式。

    2009 年 6 月 23 日 凌晨 07:54

  18. Christopher Blizzard

    @Bernard – 如果您将类型指定给 video 元素,浏览器将显示回退内容。例如,如果您这样做

    <video src=”foo.mp4″ type=”video/mp4″>
    回退内容!
    </video>

    如果您的浏览器不支持 mpeg4,它应该回退到回退内容。

    2009 年 6 月 23 日 凌晨 08:01

  19. Bernard van Gastel

    @Christopher – Mozilla(使用 h264)和 Safari(使用 theora)都没有遵守。它们都只显示空视频播放器。

    2009 年 6 月 23 日 凌晨 08:03

  20. Christopher Blizzard

    @sxpert – 说到这个真是有趣。我昨晚花了一个小时试图弄清楚如何让朋友的 iPhone 播放视频内容。理论上它是受支持的。实际上它文档很少,并且没有提供有用的错误消息。

    2009年6月23日 上午8:04

  21. 去你妈的

    视频里的那家伙真是个白痴。

    2009年6月23日 上午8:05

  22. zcorpan

    看来 WordPress 在 <video> 标记中为每行新内容插入了 <br />,这导致它成为无效的 HTML5。显然,这应该在 WordPress 中修复。作为解决方法,您可以避免在标记中的 <video> 中出现换行符。

    2009年6月23日 上午9:59

  23. Kevin

    autobuffer 参数是否起作用?我想在一个页面上嵌入 3-4 个视频,但即使将 autobuffer 设置为 false,Safari 中的 QuickTime 和 Firefox 中的 Theora 播放器也会在页面加载后立即开始下载所有视频。这不是我想要的,除非用户同意,特别是对于带宽有限的用户。

    2009年6月23日 上午10:18

  24. Kevin

    autobuffer 默认情况下应该是关闭的吗?因为不包括该参数会阻止 Firefox 自动缓冲视频,但 Safari 中的 QuickTime 仍然会在页面加载后立即下载整个视频。

    2009年6月23日 上午10:25

  25. Craig

    @Christopher Blizzard @Bernard van Gastel

    我在 Firefox 上报告了一个错误 https://bugzilla.mozilla.org/show_bug.cgi?id=498540 你是正确的 - 据 HTML5 规范,如果视频(或音频)由于任何原因无法播放(包括不支持的编解码器),则应显示回退内容。

    我目前没有使用 Webkit。有人可以向他们提交类似的错误报告吗?

    恕我直言,这种对规范(尤其是如此年轻的规范)的不遵守非常糟糕,应该尽快修复。我希望 Webkit 和 Mozilla 能够快速处理这种不遵守行为。

    2009年6月23日 下午12:49

    1. N.R.

      太棒了!向你致敬,我希望他们能修复它。

      2010年1月29日 上午6:59

    2. N.R.

      我刚查看了一下,他们把这个错误关闭为无效,因为它据说是 HTML5 规范问题 :( 有人愿意在那里提出这个问题吗?

      这将有助于消除非常丑陋的解决方法。

      2010年1月29日 上午7:04

  26. Matthew Gregan

    @Kevin 是的,从 Firefox 3.5 RC1 开始,autobuffer 默认情况下是关闭的。我们现在只下载足以解码视频第一帧的数据。autobuffer 属性的存在表明作者希望缓冲整个视频。请注意,autobuffer 是 HTML5 所谓的“布尔属性”[0],其中属性的存在表示值为 true,而属性的不存在表示值为 false。因此“autobuffer=false”是无效的标记,这就是它不能按预期执行的原因。

    [0] http://www.whatwg.org/specs/web-apps/current-work/multipage/infrastructure.html#boolean-attribute

    2009年6月23日 下午3:54

  27. […] 原文地址:html5 video fallbacks with markup 系列地址:颠覆网络35天 […]

    2009年6月23日 下午8:09

  28. Kevin

    @Matt 好的,谢谢。我在发布评论后就明白了。删除它使其在 Firefox 中按预期工作,现在如果只有 Safari/Webkit/QuickTime 能够合作,让它们在被告知之前不要缓冲就好了。

    2009年6月23日 下午9:57

  29. Ken Saunders

    这很好,但这是否意味着我必须在我的网站上上传和存储几种不同格式的视频?

    我不想这样做,也不想编写额外的代码,无论它多么基础。

    我想这取决于你有多希望你的网站访问者看到视频。

    我将继续学习有关开放视频的更多信息,并在我的网站上提供它。:)

    2009年6月23日 下午11:59

  30. Adrian

    看起来用户无法完全控制视频播放过程。例如,我打开了这个页面并播放了视频,但我发现了一个问题,我无法回复它 - 一旦我尝试把它放到起点并点击播放,视频就会显示加载状态。

    我在 Windows XP SP3 上使用 Firefox 3.5 RC2 英文版。

    2009年6月24日 上午1:14

  31. zcorpan

    Craig,据我所知,WebKit 和 Firefox 都符合规范,正如我在错误中评论的那样。

    2009年6月24日 上午2:10

  32. Joly MacFie

    有没有地方提供该标签的所有语法?

    是否可以指定单独的缩略图?

    调整视频大小?

    2009年6月24日 下午1:56

  33. John Dowdell

    嗨,Chris,你是否已经在 Internet Explorer 中测试过?我记得他们几个版本前就停止了对 EMBED 的理解,坚持只使用他们自己发明的 OBJECT,并且设法让 HTML4 批准了。

    上面的片段是否真的可以在所有浏览器中工作,以及对于脚本访问、自动播放等参数呢?

    谢谢,jd/adobe

    2009年6月24日 下午3:18

  34. Christopher Blizzard

    @John Dowdell - 是的,我在 IE 8 中尝试过,看起来工作正常。

    片段本身非常简单,没有显示许多高级功能。我可以添加自动播放,所有支持 HTML5 视频的浏览器都支持。

    至于脚本访问,有人正在开发一个很酷的小型访问库,如果浏览器不支持,它会将 Flash 包装在 HTML5 API 中

    http://gettingsoftware.posterous.com/html5flash-using-html5-video-and-audio-right

    这是一个很棒的桥梁,可以让我们从今天的状态过渡到几年后的状态。

    2009年6月24日 下午10:16

  35. […] 确实比 Firefox 3.0 上的好得多(远远落后于 Safari 的)。我们可以发现一种方法来在所有浏览器上使用新的视频标签(在 IE 上,我们将不得不将 Flash 元素嵌入到 […]

    2009年7月2日 下午1:59

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

    2009年7月9日 上午3:33

  37. […] 堆栈?它们可以以增量方式应用吗?我们开始看到视频被提升为一等公民,而 Flash 则成为落后的回退。我们开始看到网络获取 3D 功能 […]

    2009年8月10日 下午2:16

  38. […] 这些堆栈?它们可以以增量方式应用吗?我们开始看到视频被提升为一等公民,而 Flash 则成为落后的回退。我们开始看到网络获取 3D 功能 […]

    2009年8月11日 下午11:06

  39. […] 回复使用 HTML5 视频而不使用 JavaScript:http://tinyurl.com/l9c772 […]

    2009年10月1日 上午11:42

  40. […] : https://hacks.mozilla.ac.cn/2009/06/html5-video-fallbacks-markup/ […]

    2009年10月3日 上午5:58

  41. N.R.

    有人知道如何使用 FFMPEG 编码视频,以便它们可以使用 HTML5 视频标签嵌入并在 iPhone/iPad 上正常播放吗?我们当前的 mp4 文件无法播放,我猜是因为 x264 过程中使用了“vpre hq”

    2010年1月29日 上午7:01

  42. 喷子

    我不愿做个唱反调的人,但 Apple 和 MIcrosoft 永远不会正确支持这些编解码器,而曾经只用 Flash 解决的问题现在将像过去一样混乱不堪。否则,你将不得不制作和优化至少 3 种不同的渲染并将其托管在某个有足够带宽的地方。我认为这与处理类似 2001 年的插件没有什么不同。我祝贺 W3C 和开源开发做出了这个成果,但在生产环境中,这比当前的解决方案成本高得多。即使是“更简单”的标记也比 swfobject 更复杂。

    2010年2月9日 上午11:47

  43. Ernest

    Christopher,这是一个很好的示例。
    但是,它依赖于这样一个事实,即 Web 开发人员会将视频编码为支持视频标签的所有浏览器都可以读取的所有可用格式,这非常不可能。

    如果 Web 开发人员只有 ogg 格式,而浏览器只读取 mp4,那么该片段将不会回退到 Flash(音频标签也会出现这种情况)。

    我试图找到一个简单的指南来实现一个万无一失的解决方案。不幸的是,需要使用 Javascript,因为不可能只用标记来实现。

    http://apirocks.com/html5/audio/quick/(它是针对音频标签的,但它也适用于视频标签)

    2010年2月9日 下午5:01

  44. Clint

    我记得我在某处读到,Apple 要求 html 视频源标签首先列出 mp4 文件,然后可以列出其他版本。我认为,除非 mp4 源在 ogg 之前,否则它不会在 iOS 上工作。

    2010年6月25日 上午0:19

  45. marc

    首先,我要表示衷心的感谢!这个新的 Firefox 4 太棒了,我期待着检查你的一些新插件,PS 把旧的 Grease Monkey 还回来,哈哈

    2010年7月22日 下午4:00

本文的评论已关闭。