Решения HTML5 для потоковой передачи видео в реальном времени с низкой задержкой (‹2 с)?

Вскоре, когда Chrome отключит Flash по умолчанию, мне нужно будет заняться поиском решений для замены flash / rtmp html5.

В настоящее время с Flash + RTMP у меня есть прямой видеопоток с задержкой <1-2 секунды.

Я экспериментировал с MPEG-DASH, который кажется новым отраслевым стандартом для потоковой передачи, но этого не хватило, так как 5-секундная задержка была лучшим, что я мог выжать из него.

Для контекста я пытаюсь позволить пользователю управлять физическими объектами, которые они могут видеть в потоке, поэтому все, что превышает пару секунд задержки, приводит к разочарованию.

Существуют ли какие-либо другие методы, или действительно ли еще нет решений html5 с низкой задержкой для потоковой передачи в прямом эфире?


person Titan    schedule 26.05.2016    source источник
comment
хотя в итоге проект не сработал, мы остановились на wowza.com / продукты / возможности / webrtc-streaming-software   -  person Titan    schedule 09.10.2017
comment
Поскольку MPEG-Dash отстает на 5 секунд, Phoboslabs MPEG-1 составляет около 1 секунды, но дает теплые телефоны, а WebRTC - это проблема сервера, выполняющая это самостоятельно, это, вероятно, было разумным и экономящим время решением - спасибо, Титан.   -  person A.J.Bauer    schedule 10.10.2017
comment
MPEG-DASH + H.264 + длина группы изображений 0,5 с = задержка 2–3 с   -  person andreymal    schedule 13.03.2018
comment
Еще одно решение WebRTC для потоковой передачи с низкой задержкой - это мультимедийный сервер ant. Попробуйте antmedia.io   -  person faraway    schedule 06.02.2019


Ответы (1)


Технологии и требования

Единственная веб-технология, действительно ориентированная на низкую задержку, - это WebRTC. Он создан для видеоконференцсвязи. Кодеки настроены на меньшую задержку по сравнению с качеством. Битрейт обычно варьируется, предпочтение отдается стабильному соединению, а не качеству.

Однако вам не обязательно нужна эта оптимизация с низкой задержкой для всех ваших пользователей. На самом деле, насколько я могу судить по вашим требованиям, низкая задержка для всех отрицательно скажется на пользовательском опыте. В то время как вашим пользователям, контролирующим робота, определенно требуется видео с низкой задержкой, чтобы они могли разумно его контролировать, пользователи, которые не контролируют, не имеют этого требования и вместо этого могут выбрать надежное видео более высокого качества.

Как это настроить

Схема потоковой передачи роботов

Пользователи, контролирующие подключение роботов

Пользователи, управляющие роботом, загрузят страницу, которая использует некоторые компоненты WebRTC для подключения к камере и серверу управления. Для облегчения соединений WebRTC вам понадобится какой-то STUN-сервер. Чтобы обойти NAT и другие ограничения брандмауэра, вам может потребоваться сервер TURN. Оба они обычно встроены в фреймворки WebRTC на основе Node.js.

Сервер камеры / управления также должен будет подключаться через WebRTC. Честно говоря, самый простой способ сделать это - сделать ваше управляющее приложение в некотором роде веб-ориентированным. Поскольку вы уже используете Node.js, попробуйте NW.js или Электрон. Оба могут использовать возможности WebRTC, уже встроенные в WebKit, но при этом дают вам возможность делать с Node.js все, что захотите.

Контролируемые пользователи и сервер камеры / управления будут устанавливать одноранговое соединение через WebRTC (или сервер TURN, если требуется). Оттуда вы захотите открыть медиа-канал, а также канал данных. Сторона данных может использоваться для отправки команд роботу. Медиа-канал, конечно, будет использоваться для видеопотока с низкой задержкой, отправляемого обратно контролирующим пользователям.

Опять же, важно отметить, что видео, которое будет отправлено обратно, будет оптимизировано по задержке, а не по качеству. Такое соединение также обеспечивает быстрый ответ на ваши команды.

Видео для просмотра пользователей

Пользователи, которые просто просматривают поток и не управляют роботом, могут использовать обычные методы распространения видео. На самом деле для вас очень важно использовать существующие CDN и сервисы транскодирования, так как у вас будет 10-15 тысяч человек, которые будут смотреть поток. С таким количеством пользователей вы, вероятно, захотите, чтобы ваше видео было в паре разных кодеков и, конечно же, с целым набором битрейтов. Распространение с помощью DASH или HLS на данный момент проще всего использовать, и он освобождает Вы о требованиях к Flash.

Вероятно, вы также захотите отправить свой поток в службы социальных сетей. Это еще одна причина, по которой важно начинать с высококачественного HD-потока. Эти сервисы снова перекодируют ваше видео, снижая качество. Если вы сначала начнете с хорошего качества, в конечном итоге вы получите лучшее качество.

Метаданные (чат, контрольные сигналы и т. Д.)

