2010-07-21 93 views
12

最近我一直在研究将MP4流式传输到浏览器的不同方法。 Flash Media Server是一个明显的选择(使用Cloudfront),我见过的大多数解决方案都使用RTMP协议。YouTube的高清视频流媒体服务器技术?

不过,我花了YouTube上的一些时间与萤火虫和Chrome调试搞清楚自己的数据流是如何工作的,我发现他们的一些视频和高质量率之间的一些有趣的差异。

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

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 

通过此URL返回的文件是一个包含视频的仅一部分的请求的偏移后完全有效的FLV。

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

那么,YouTube如何做到这一点?他们如何使用正确的标题和所需的视频片段即时生成FLV或MP4容器?我知道这可以通过使用FFMPEG来实现所需的起始点和qt-faststart脚本来将moov原子重新定位到流的前端来完成,但是似乎这样处理数百万YouTube观众。

想法?

在此先感谢!

脚注:目前我不允许包含超过1个链接,所以这里是视频A的URL:http://www.youtube .com/watch?v = hWjrMTWXH28“视频可用于最高480p”

+0

作为一个侧面说明.. Vimeo不使用任何类似的技术。当您在Vimeo上观看视频时,整个MP4会逐渐下载,并且无法向前滚动到已经缓冲的部分。 – bgentry 2010-07-22 03:16:21

回答

0

我不认为YouTube使用FFMPEG进行流媒体播放。容器格式,flv或mp4,很简单,并且不是计算密集型的。仅找到指定的begin时间戳最接近的关键帧并从中开始非常重要。

3

一个simular问题已经在这个论坛上有人问。 http://www.flashforum.de/forum/video/flv-ab-beliebiger-position-streamen-248483.html

解决方案有两种缴费:

  1. 使用流媒体服务器
  2. 使用文件封装用你选择的编程语言(例如PHP编写)

在这两种解决方案中,您需要修改所有视频fe使用flvmid将关键帧信息添加到flv视频。

在第二个解决方案中,您的php-script将收集您上面发布的请求并解析flv视频,直到它达到参数开始给定的位置。之后,它开始将视频内容推送给页面访问者。 阅读主题以获取更多信息和php代码示例。

原帖出自于德国,但你可以使用http://translate.google.com获得英语不好:)

你张贴的所有HTTP的响应包含以下行:

Server:gvs 

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

+0

gvs也可能意味着,grand vitesse系统,我认为他们正在为视频量身定制的内容网络上托管他们的视频,而内容网络可能由某种类型的gvs服务器组成。 – 2012-01-26 20:06:53

1

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

2

查看NGINX服务器,它有模块来做到这一点。作者完成了对FLV和MP4容器的所有解析和重写,以输出确切的所需偏移量。流媒体部分无需使用ffmpeg,因为这样做会过度。