Технология YouTube для потокового видео HD? - PullRequest
13 голосов
/ 21 июля 2010

В последнее время я исследовал различные методы потоковой передачи 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"

Ответы [ 4 ]

3 голосов
/ 18 мая 2011

На этом форуме задавался симуляционный вопрос. http://www.flashforum.de/forum/video/flv-ab-beliebiger-position-streamen-248483.html

Доступны два решения:

  1. Использовать потоковый сервер
  2. Используйте файл-оболочку, написанную на выбранном вами языке программирования (пример написан на php)

В обоих решениях вам нужно изменить все ваши видео, например используя flvmid для добавления информации о ключевых кадрах в flv-video.

Во втором решении ваш php-скрипт получает отправленный вами запрос и анализирует flv-video до тех пор, пока он не достигнет позиции, заданной параметром begin . После этого он начинает подталкивать видео-контент к посетителю страницы. Читайте ветку, чтобы получить больше информации и примеры php-кода.

Оригинальная тема написана на немецком языке, но вы можете использовать http://translate.google.com, чтобы получить плохой английский:)

HTTP-ответ, который вы разместили, содержит следующую строку:

Server:gvs

Может быть gvs означает что-то вроде "Google Video Server". Я искал gvs , но не смог найти ничего ценного.

2 голосов
/ 31 июля 2013

Загляните на сервер NGINX, у него есть модули, чтобы сделать именно это.Автор выполнил весь анализ и переписывание контейнеров FLV и MP4 для вывода с точным требуемым смещением.Нет необходимости в ffmpeg в потоковой части, так как это было бы излишним.

1 голос
/ 06 декабря 2012

Youtube использует сервер lighttpd для потоковой передачи.На самом деле он использует псевдопоток, а не потоковую передачу.Этот механизм позволяет зрителям искать еще не загруженные части видео

0 голосов
/ 04 февраля 2011

Я не думаю, что YouTube использует FFMPEG для потоковой передачи. Формат контейнера, flv или mp4, достаточно прост и не требует большого объема вычислений. Важно только найти ближайший ключевой кадр к указанной begin отметке времени и начать с нее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...