提问者:小点点

YouTube的HTML5视频播放器是如何控制缓冲的?


我正在看一个youtube视频,我决定调查一下它的视频播放器的某些部分。我注意到,与我见过的大多数HTML5视频不同,YouTube的视频播放器并不提供普通的视频源,而是使用blob url作为源。

之前我测试过HTML5视频,发现服务器从一开始就开始流式传输整个视频,并在后台缓冲完整的其余视频。这意味着,如果你的视频是300兆,那么所有的300兆都将被下载。如果你向中间寻道,它会从寻道位置开始下载,一直到最后。

Youtube不是这样工作的(至少在chrome上是这样)。相反,它设法控制缓冲,因此它只在暂停时缓冲一定量。它也似乎只缓冲相关的片段,所以如果你跳过它将确保不缓冲不太可能被观看的片段。

在我试图研究这是如何工作的过程中,我注意到视频src标记的值为blob:http%3a//www.youtube.com/ee625eee-2802-49b2-a13f-eb374d551d54,它将我指向blob,然后将我指向类型化数组。使用这两个资源,我可以将mp4视频加载到blob中,并在HTML5视频标记中显示它。

然而,我现在想知道的是Youtube是如何处理这些碎片的。查看网络流量,它似乎向http://r6--sn-p5q7ynee.c.youtube.com/videoplayback发送请求,后者以1.1MB的块返回二进制视频数据。同样值得注意的是,大多数HTML5视频请求的正常请求在流式传输时似乎会收到206个响应代码,而YouTube的playvideo呼叫会收到200个响应代码。

我试图尝试只加载一个字节范围(通过设置rangehttp头),但不幸的是失败了(我假设是因为视频中没有随附的视频的元数据)。

在这一点上,我一直想弄清楚Youtube是如何做到这一点的。我想出了几个点子,但没有一个是我完全接受的:

1)Youtube会在每次/videoplayback呼叫中发送自带视频和音频块。这似乎是一个相当沉重的负担在上传方面,它似乎很难将这些缝合在一起,使它看起来像是一个无礼的视频。另外,从调用$('video').Duration$('video').CurrentTime来看,video标记似乎认为它是一个完整的视频,这使我相信video标记认为它是一个单独的视频文件。最后,vidoe src标记从不更改,这使我相信它是在处理单个blob,而不是在切换blob。

2)Youtube构建了一个空的blob,按照完整的视频数组预置大小,并在下载时用片段更新blob。然后,它将确保用户没有太接近上次下载的片段(以防止用户进入blob中未下载的部分)。我看到的问题是,我看不到任何通过javascript动态更新blob的方法(尽管可能我只是在谷歌搜索它时遇到了麻烦)

3)Youtube下载元数据,然后开始按顺序构建blob,在下载时附加视频片段。我发现这种方法的问题是,我不明白它将如何处理后缓冲区域中的搜索。

也许我只是错过了一个摆在我面前的显而易见的答案。有人有什么想法吗?

null

null


共1个答案

匿名用户

当你查看GoogleChrome的AppData时,在播放一段youtube视频的同时,你会看到它在分段文件中进行缓冲。上传到youtube上的视频是分段的,这就是为什么你不能在第一次点击酒吧时精确地指出一个时间框架,如果该时间框架不在当前片段的范围内。

段数取决于视频的长度以及开始和停止播放视频的时间。

当你链接到一个视频的时间帧时,它会简单地跳过在该时间帧之前的片段的缓冲。

不幸的是,我不太了解视频播放的编码,但我希望这为您指明了正确的方向。