YouTube的高清视频流媒体服务器技术?

时间:2010-07-21 18:11:48

标签: ffmpeg youtube video-streaming mp4

最近我一直在研究将MP4流式传输到浏览器的不同方法。 Flash Media Server在这里是一个显而易见的选择(使用Cloudfront),我见过的大多数解决方案都使用RTMP协议。

然而,我花了一些时间在YouTube上使用Firebug和Chrome调试器来确定他们的流媒体如何工作,我发现他们的一些视频和质量率之间存在一些有趣的差异。

我的两个示例视频是A和B。 A最高可达480p,B最高可达1080p。对于这两个视频,所有高达480p的速率都通过HTTP在具有H.264视频和AAC音频的FLV容器中提供。这里有趣的是,如果您还没有下载(缓存)整个视频,并且您尝试跳到视频的未缓存部分,则会发出一个新的请求,其中'begin'参数等于目标偏移量毫秒。来自480p的视频A的示例:

http://v11.lscache8.c.youtube.com/videoplayback?ip=0.0.0.0&sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Calgorithm%2Cburst%2Cfactor%2Coc%3AU0dWTldQVF9FSkNNNl9PSlhJ&fexp=904806%2C902906%2C903711&algorithm=throttle-factor&itag=35&ipbits=0&burst=40&sver=3&expire=1279756800&key=yt1&signature=D2D704D63C242CF187CAA5B5D5BAFB8DFACAC5FF.39180C01559C976717B651A7EB1D0C6249231EB7&factor=1.25&id=8568eb3135971f6f&begin=111863

Response Headers:
Cache-Control:public,max-age=23472
Connection:close
Content-Length:14320637
Content-Type:video/x-flv
Date:Wed, 21 Jul 2010 17:23:48 GMT
Expires:Wed, 21 Jul 2010 23:55:00 GMT
Last-Modified:Wed, 19 May 2010 12:31:41 GMT
Server:gvs 1.0
X-Content-Type-Options:nosniff

此网址返回的文件是完全有效的FLV,仅包含请求偏移后的视频部分。

我在视频B的更高分辨率版本上进行了同样的测试。在720p和1080p,YouTube将在MP4容器中返回视频,还有H.264视频和AAC音频。令我印象深刻的是,他们的服务器为MP4视频采用相同类型的偏移(通过'begin'参数)并返回一个有效的,可流动的MP4(文件前面的moov原子具有正确的偏移),其中仅包括视频的请求部分。

那么,YouTube如何做到这一点?他们如何使用正确的标题动态生成FLV或MP4容器,并且只生成所请求视频的所需片段?我知道这可以使用FFMPEG来寻找所需的起点和qt-faststart脚本来重新定位moov原子到流的前面,但看起来这样太慢了,无法按需处理数百万的YouTube观众。

想法?

提前致谢!

脚注:此时我不允许包含多个链接,因此这里是视频A的URL:http:// www.youtube .com / watch?v = hWjrMTWXH28“视频可用,最高480p”

4 个答案:

答案 0 :(得分:3)

在这个论坛上提出了一个类似的问题。 http://www.flashforum.de/forum/video/flv-ab-beliebiger-position-streamen-248483.html

有两种解决方案可供选择:

  1. 使用流媒体服务器
  2. 使用以您选择的编程语言编写的文件包装器(示例以php编写)
  3. 在这两个解决方案中,您需要修改所有视频f.e.使用flvmid将关键帧信息添加到flv-video。

    在第二个解决方案中,php-script会重新发送您在上面发布的请求并解析flv-video,直到它到达参数 begin 给出的位置。之后,它开始将视频内容推送到页面访问者。 阅读线程以获取更多信息和php-code-examples。

    原始帖子是用德语写的,但是你可以使用http://translate.google.com来获得糟糕的英语:)

    您发布的HTTP响应包含以下行:

    Server:gvs
    

    也许 gvs 就像“谷歌视频服务器”。我搜索了 gvs 但我找不到任何有价值的东西。

答案 1 :(得分:2)

查看NGINX服务器,它有完成此功能的模块。作者完成了对FLV和MP4容器的所有解析和重写,以输出确切的所需偏移量。在流媒体部分不需要ffmpeg,因为它会有点矫枉过正。

答案 2 :(得分:1)

Youtube使用lighttpd服务器进行流式传输。它实际上使用伪流而非流。这种机制允许观众寻找尚未下载的视频部分

答案 3 :(得分:0)

我认为YouTube不会使用FFMPEG进行流媒体播放。容器格式(flv或mp4)很简单,不需要计算量。重要的是只找到指定begin时间戳的最近的关键帧并从中开始。