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