最近我一直在研究將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