2010-07-21 98 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,因爲這樣做會過度。