В последнее время я изучал различные методы потоковой передачи 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, содержащим только часть видео после запрошенного смещения.
Я сделал такой же тест в версиях с высоким разрешением видео B. На 720p и 1080p YouTube вернет видео в контейнер MP4, а также видео H.264 и аудио AAC. Для меня впечатляет то, что их сервер принимает одинаковый тип смещения для видео MP4 (через параметр "begin" ) и возвращает допустимый, плавный MP4 (атом moov в передней части файла с правильными смещениями), который также включает только запрошенная часть видео.
Итак, как YouTube это делает? Как они генерируют FLV или MP4-контейнер "на лету" с правильными заголовками и только желаемый сегмент запрошенного видео? Я знаю, что это может быть достигнуто с помощью FFMPEG для поиска нужной начальной точки и qt-faststart script для перемещения атома moov в фронт потока, но похоже, что это будет слишком медленным, чтобы обрабатывать по требованию миллионы зрителей YouTube.
Идеи?
Спасибо заранее!
Сноска: мне не разрешено включать более 1 ссылки на данный момент, так что вот видео URL: http://www.youtube.com/watch? v = hWjrMTWXH28 "Видео доступно до 480p"