Потоковая передача через RTSP или RTP в HTML5

Я создаю веб-приложение, которое должно воспроизводить поток RTSP / RTP с сервера http://lscube.org/projects/feng.

Поддерживает ли тег HTML5 video / audio rtsp или rtp? Если нет, какое было бы самое простое решение? Возможно, перейдите к плагину VLC или чему-то в этом роде.


person Elben Shira    schedule 14.11.2009    source источник
comment
тег видео не работает только с RTSP. И RTSP изначально не реализован ни в одном из известных мне браузеров. Вам либо понадобится плагин, как вы уже догадались. Или используйте webRTC, который изначально поддерживается Chrome и Firefox, и вы сможете использовать тег видео с некоторой логикой webRTC. Если вы пытаетесь выполнить потоковую передачу из источника, такого как IP-камера, используйте потоковую службу, такую ​​как Wowza (или напишите свой собственный), для перекодирования из RTSP в webRTC. Это мой вам совет.   -  person Michael P    schedule 05.06.2015
comment
Я думаю, вы можете получить поток с html5, но вы не можете где-то транслировать.   -  person Salih Karagoz    schedule 23.04.2017
comment
Отличный вопрос, спасибо. Я считаю, что мы не поддерживаем RTSP, только RTMP через videojs-flash. - это ответ главного разработчика медиаплеера Video.js. Я исследую тему и не могу найти для нее хорошего решения.   -  person zhibirc    schedule 26.07.2018
comment
Можно использовать WebRTC RTCPeerConnection для воспроизведения RTSP (или, точнее, потока RTP, который устанавливает RTSP) в элементе видео HTML. Ранее на webrtc.live555.com была демоверсия. Уловка будет заключаться в том, чтобы найти RTSP-сервер, который добавил необходимые механизмы WebRTC DTLS и SRTP.   -  person sipsorcery    schedule 11.06.2020
comment
вау, столько хорошего содержания в удаленных ответах! ????   -  person Barney Szabolcs    schedule 24.05.2021


Ответы (9)


Технически «Да»

(но не совсем ...)

Тег <video> HTML 5 не зависит от протокола - ему все равно. Вы помещаете протокол в атрибут src как часть URL-адреса. Например.:

<video src="rtp://myserver.com/path/to/stream">
    Your browser does not support the VIDEO tag and/or RTP streams.
</video>

или, может быть

<video src="http://myserver.com:1935/path/to/stream/myPlaylist.m3u8">
    Your browser does not support the VIDEO tag and/or RTP streams.
</video>

Тем не менее, реализация тега <video> зависит от браузера. Поскольку HTML 5 только начинается, я ожидаю частого изменения поддержки (или отсутствия поддержки).

Из спецификации HTML5 W3C (элемент видео):

Пользовательские агенты могут поддерживать любые видео и аудио кодеки и форматы контейнеров.

person Stu Thompson    schedule 15.11.2009
comment
ОБНОВЛЕНИЕ: попробовал первый метод в Chrome и получил GET rtp://239.255.0.1:6970 net::ERR_UNKNOWN_URL_SCHEME. Кажется, что для video элементов разрешены только схемы HTTP [S]. - person Yan Foto; 21.07.2015
comment
Конечно, вы никогда не стали бы передавать видео через HTTP и использовать только такой протокол, как RTP? По TCP это было бы ужасно медленно .. - person markmnl; 02.09.2015
comment
@markmnl Это сарказм? (Я не могу сказать ... Я в этом отношении легковерен.) HTTP-транспорт является доминирующим методом передачи видео через Интернет в течение нескольких лет. Youtube, Netflix и др. Дело не в эффективности, а в простоте, проходимости брандмауэра, удобстве использования кеш-сервера и т. Д. - person Stu Thompson; 02.09.2015
comment
@markmnl Ради потомства стоит упомянуть, что Netflix использовал стрим с MS Silverlight, но некоторое время назад отказался от него. Как человек, который занимается стримингом с 2001 года, я сначала был шокирован, увидев, что HTTP захватил власть. Теперь я пью Kool Aid. В корпоративных сетях, где важна эффективность, специализированные протоколы RTP являются нормой, особенно когда они могут предоставлять такие функции, как многоадресная рассылка. - person Stu Thompson; 03.09.2015

