HTML5视频被无故地下载了两次

9
我在想为什么有时候浏览器需要调用两次HTML5视频才能播放。这是正常的还是实际上是一个错误?底层发生了什么?
不确定我的问题是否特别容易理解,我从http://videojs.com首页截了一张屏幕截图,并打开了网络面板,以帮助我解释。请查看http://bit.ly/St4rRc。同样的情况也发生在这个著名的页面http://www.apple.com/html5/showcase/video/,由苹果制作,顺便提一下,它不使用任何javascript库来播放视频。我在Google Chrome / Windows上进行测试。
谢谢,
Iz

4
它明确显示“部分内容”,所以我认为它首先获取一些数据,例如视频编解码器,以检查是否支持或需要尝试另一个源/备用方案,然后如果成功,获取整个视频。显然这只是猜测。 - Fabrício Matté
2
没错,@FabrícioMatté是对的。Chrome会发出范围请求,并且有时会为文件的后续块发出范围请求。随后的请求通常从同一网络请求中加载,但会列在多个位置。您可以使用数据包嗅探器验证这一点。 - Brad
谢谢 @Brad,今天我学到了新的东西。=] - Fabrício Matté
3个回答

8
许多媒体文件在结尾处都有一些结构,用于定义原子的位置或其他关于媒体的元数据,例如持续时间、起始字节偏移量、编解码器、比特率等。像 mp4 容器这样的文件类型可以“提示”将此数据移动到文件开头。历史上,这些信息被连接到媒体文件的末尾,因为许多值(如持续时间)直到视频完成编码才会知道。

3
下一个ffmpeg命令可以帮助你解决这个问题:
ffmpeg -i initial-file.mp4 -c copy -movflags +faststart corrected-file.mp4

来自文档:

-movflags faststart
运行第二遍,将索引(moov原子)移动到文件开头。这个操作可能需要一段时间,并且在各种情况下,如分段输出时不起作用,因此默认情况下未启用。


不知道这是什么魔法,但它完美地起作用了。 - wxactly

2
第一个调用是预加载。这使得视频在用户点击播放按钮时准备好播放,假设它不是自动播放,否则尽可能早地播放。下载元数据和前几秒钟的视频后,它将被中止。
第二个调用实际上获取了整个文件。浏览器会尝试请求仅未被请求的部分,但需要配置服务器才能允许这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接