浏览器支持.mov视频



我正在尝试在网络视频(使用HTML5视频标签)上显示直接从使用iOS 12.2的iPhone SE通过电子邮件发送的视频。文件扩展名为.mov,使用的编解码器是H.264和AAC。我正在尝试弄清楚是否需要将视频转换为另一种格式以实现对 95% 的美国浏览器的跨浏览器支持。

我在CanIUse上查找了对视频元素的支持,sub features选项卡显示了有关以下格式的更多详细信息的链接:

  • 韦伯姆
  • MPEG-4/H.264
  • 奥格/理论
  • 网络VTT
  • HEVC/H.265

我读过.mov文件可以使用 MPEG-4 格式。网络上的.mov扩展与.mp4扩展有什么特别之处会影响浏览器支持吗?

换句话说,CanIUse 上的 MPEG-4/H.264 表是否适用于.mov文件,与.mp4文件相同?还是有什么区别?

根据 https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Containers#quicktime 的说法,大多数现代浏览器不支持Quicktime容器格式(.mov)。但是,我自己测试它,我确实看到了不同的结果:

测试设置

视频文件:一个.mov容器,里面有一个 H264 视频(编解码器 avc1.640028)(从 macOS 上的 Quicktime 导出)

.HTML:

<video width="1280" height="720">
<source src="lightbulbs-h264.mov" type="video/quicktime">
No video support.
</video>

变量:

多个
  • 操作系统上的多个浏览器(涵盖WebKit,Blink和Gecko引擎)
    • macOS 13.2.1
      • 火狐 113.0.1
      • 野生动物园 16.3
      • 铬 113.0.5672.126
    • Windows 11(通过VirtualBox)
      • 边缘 113.0.1774.50
      • 火狐
    • 安卓 (OxygenOS 13.1)
  • source标记中的多个type声明。

现场示例:https://codesandbox.io/s/happy-platform-nwsg4u?file=/index.html

结果和结论

浏览器video/quicktimevideo/mp4video/mp4; codecs="avc1.640028"
Safari (mac)
火狐浏览器 (Mac)
铬(苹果)
边缘(赢)
火狐 (赢)
铬(赢)
Chrome (Android)
三星互联网(安卓)
UC (安卓)
歌剧(安卓)
边缘(安卓)
火狐 (安卓)
Tor 浏览器 (安卓)

.mov文件和 caniuse.com

上OP问题的最后一部分尚未得到回答。

换句话说,CanIUse 上的 MPEG-4/H.264 表是否适用于.mov文件,与.mp4文件相同?还是有什么区别?

查看CanIUse的原始支持数据,我们将在相应的features-json/mpeg4.json数据文件中找到MPEG-4/H.264编解码器的必要元数据,在第563行:

"keywords":"avc,mp4,mpv,mov,aac,h264",

当然,mov也可能是其他地方的关键字,但是在搜索给定的存储库时,只能在features-json/mpeg4.json数据文件中找到它,相应地,在文件中各一次data.jsonfulldata-json/data-1.0.jsonfulldata-json/data-2.0.json只是所有features-json/文件的组合。

所以,是的。CanIUse 上的 MPEG-4/H.264 表适用于.mov文件的方式与适用于.mp4文件的方式相同。

关于浏览器对.mov文件的支持的附录

关于第一个问题:

我读过.mov文件可以使用MPEG-4格式。网络上的.mov扩展与.mp4扩展有什么特别之处会影响浏览器支持吗?

.mov容器格式与MPEG-4/H.264编解码器之间的关系已经在Gerrit Bertier的回答中阐明了。

我想补充一点,例如关于视频和音频内容的MDN Web Docs状态:

每个<source>元素还有一个type属性。这是可选的,但建议您包含它。type属性包含<source>指定的文件的MIME类型,浏览器可以使用type立即跳过他们不理解的视频。如果未包含type,浏览器将加载并尝试播放每个文件,直到找到一个有效的文件,这显然需要时间并且是不必要的资源使用。

所以,这是分支预测的典型案例。