Я думаю, что на суть вопроса не было дано точного ответа. Нет, на данный момент вы не можете использовать видеотег для воспроизведения потоков RTSP. Другой ответ относительно ссылки на «никогда» парня из Chromium немного вводит в заблуждение, поскольку связанный поток / ответ напрямую не относится к Chrome, воспроизводящему rtsp через тег видео. Прочтите всю связанную ветку, особенно комментарии в самом низу и ссылки на другие темы.

Настоящий ответ таков: нет, вы не можете просто поместить тег видео на страницу html 5 и воспроизвести rtsp. Вам нужно использовать какую-то библиотеку Javascript (если вы не хотите играть во флэш и Silverlight плееры) для воспроизведения потокового видео. {IMHO} Учитывая скорость обсуждения и реализации видео html 5, различные поставщики проприетарных видеостандартов не заинтересованы в продвижении вперед, поэтому не рассчитывайте на обещанную простоту использования тега видео, если только производители браузеров берусь на себя как-то решить проблему ... опять же вряд ли. {/ IMHO}

person GolfARama    schedule 11.07.2012
comment
Хороший комментарий Гольф. Я также хотел безуспешно делать то, что делает Эльбен. - person will824; 25.01.2013

Это старый запрос, но мне пришлось сделать это недавно, и я добился чего-то работающего, поэтому (помимо ответа, подобного моему, я бы сэкономил некоторое время): в основном используйте ffmpeg для изменения контейнера на HLS, большую часть потока IPCams h264 и некоторые основной тип PCM, поэтому используйте что-то вроде этого:

ffmpeg -v info -i rtsp://ip:port/h264.sdp -c:v copy -c:a copy -bufsize 1835k -pix_fmt yuv420p -flags -global_header -hls_time 10 -hls_list_size 6 -hls_wrap 10 -start_number 1 /var/www/html/test.m3u8

Затем используйте video.js с HLS plugin Это будет хорошо воспроизводить прямой эфир. Также по второй ссылке есть пример jsfiddle).

Примечание: хотя это не встроенная поддержка, она не требует дополнительных действий в пользовательском интерфейсе.

