我正在尝试在网络视频(使用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)
- 铬
- macOS 13.2.1
source
标记中的多个type
声明。
现场示例:https://codesandbox.io/s/happy-platform-nwsg4u?file=/index.html
结果和结论
浏览器 | video/quicktime | video/mp4 | video/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.json
、fulldata-json/data-1.0.json
和fulldata-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原子改为
ISOM
或MP42
。
(替换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中的任何编解码器。
- 是MPEG编解码器的容器(例如:MP3,AAC,H264和H265等)。
换句话说,MP4 实际上是一个专门保存 MPEG a/v 数据的 MOV。
(4)FTYP原子:改为ISOM
或MP42
(相似)
- MOV 的FTYP为 :
qt
(有两个空格,因为它必须是四个字符代码 (fourCC) - MP4的FTYP为:
avc1
,mp41
,mp42
,isom
,dash
等(取决于MP4类型,例如:碎片)。
(5)宽原子:
- MOV在顶层有
wide
原子(与FTYP,MOOV和MDAT一起,不是这些原子的子原子) - MP4没有
wide
原子(除了有时在 MDAT 内部作为子原子)
注意:MP4 可以有自定义命名的原子(解码器跳过任何未知原子)。
因此,拥有一个称为"宽"的不会阻止 MP4 本身的播放。它将被假定为自定义数据(例如:请参阅WhatsApp的MP4标头)