В последнее время я исследовал различные методы потоковой передачи MP4 в браузер. Flash Media Server является очевидным выбором (с использованием Cloudfront), и большинство решений, которые я видел, используют протокол RTMP.
Однако я провел некоторое время на YouTube с отладчиком Firebug и Chrome, выясняя, как работает их потоковая передача, и обнаружил некоторые интересные различия между некоторыми из их видео и показателями качества.
Мои два примера видео: A и B . A доступно до 480p, а B доступно до 1080p. Для обоих видео все скорости до 480p подаются в контейнере FLV с видео H.264 и аудио AAC через HTTP. Здесь интересно то, что если вы еще не загрузили (не кэшировали) все видео и попытались перейти к некэшированной части видео, будет сделан новый запрос с параметром 'begin', равным целевому смещению в миллисекунды. Пример из видео 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, содержащим только часть видео после запрошенного смещения.
Я провел такой же тест на версиях Video B. с более высоким разрешением. При 720p и 1080p YouTube вернет видео в контейнере MP4, также с видео H.264 и аудио AAC. Что меня впечатляет, так это то, что их сервер принимает тот же тип смещения для видео MP4 (через параметр 'begin') и возвращает действительный, потоковый MP4 (атом moov в начале файла с правильными смещениями), который также включает только запрашиваемая часть видео.
Итак, как YouTube делает это? Как они генерируют контейнер FLV или MP4 на лету с правильными заголовками и только желаемым сегментом запрошенного видео? Я знаю, что это можно сделать с помощью FFMPEG для поиска желаемой начальной точки и сценария qt-faststart для перемещения атома moov в начало потока, но кажется, что это будет слишком медленно для обработки по требованию миллионов пользователей. Зрители YouTube.
Идеи
Заранее спасибо!
Сноска. Мне не разрешено включать более 1 ссылки на данный момент, поэтому вот URL видео A: http: // www.youtube .com / watch? V = hWjrMTWXH28 "Видео доступно до 480p"