视频 – 不止是标签

本文由 Mozilla 贡献者兼 非凡 Open Web 演示 提供者 Paul Rouget 撰写。

从 Firefox 3.5 开始,您可以像嵌入图像一样在网页中嵌入视频。这意味着视频现在是文档的一部分,并最终成为 Open Web 的一等公民。与所有其他元素一样,您可以使用 CSS 和 JavaScript 与之交互。让我们看看这意味着什么……

基础知识

首先,您需要一个要播放的视频。Firefox 支持 Theora 编解码器(点击此处了解音频和视频元素支持的所有媒体格式)。

将视频添加到您的文档

如果浏览器不支持 video 标签,您可能需要添加一些“备用”代码。只需在 video 标签内包含一些 HTML(可能是警告,甚至是一些 Flash)。


这里有一些关于备用机制的更多信息

HTML 属性

您可以在这里找到所有可用的属性

一些重要的属性

  • autoplay:页面加载后立即播放视频。
  • autobuffer:默认情况下(没有此属性),除非您单击播放按钮,否则不会下载视频文件。添加此属性会在页面加载后立即开始下载视频。
  • controls:默认情况下(没有此属性),视频不包含任何控件(播放/暂停按钮、音量等)。如果您想要默认控件,请使用此属性。
  • height/width:视频的大小

示例

您不必在 HTML5 中为这些属性添加“true”值,但这样做更整洁。如果您不在 XML 文档中,您可以简单地写

JavaScript API

与任何其他 HTML 元素一样,您可以通过文档对象模型 (DOM) 访问视频元素。

var myVideo = document.getElementById("myVideo");

获得视频元素的句柄后,您可以使用 JavaScript API for video。