person Pawel K    schedule 26.09.2016
comment
Это сработало для меня, Videojs, который я уже использовал, и этот плагин HLS заставляет живой канал с файлом m3u8 работать для большинства URL-адресов, если не для всех. - person Dheeraj Thedijje; 30.09.2016
comment
Рад, что это помогло, хотя есть немного больше задержки, но, как кажется, это мало что поможет. - person Pawel K; 30.09.2016
comment
Я пробовал ваш образец, но ffmpeg говорит, что должен быть указан хотя бы выходной файл onde. Любые идеи? - person Cesar; 29.11.2016
comment
Попробуйте @Cesar: ffmpeg -v info -rtsp_transport tcp -i rtsp://host:port/[sdp] -c:v copy -c:a copy -maxrate 400k -bufsize 1835k -pix_fmt yuv420p -flags -global_header -hls_time 10 -hls_list_size 6 -hls_wrap 10 -start_number 1 /var/www/html/test.m3u8 - person Pawel K; 30.11.2016
comment
Кстати. Я тестировал это с помощью ffmpeg 3.1.3 - person Pawel K; 30.11.2016
comment
Кажется, это сработало. Кстати, что вы используете на стороне сервера для обслуживания этого .m3u8? Его постоянно кормят, кажется, я не могу просто нормальный http на это. - person Cesar; 30.11.2016
comment
Ну, я использовал проигрыватель, подобный тому, который я упомянул в ответе, то есть плагин video.js + HLS, ссылающийся на локальный файл на сервере, поэтому я не открывал файл m3u8 в Интернете. Я использовал Apache2.2 в качестве веб-сервера. - person Pawel K; 02.12.2016
comment
Я забыл добавить, что он будет подаваться постоянно, потому что это прямой поток, но вы можете изменить его, чтобы он не перезаписывал файлы циклически, но я не помню этого сейчас, это точно в параметрах -hls_xxxxx, я думаю, если вы опускаете -hls_wrap и -hls_time, это будет продолжаться бесконечно, но я не уверен, что я мало исследовал в этом направлении - person Pawel K; 02.12.2016
comment
Хорошее решение и не такое большое количество ЦП по сравнению с другими, которые я исследовал. Спасибо. - person Deus777; 31.03.2017
comment
может кто-нибудь мне помочь, где разместить это 'ffmpeg -v info -i rtsp: // ip: port / h264.sdp -c: v copy -c: a copy -bufsize 1835k -pix_fmt yuv420p -flags -global_header -hls_time 10 -hls_list_size 6 -hls_wrap 10 -начальный_номер 1 /var/www/html/test.m3u8 ' - person Arter; 30.01.2018
comment
@Arter В основном вам нужно запустить это на своем сервере (из командной строки), например, Linux или что-то удаленное. У вас должен быть доступ к папке / var / www / html / (в этом примере) с точки зрения текущего пользователя. Вы также можете попробовать сделать это в Windows с помощью стека LAMP или Uniform Server (гораздо более компактное решение) - person Pawel K; 02.02.2018
comment
Это сработало для меня. 'hls_wrap' устарел в последней версии ffmpeg. Я использовал эту командную строку для всех, кому интересно: ffmpeg.exe -fflags nobuffer -rtsp_transport tcp -i rtsp://[SOURCE] -flags +cgop -g 30 -hls_flags delete_segments [DESTINATION] - person DanTheMan; 14.08.2018
comment
Не могли бы вы уточнить прилагательное native? Что считается native? Спасибо! - person Minh Nghĩa; 03.09.2019
comment
Я имел в виду, что HTML5 не поддерживает сам протокол из коробки, но требуется перевод (вроде). Встроенная поддержка будет означать, что либо код расширен для понимания протокола, либо для этого написан плагин (в случае браузера с html5 другая история, но, в конце концов, поддержка находится в браузере), т.е. забота о переупаковке RTP и контроле сеанса с RTCP и самим RTSP. - person Pawel K; 10.09.2019

В HTML5 есть три протокола / технологии потоковой передачи:

Прямая трансляция, низкая задержка - WebRTC - Websocket

VOD и прямая трансляция, высокая задержка - HLS

1. WebRTC

Фактически WebRTC - это SRTP (безопасный протокол RTP). Таким образом, можно сказать, что видеотег поддерживает RTP (SRTP) косвенно через WebRTC.

Поэтому, чтобы получить поток RTP в вашем Chrome, Firefox или другом браузере HTML5, вам понадобится сервер WebRTC, который будет доставлять поток SRTP в браузер.

2. Websocket

Он основан на TCP, но с меньшей задержкой, чем HLS. Снова вам нужен сервер Websocket.

3. HLS

Самый популярный протокол потоковой передачи с высокой задержкой для VOD (предварительно записанное видео).

person ankitr    schedule 18.09.2015
comment
Как воспроизводить поток аудио и видео в реальном времени с помощью веб-сокета? Единственный способ для видео - использовать Broadway.js, и это довольно хакерский вариант с использованием потоков h264 nal. - person mark gamache; 22.03.2017
comment
HLS означает HTTP Live Streaming. Интересно, почему HLS широко используется для VOD, но не для LOD? - person shintaroid; 11.05.2017
comment
Вы не можете воспроизводить видео в веб-браузере из WebSocket. По крайней мере, не из коробки. - person Michael IV; 04.10.2017
comment
-1, для веб-сокета ... но не по всем остальным причинам, о которых говорят. Вы абсолютно можете воспроизводить видео, получая данные через веб-сокет. Это тривиально с расширениями MediaSource. Вы не должны этого делать, потому что вы можете просто использовать HTTP Progressive! - person Brad; 22.08.2018