Blink/Chromium浏览器似乎采取了严格的方法来从字面上读取video/quicktime,并假设.mov文件使用现在广泛不支持的QuickTime格式。一方面,避免了使用可能不受支持的编解码器加载文件的开销。唉,另一方面,.mov排除了使用仍然支持的编解码器(如 MPEG-4/H.264 或 AVI)的容器文件。这个想法是应该明确声明MPEG-4/H.264文件,例如作为video/mp4,独立于文件扩展名。如果它是外部的.foo文件,但video/mp4内部,则只需使用正确的MIME类型即可。

但是,像Firefox这样的其他浏览器可能会假设 - 像 caniuse.com -.mov文件很可能使用MPEG-4/H.264编解码器并接受错误的风险,因为命中次数可能多于失败次数。

最后,Safari是苹果的浏览器。由于QuickTime编解码器是由Apple引入的,因此Safari仍然支持它,接受一个video/quicktime容器,其中包含任何受支持的编解码器。

关于@JesseGavin的查询

"帖子中的最后一个问题对我来说非常有趣。如果有人能提供更多信息,那将是有帮助的。

如果说这个问题可以重新问为:

如果 MOV 和 MP4 在结构上相似,并且可以使用相同的音频/视频编解码器,那么是什么让浏览器接受 MP4,但如果它们相等,也会拒绝 MOV?

那么其原因可能会有所不同。我怀疑FYTP是出乎意料的。你可以花一整年的时间探索差异。最好重新措辞问题,然后问:

"我们可以对MOV做些什么来使其被任何媒体播放器/浏览器接受(作为MP4)?">

现在可以解决,因为它可能只需要一两个简单的设置即可更改,对吧?

解决方案:
将 MOV 转换为 MP4(输入 MOV 包含 H.264 和 AAC)的最快方法是:

  • (a) 只需将".mov">改名为".mp4"。
  • (b)将FTYP原子改为ISOMMP42
    (替换MOV中的当前文本qt)。
  • (c) 在任何MP4解析器(FFplay?在线MP4Box?在线MediaInfo?)中进行测试。
    确认播放器/解析器将编辑后的 MOV 视为 MP4 数据。

以下项目会影响 MOV 是否可以将 MP4 传递给媒体播放器(或网络浏览器):

(1)重命名:将文件扩展名从.mov更改为.mp4

  • 某些软件会拒绝可解码的 H.264/AAC,因为它位于不受支持的文件格式中。

(2) 图片格式:确保您的 H.264 使用的是 YUV 4:2:0(又名YUV420p)

  • 由于 H.264 使用 YUV420p,因此假设非 YUV420p 图片格式在 Web 浏览器上不起作用。非 YUV420p 必须在像素级别重新编码。

(3) 编解码器:在 MOV 中使用视频编解码器H.264 或H.265

  • MOV 是一个通用容器,不绑定到任何特定的编解码器。播放器/解码器端需要简单地理解包含的A/V编解码器数据,然后它就会播放。并非所有解码器都接受 MOV中的任何编解码器。
  • MP4
  • 是MPEG编解码器的容器(例如:MP3,AAC,H264和H265等)。
    换句话说,MP4 实际上是一个专门保存 MPEG a/v 数据的 MOV。

(4)FTYP原子:改为ISOMMP42(相似)

  • MOV 的FTYP为 :qt(有两个空格,因为它必须是四个字符代码 (fourCC)
  • MP4的FTYP为:avc1mp41mp42isomdash等(取决于MP4类型,例如:碎片)。

(5)宽原子:

  • MOV在顶层有wide原子(与FTYP,MOOV和MDAT一起,不是这些原子的子原子)
  • MP4没有wide原子(除了有时在 MDAT 内部作为子原子)

    注意:MP4 可以有自定义命名的原子(解码器跳过任何未知原子)。
    因此,拥有一个称为"宽"的不会阻止 MP4 本身的播放。它将被假定为自定义数据(例如:请参阅WhatsApp的MP4标头)

最新更新