Из ваших требований не ясно, какие метаданные вам нужны, но для небольших данных на основе сообщений вы можете использовать библиотеку веб-сокетов, такую ​​как Socket.IO. При масштабировании до нескольких экземпляров вы можете использовать pub / sub, например Redis, для распространения сообщений по всему серверы.

Синхронизация метаданных с видео немного зависит от того, что находится в этих метаданных, и, в частности, от требований к синхронизации. Вообще говоря, вы можете предположить, что будет разумная, но непредсказуемая задержка между исходным видео и клиентами. В конце концов, вы не можете контролировать, как долго они будут буферизоваться. Каждое устройство отличается, каждая переменная подключения. Вы можете предположить, что воспроизведение начнется с первого скачанного клиентом сегмента. Другими словами, если клиент начинает буферизацию видео и начинает его воспроизведение через 2 секунды, видео отстает на 2 секунды от момента, когда был сделан первый запрос.

Обнаружение фактического начала воспроизведения возможно на стороне клиента. Поскольку серверу известна метка времени, для которой видео было отправлено клиенту, он может сообщить клиенту свое смещение относительно начала воспроизведения видео. Поскольку вы, вероятно, будете использовать DASH или HLS, и вам все равно нужно использовать MCE с AJAX для получения данных, вы можете использовать заголовки ответа в ответе сегмента, чтобы указать метку времени начала сегмента. Затем клиент может синхронизировать себя. Позвольте мне разобрать это шаг за шагом:

  1. Клиент начинает получать сообщения метаданных от сервера приложений.
  2. Клиент запрашивает первый сегмент видео из CDN.
  3. Сервер CDN отвечает фрагментом видео. В заголовках ответов заголовок Date: может указывать точную дату / время начала сегмента.
  4. Клиент читает заголовок ответа Date: (скажем, 2016-06-01 20:31:00). Клиент продолжает буферизацию сегментов.
  5. Клиент начинает буферизацию / воспроизведение как обычно.
  6. Начнется воспроизведение. Клиент может обнаружить это изменение состояния на проигрывателе и знает, что 00:00:00 на видеопроигрывателе действительно 2016-06-01 20:31:00.
  7. Клиент отображает метаданные, синхронизированные с видео, отбрасывая все сообщения за предыдущее время и буферизуя их на будущее.

Это должно удовлетворить ваши потребности и дать вам возможность делать все, что вам нужно, с вашим видео в будущем.

Почему бы не [магическая-технология-здесь]?

  • Выбирая низкую задержку, вы теряете качество. Качество зависит от доступной полосы пропускания. Эффективность полосы пропускания достигается за счет возможности буферизовать и оптимизировать целые последовательности изображений при кодировании. Если вам нужно идеальное качество (без потерь для каждого изображения), вам потребуется тонна (гигабит на зрителя) полосы пропускания. Вот почему у нас есть эти кодеки с потерями для начала.
  • Поскольку на самом деле вам не нужна низкая задержка для большинства ваших зрителей, лучше оптимизировать для них качество.
  • Для 2 пользователей из 15 000, которым действительно нужна низкая задержка, мы можем оптимизировать для них. Они получат некачественное видео, но смогут активно управлять роботом, и это круто!
  • Всегда помните, что Интернет - враждебное место, где ничто не работает должным образом. Системные ресурсы и пропускная способность постоянно меняются. На самом деле, именно поэтому WebRTC автоматически приспосабливается (насколько это возможно) к изменяющимся условиям.
  • Не все соединения могут соответствовать требованиям к низкой задержке. Вот почему каждое соединение с низкой задержкой будет отключаться. В Интернете используется коммутация пакетов, а не коммутация каналов. Нет доступной реальной выделенной полосы пропускания.
  • Наличие большого буфера (пара секунд) позволяет клиентам пережить мгновенные потери соединений. Вот почему были созданы CD-плееры с буферами, препятствующими пропуску, и которые очень хорошо продавались. Если видео работает правильно, для этих 15 000 пользователей будет гораздо лучше. Им не нужно знать, что они отстают от основного потока на 5-10 секунд, но они точно будут знать, пропадает ли видео каждую вторую секунду.

В каждом подходе есть компромиссы. Я думаю, что то, что я здесь изложил, разделяет проблемы и дает вам наилучшие компромиссы в каждой области. Не стесняйтесь обращаться за разъяснениями или задавать дополнительные вопросы в комментариях.