Chrome никогда не будет поддерживать потоковую передачу RTSP.

По крайней мере, здесь разработчик Chromium:

мы никогда не собираемся добавлять поддержку для этого

person janesconference    schedule 14.10.2011
comment
Ну, почти. Chrome уже поддерживает потоковую передачу RTSP, поэтому он никогда не собирается добавлять эту поддержку;) - person Stefan Steiger; 14.08.2014
comment
Нет, вы не можете заставить его работать в Chrome, он не работает при попытке с ссылками на YouTube rtsp. - person IdidntKnewIt; 27.12.2014

С помощью VLC я могу перекодировать живой поток RTSP (mpeg4) в поток HTTP в формате OGG (Vorbis / Theora). Качество плохое, но видео работает в Chrome 9. Я также тестировал транкодирование в WEBM (VP8), но, похоже, он не работает (у VLC есть опция, но я не знаю, действительно ли она реализована на данный момент. .)

Первый, у кого есть документ по этому поводу, должен известить нас об этом;)

person molokoloco    schedule 04.02.2011
comment
"C:\Program Files\VideoLAN\VLC\vlc.exe" -I dummy screen:// :screen-fps=16.000000 :screen-caching=100 :sout=#transcode{vcodec=theo,vb=800,scale=1,width=600,height=480,acodec=mp3}:http{mux=ogg,dst=127.0.0.1:8080/desktop.ogg} :no-sout-rtp-sap :no-sout-standard-sap :ttl=1 :sout-keep - это команда VLC, которая передает ваш ввод (например, устройство захвата экрана) в заданный выходной поток (например, 127.0 .0.1: 8080 / desktop.ogg) - person Zsolt; 12.02.2013
comment
а затем вы можете встроить это в тег видео: <video id="video" src="http://localhost:8080/desktop.ogg" autoplay="autoplay">. - person Zsolt; 12.02.2013
comment
Но производительность, к сожалению, довольно низкая, и было бы здорово, если бы это можно было сделать с контейнером MP4. AFAIK больше браузеров поддерживают MP4, чем OGG. - person Zsolt; 12.02.2013
comment
У меня это тоже сработало. Я установил VLC для потоковой передачи аудио и видео по протоколу HTTP по адресу my_ip:port, а затем использовал тег HTML5 <video>, например: <video width="640"><source src="http://my_ip:port/test" type="video/ogg">HTML5 not supported</video>. - person patryk.beza; 06.07.2013

Chrome не поддерживает потоковую передачу RTSP. Важный проект по проверке именно WebRTC.

«WebRTC - это бесплатный открытый проект, который предоставляет браузерам и мобильным приложениям возможности связи в реальном времени (RTC) через простые API»

Поддерживаемые браузеры:

Chrome, Firefox и Opera.

Поддерживаемые мобильные платформы:

Android и IOS

http://www.webrtc.org/

person vrbsm    schedule 11.09.2015

Мои наблюдения относительно видеотега HTML 5 и потоков rtsp (rtp) заключаются в том, что он работает только с konqueror (KDE 4.4.1, Phonon-backend установлен на GStreamer). У меня было только видео (без звука) с потоком H.264 / AAC RTSP (RTP).

Потоки из http://media.esof2010.org/ не работали с konqueror (KDE 4.4. 1, Phonon-backend установлен на GStreamer).

person Renegah    schedule 11.03.2010

Делаем вывод на данный момент.

Я бессмысленно пытаюсь обойти это, поскольку rtsp не работает OOB. Сейчас это невозможно без менеджера, управляющего потоковой передачей.

В настоящее время я работаю над решением android + html (гибридным), чтобы управлять этим очень злым способом. Поскольку предполагается, что он будет воспроизводиться напрямую с камеры на Android без промежуточных серверов, мы придумали решение, включающее тег холста, чтобы связать не-веб-просмотр с веб-просмотром.

person Himadhar H    schedule 21.04.2021