以下是一些有用方法和属性的简短列表(以及有关音频和视频元素的更多 DOM API

  • play() / pause():播放和暂停您的视频。
  • currentTime:当前播放时间,以秒为单位。您可以更改此值以进行搜索。
  • duration:视频的持续时间。
  • muted:声音是否静音?
  • ended:视频是否已结束?
  • paused:视频是否已暂停?
  • volume:用于确定音量,以及更改音量。

示例





事件

您知道如何控制视频(播放/暂停、搜索、更改音量等)。您拥有创建自己的控件所需的大部分内容。但是您需要来自视频的一些反馈,为此,让我们看看您可以监听的不同事件

  • canplay:视频已准备好播放
  • canplaythrough:视频已准备好无中断播放(如果下载速率没有变化)
  • load:视频已准备好无中断播放(视频已完全下载)
  • ended:视频刚刚结束
  • play:视频刚刚开始播放
  • pause:视频已被暂停
  • seeking:视频正在搜索(可能需要几秒钟)
  • seeked:搜索过程刚刚完成
  • timeupdate:在视频播放期间,currentTime 会更新。每次 currentTime 更新时,都会触发 timeupdate。

这里是所有事件的完整列表

例如,您可以跟踪刚刚播放的视频的百分比

function init()
{
  var video = document.getElementById("myVideo");
  var textbox = document.getElementById("sometext");
  video.addEventListener("timeupdate", function() {
  textbox.value = Math.round(100 * (video.currentTime / video.duration)) + "%"; }

}

为了演示这一切,这里有一个使用 Video API 的不错的开放式视频播放器

现在您已经熟悉了 Video API 背后的某些基本概念,让我们真正深入研究视频作为 Open Web 的一部分,将视频引入 CSS、SVG 和 Canvas。

CSS 和 SVG

video 元素是一个 HTML 元素。这意味着您可以使用 CSS 对其进行样式设置。

一个简单的示例:使用 CSS 图像边框规则(Firefox 3.5 中引入的新 CSS 3 特性)。您可以在 Mozilla 开发者维基上查看它是如何工作的

显然,您可以将其与 video 标签一起使用

我的一个演示使用了这个技巧

由于 Firefox 3.5 提供了一些新的漂亮 CSS 特性,您可以做一些非常棒的事情。请查看臭名昭著的洗衣机演示,在这个演示中,我让一位尊敬的同事做了一些旋转。

它使用了一些 CSS 规则

以及一些 SVG

由于 video 元素与任何其他 HTML 元素一样,您可以向视频本身添加一些 HTML 内容,就像我在这个演示中所做的那样。如您所见,视频的顶部有一个<div>元素 (position: absolute;)。

休息时间

好吧,我们刚刚看到了我们可以使用 video 元素实现的程度,包括如何控制它以及如何对其进行样式设置。这很好,也很强大。我强烈建议您阅读有关Firefox 3.5 中可用的新 Web 特性 的信息,并思考如何使用这些特性以及 video 元素。

您可以使用 Open Web 的强大功能做很多事情。您可以计算视频的像素。例如,您可以尝试在视频中查找一些形状,跟踪这些形状,并绘制一些作为这些形状附件的内容。这就是我在这里所做的!让我们看看它是如何工作的。

Canvas & 视频

另一个 HTML 5 元素是canvas。使用此元素,您可以绘制位图数据(请参阅canvas 参考,我强烈建议您查看此 canvas 概述)。但您可能不知道的是,您可以复制<img/>元素、<canvas/>元素和<video/>元素的内容。

这对video元素来说是一个非常重要的点。它为您提供了一种方法来处理视频帧的像素值。

您可以在 canvas 中对视频的当前帧进行“截图”。

function screenshot() {
 var video = document.getElementById("myVideo");
 var canvas = document.getElementById("myCanvas");
 var ctx = canvas.getContext("2d");

 ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
}

您可以首先对 canvas 应用转换(请参阅文档)。您也可以复制视频的缩略图

如果您在 canvas 中绘制每一帧,您的 canvas 将看起来像一个 video 元素。您可以在绘制完帧后,在此 canvas 中绘制任何想要的内容。这就是我在这个演示中所做的

在 canvas 中获得视频帧后,您可以计算像素值

如果您想要计算帧的像素值,需要了解以下几点

  • 您无法在来自不同域的视频上使用此机制。
  • 您无法在来自 file:/// URL 的视频上使用此机制(这在开发 Web 应用程序时很有用)。但是您可以更改测试中的此行为:在 about:config 中,将“security.fileuri.strict_origin_policy”的值更改为“false”。但请务必小心!编辑 about:config —— 这是一个高级功能!
  • 有两种方法可以在视频顶部显示应用程序的结果
    • 使用 canvas 作为视频(如果每次都绘制帧),然后直接在 canvas 中绘制
    • 在视频顶部使用透明的 canvas
  • canvas 元素可以是“display: none”
  • video 元素可以是“display: none”

关于 JavaScript

对于图像处理,您需要进行大量计算。以下是一些技巧

  • 将您的帧复制到一个小 canvas 中。如果 canvas 比视频小三倍,则意味着要计算的像素数量少九倍。
  • 避免递归。在递归中,脚本引擎不会使用 JIT 优化。
  • 如果您想计算颜色之间的距离,请使用L.A.B 颜色空间。
  • 如果你想找到一个物体的中心,计算它的质心。查看我的演示中使用的“computeFrame”函数这个 JavaScript 代码片段
  • 如果算法非常繁重,你可以使用一个Worker 线程,但要考虑到你需要将画布的内容发送到线程。这是一个很大的数组,对象在发送之前会自动进行 JSON 化。这可能需要一段时间。

结论

如你所见,你可以使用视频元素、画布元素、CSS3、SVG 和新的 JavaScript 引擎来完成强大的操作。你拥有创造完全新的视频网络使用方式的一切工具。现在就行动起来吧 - 升级网络!

参考资料

关于 Arun Ranganathan

更多由 Arun Ranganathan 撰写的文章...


17 条评论

  1. Andy

    非常全面的报道。

    谢谢,Paul!

    2009 年 7 月 7 日 下午 8:53

  2. Alexandre

    看起来没有标准方法来提供一些重要的信息,比如缩略图(在视频加载/播放之前显示),以及其他质量(例如切换普通/高清)。
    是的,可以使用 CSS/Javascript 来做到这一点,但我认为有一个标准的、语义上有效的、可访问的方法来做到这一点会很好。

    2009 年 7 月 8 日 上午 2:20

  3. Laurentj

    @alexandre

    > 看起来没有标准方法来提供一些重要的信息,比如缩略图

    不,html5 规范中描述了这种功能:“poster” 属性,你可以在其中指定图像的 URL。但是 Firefox 3.5 中没有实现(将在下一个版本中实现)。

    http://dev.w3.org/html5/spec/Overview.html#attr-video-poster

    > 以及其他质量

    同样,规范允许使用 source 元素http://dev.w3.org/html5/spec/Overview.html#the-source-element

    但是 Firefox 3.5 中没有完全实现。

    2009 年 7 月 8 日 上午 3:01

  4. Ms2ger

    请注意,布尔属性的语法是 |controls|、|controls=””| 或 |controls=”controls”|,而不是 |controls=”true”|。(此外,在最后一个示例中,您两次将 |width| 误写为 |with|。)

    @Alexandre:对于缩略图,有 |poster=””| 属性,但 Firefox 尚未实现。多个版本可以通过多个 |source| 元素(||)来实现,但这似乎也不支持。

    2009 年 7 月 8 日 上午 6:00

  5. […] 更多内容请访问:video – more than just a tag at hacks.mozilla.org […]

    2009 年 7 月 8 日 下午 4:51

  6. @sull

    好文章。

    顺便说一句,我很好奇 poster 属性,然后找到了https://bugzilla.mozilla.org/show_bug.cgi?id=449156

    您知道这个属性何时会在 3.5RC 中可用吗?

    谢谢。

    sull

    2009 年 7 月 8 日 下午 10:31

  7. Henri Sivonen

    视频元素中的 /> 语法在 text/html 中会导致页面其余部分被吞入视频回退。在 text/html 中需要有明确的结束标签。

    2009 年 7 月 8 日 下午 11:40

  8. Alexandre

    Laurentj:感谢您的回复!
    @poster 太棒了,我上次看规范时错过了它 :-)
    是的,我知道 source 可以提供不同的版本(例如 MP4/h264、Ogg/Theora),但如果我想提供相同容器/编解码器的两种或多种不同质量,据我所知,列表中的第一个版本将被播放(我没有详细阅读),但显然没有简单的方法来指定质量和/或从一个质量切换到另一个质量。可能可以通过在“编解码器”部分包含一些质量信息来部分解决这个问题,并在 Javascript 中切换 source 元素的顺序(?)

    2009 年 7 月 9 日 上午 1:43

  9. Vince

    为什么不能同时支持 Mpeg4 和 Ogg Theora!?为什么一定要这么难?如果我想实现这个标签,我必须使用三种视频格式才能确保它在所有浏览器中都能正常工作!三种!我宁愿坚持使用 Flash,因为每个人都会安装它的插件。作为一个业余时间试图维护网站的独立开发者,当一个很棒的新规范出现,而每个人都想要在编解码器上进行一场毫无意义的竞争时,这真的让人很沮丧,最终损害了我们开发者。

    感谢 Mozilla/Apple!

    2009 年 7 月 10 日 上午 9:35

  10. @sull

    Vince-

    您也可以提供三种格式。但您也可以只提供您想要的格式,而忽略其他格式。

    拥有默认编解码器不会给开发者带来更多问题。但是,拥有默认编解码器可以帮助内容创作者更有把握地确保视频可以在现代浏览器中播放,而无需额外的插件(这些插件需要使用各种编解码器进行适当更新)。

    2009 年 7 月 13 日 下午 3:42

  11. @sull

    我的评论被删除了,但无论如何... 我想说的是,video 标签可以用于 flv 或 mp4 或其他格式,而不仅仅是 ogg 媒体。指定 ogg 文件不是必需的。

    2009 年 7 月 13 日 下午 3:46

  12. @sull

    Vince,

    我现在明白您的意思了。我误解了。

    FF 中缺少对使用原生 video 标签的 mp4 的支持主要与许可有关,正如这里和其他地方所讨论的那样。

    但老实说,作为一个开发者,我认为缺少使用 video 元素的原生 mp4 支持不会给视频处理增加太多复杂性 - 你可以使用像这样的东西 - http://metavid.org/wiki/Mv_Embed 或者进行自己的浏览器检测并相应地输出。它并不比目前的媒体嵌入状态更糟糕。

    这不是开发者的问题,而是内容创作者的担忧... 也就是您构建的网站/页面的用户。
    视频内容创作者通常习惯为不同的平台和设备提供多种格式。这方面也没有太大变化。不过,我希望... 有更多 Ogg 媒体。

    除非您是负责整合 h.264 的成本的人,否则这个论点就没有多大意义... 而且随着 Ogg Theora 的改进... 与任何质量差异相比,这种成本是无法证明的。

    2009 年 7 月 14 日 上午 11:40

  13. […] 随着 Firefox 版本升级到 3.5,正式支持 HTML5,坊间对该标准的讨论就没停过。其中最显著的,<video>标签,因为对浏览器该支持哪一个视频编码而纠结不休,很是著名。 […]

    2010 年 1 月 21 日 上午 8:42

  14. Komrade Killjoy

    MPlayer 用于视频

    Firefox 用于标记

    用 Firefox 代替 MPlayer 是愚蠢的

    :P

    2010 年 7 月 28 日 上午 5:38

  15. Alfredo

    你好!

    我搜索过,但没有找到这个视频选项。

    情景描述
    在一个 web page.php 中,我有 2 个 DIV。
    每个 DIV 都有一个视频。
    首先,我显示 DIV id=”one”,它自动开始播放。
    我知道它的持续时间,所以例如,10 秒后,我隐藏它的 DIV 并显示 DIV id=”two”。
    我使用 2 个 Javascript 函数。

    问题
    有时,DIV id=”one” 中的视频准备播放的时间过晚,开始播放的时间过晚,但 10 秒的倒计时已经开始了。因此,它将在(10 - (延迟))秒后被中断。
    视频可能是从 youtobe 或其他服务器上链接的,格式可能是 flv、wmv 或 ogg。

    需要
    如何知道视频何时开始播放,以便在该时间开始倒计时?
    是否有 Javascript 选项可以让我获取视频开始播放时的状态 = 'true',以便我可以开始倒计时来切换 DIV?

    谢谢!
    Alfredo。
    米兰。

    2010 年 11 月 21 日 上午 7:08

  16. […] 可以使用 Canvas 分析和操作视频,以注入内容 […]

    2011 年 4 月 25 日 上午 6:19

  17. […] 可以使用 Canvas 分析和操作视频,以注入内容 […]

    2011 年 4 月 25 日 上午 7:12

本文的评论已关闭。