person Brad    schedule 27.05.2016
comment
Извините, если это непонятно, пользователи от 1 до 10 тысяч могут смотреть одновременно - person Titan; 31.05.2016
comment
@GreenGiant У вас будет от 1 до 10 тысяч пользователей, одновременно управляющих физическими объектами в одном потоке? Звучит необоснованно. Не могли бы вы лучше описать, что конкретно вы пытаетесь сделать? Вы уверены, что у вас нет небольшого количества людей, контролирующих физические объекты (людей, которым нужна низкая задержка), и большого количества людей, наблюдающих (у которых может быть более высокая задержка)? Задержка в 1-2 секунды с потоком, который идет на 10 тысяч пользователей, практически невозможна. В основном вам нужно будет все настраивать, используя WebRTC на клиентах, но с источником на стороне сервера. - person Brad; 31.05.2016
comment
Только 1-2 будут иметь контроль одновременно, но их могут смотреть тысячи. Наличие переменной задержки в ленте для контролирующих и наблюдающих было бы неприемлемо, потому что сервер nodejs, ретранслирующий события в браузер клиента для отображения обратной связи, будет не синхронизирован. Вот пример того, что мы делали в прошлом со вспышкой (подробности прокрутите вниз) sidigital.co/sid < / а> - person Titan; 31.05.2016
comment
@GreenGiant Не могли бы вы рассказать, что это за отзыв? Если все, что вам нужно сделать, это синхронизировать внеполосные события с видео, вы можете просто отложить эти события. В зависимости от кодировки видео вы можете даже иметь возможность использовать метку времени, но я не экспериментировал, чтобы проверить совместимость браузера при извлечении метки времени из фактического видео. На стороне сервера вы должны иметь возможность определять, насколько далеко отстает клиент (в отношении данных, которые вы ему отправили), а на стороне клиента вы можете запускать отображаемые буферизованные события, как только видео буферизуется и начинает воспроизводиться. - person Brad; 01.06.2016
comment
Раньше с помощью манипулятора робота, когда человек, управляющий роботом, бросал мяч в отверстие, я создавал пузырек точек на DOM, который отображается для всех пользователей. Посетители, не контролирующие ситуацию, испытывают то же самое, что и человек, контролирующий ситуацию, за исключением того, что на самом деле у них нет контроля. Вот почему важно, чтобы все пользователи испытывали одинаковую / аналогичную низкую задержку, иначе изменения пользовательского интерфейса для оценки, обратной связи о событиях и т. Д. Не будут иметь смысла. Я не могу откладывать события для не игроков, потому что я не знаю их задержки, поэтому я стремлюсь к минимальной задержке для всех. Хорошо работал Flash + RTMP - person Titan; 02.06.2016
comment
Я искал janus.conf.meetecho.com/docs Януса, чтобы заменить текущая веб-камера ›nginx RTMP› установка флеш-клиентов. веб-камера ›сервер janus› клиенты webRTC В настоящее время я использую веб-сокеты для связи с роботом и т. д., поэтому мне не нужно никакого направления, это просто задержка видеопотока для всего, с чем я борюсь при настройке HTML5 :) - person Titan; 02.06.2016
comment
Я, кстати, не стремлюсь к сверхвысокому качеству видео, например, 720 × 576 без звука было бы приемлемым для того размера, в котором он мне нужен. - person Titan; 02.06.2016
comment
@GreenGiant Вы можете знать задержку. См. Раздел о калибровке времени, проверив заголовок ответа. У вас определенно не будет низкой задержки для всех пользователей. Конечно, с помощью WebRTC можно раздать всем желающим, но где вы разместите такую ​​инфраструктуру? Насколько мне известно, сегодня нет CDN, распространяющего через WebRTC, поэтому вам придется делать это самостоятельно. Готовы ли вы инвестировать в клетки в географически распределенных центрах обработки данных? Я подозреваю, что операционные и финансовые накладные расходы поглотят весь ваш проект. И для чего? Меньше пользователей. - person Brad; 02.06.2016
comment
@GreenGiant Помните, что при распространении видео обычными средствами у вас будет лучшая совместимость и большая гибкость, когда дело доходит до перекодирования вашего видео для различных настроек полосы пропускания и кодеков. - person Brad; 02.06.2016
comment
Я ценю это, но если вы отстаете хотя бы на 5 секунд, вы будете переведены в режим реального времени до того, как робот в вашей версии потока даже завершит воспроизведение (если у вас нет длительных периодов между ходами). В примере с роботом у нас была очередь из 700+ человек, ожидающих игры в один момент, поэтому мы не могли позволить себе иметь длительные периоды между ходами, чтобы учесть, что другие зрители так сильно отстают от реального времени. - person Titan; 03.06.2016
comment
@GreenGiant Я не знаю, сколько у вас ходов (и вы действительно должны указать полное описание вашей проблемы в вопросе, так как у других могут быть другие творческие решения), но даже если у вас в очереди 700 человек, вы только У вас есть пара на колоде, чтобы сыграть следующей. Переведите их в WebRTC-режим до их очереди. - person Brad; 03.06.2016
comment
@GreenGiant В другом комментарии вы упомянули, что IE 9-11 - это норма для ваших корпоративных сетей. Следует иметь в виду, что мой ответ позволяет вам поддерживать этих пользователей. Они могут смотреть видео на чем угодно, так как у вас есть полная гибкость, если вы разделите видео, чтобы получить поток с низкой задержкой по сравнению с обычным потоком. Чтобы сэкономить на расходах, я бы просто запустил ваш сервер WebRTC, а затем позволил YouTube обрабатывать поток только для просмотра. Переключите их с помощью JavaScript, когда они будут следующими, чтобы управлять роботом, чтобы они были готовы к работе, когда управление будет передано им. - person Brad; 08.06.2016