Инструменты пользователя

Инструменты сайта


linux:rtsptoweb

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

linux:rtsptoweb [2022/04/20 09:32] – создано noviklinux:rtsptoweb [2022/04/20 18:40] (текущий) novik
Строка 1: Строка 1:
 +====== Самый простой (для знающих Linux) и дешевый способ разместить IP-камеру на сайте для небольшой аудитории ======
 +
 В чем главная проблема современных недорогих IP-камер? Вы не можете просто так добавить их на свой сайт! Они выдают видео совсем не в том формате, который понимают браузеры. Да, конечно, можно зайти напрямую на камеру (и часто только с IE), и у многих моделей есть «облако». Но проблема остается — я не могу просто так взять и поместить камеру на сайт, как например, простую картинку! В чем главная проблема современных недорогих IP-камер? Вы не можете просто так добавить их на свой сайт! Они выдают видео совсем не в том формате, который понимают браузеры. Да, конечно, можно зайти напрямую на камеру (и часто только с IE), и у многих моделей есть «облако». Но проблема остается — я не могу просто так взять и поместить камеру на сайт, как например, простую картинку!
  
Строка 9: Строка 11:
 А была мне нужна система онлайн-трансляций с такими свойствами: А была мне нужна система онлайн-трансляций с такими свойствами:
  
-не расходующая трафик в отсутствие зрителей; +  * не расходующая трафик в отсутствие зрителей; 
-среднедневное одновременное число зрителей — 1-3 человека; +  среднедневное одновременное число зрителей — 1-3 человека; 
-поддержка если не всех, то большинства популярных интернет-браузеров, в том числе мобильных; +  поддержка если не всех, то большинства популярных интернет-браузеров, в том числе мобильных; 
-максимально простая и понятная; +  максимально простая и понятная; 
-недорогая; +  недорогая; 
-желательно OpenSource. +  желательно OpenSource. 
-Имея богатый опыт работы с программой FFMpeg, весь этот функционал я решил попробовать реализовать самостоятельно. В конце концов, чем плох «велосипед», сделанный своими руками, если есть желание и время?+  Имея богатый опыт работы с программой FFMpeg, весь этот функционал я решил попробовать реализовать самостоятельно. В конце концов, чем плох «велосипед», сделанный своими руками, если есть желание и время?
  
 Но тут вы наверняка скажете «зачем на свой сайт, ведь есть iVideon?» и будете правы. Действительно, этот сервис практически не потребляет трафик, когда трансляция неактивна, очень простой в развертывании и вообще классный. А еще весьма дорогой, когда камер много и много зрителей, которым нужно передать права (никаких публичных ссылок). И забавно, зрителю тоже нужно оплачивать подключение каждой новой камеры сверх лимита (во всяком случае, год назад было именно так). Постепенно условия сервиса менялись, и вот теперь на бесплатном аккаунте можно разместить лишь одну камеру, и передать права лишь одному пользователю. И это уже не говоря о том, что в идеале потребуются камеры или видеорегистраторы с «iVideon-овской» прошивкой. Но тут вы наверняка скажете «зачем на свой сайт, ведь есть iVideon?» и будете правы. Действительно, этот сервис практически не потребляет трафик, когда трансляция неактивна, очень простой в развертывании и вообще классный. А еще весьма дорогой, когда камер много и много зрителей, которым нужно передать права (никаких публичных ссылок). И забавно, зрителю тоже нужно оплачивать подключение каждой новой камеры сверх лимита (во всяком случае, год назад было именно так). Постепенно условия сервиса менялись, и вот теперь на бесплатном аккаунте можно разместить лишь одну камеру, и передать права лишь одному пользователю. И это уже не говоря о том, что в идеале потребуются камеры или видеорегистраторы с «iVideon-овской» прошивкой.
Строка 21: Строка 23:
 По моим наблюдениям, оказалось, что такие браузеры, как Google Chrome и Mozilla Firefox, спокойно воспроизводят правильно подготовленный H.264-поток с камеры. Под «правильной подготовкой» имеется ввиду переупаковка потока программой FFMpeg со следующими параметрами: По моим наблюдениям, оказалось, что такие браузеры, как Google Chrome и Mozilla Firefox, спокойно воспроизводят правильно подготовленный H.264-поток с камеры. Под «правильной подготовкой» имеется ввиду переупаковка потока программой FFMpeg со следующими параметрами:
  
--movflags +frag_keyframe+separate_moof+omit_tfhd_offset+empty_moov+''-movflags +frag_keyframe+separate_moof+omit_tfhd_offset+empty_moov''
  
 Эти опции подсказывают FFMpeg, что на выходе мы хотим получить фрагментированный MP4-файл с наличием атома moov в начале файла и последовательность атомов moof с интервалом в один ключевой кадр. Эти опции подсказывают FFMpeg, что на выходе мы хотим получить фрагментированный MP4-файл с наличием атома moov в начале файла и последовательность атомов moof с интервалом в один ключевой кадр.
Строка 41: Строка 43:
 Хорошо, а причем тогда здесь PHP? А нужен он вот зачем. Посылаем необходимые заголовки: Хорошо, а причем тогда здесь PHP? А нужен он вот зачем. Посылаем необходимые заголовки:
  
-header(«Cache-Control: no-store, no-cache, must-revalidate, max-age=0»);+''header(«Cache-Control: no-store, no-cache, must-revalidate, max-age=0»);
  
 header(«Cache-Control: post-check=0, pre-check=0», false); header(«Cache-Control: post-check=0, pre-check=0», false);
Строка 51: Строка 53:
 header(‘Connection:keep-alive’); header(‘Connection:keep-alive’);
  
-header(‘Content-type: video/mp4’);+header(‘Content-type: video/mp4’);''
  
 И средствами PHP запускаем FFMpeg с перенаправлением потока напрямую в браузер зрителя: И средствами PHP запускаем FFMpeg с перенаправлением потока напрямую в браузер зрителя:
  
-passthru(«ffmpeg <параметры кодирования и ссылка на поток> -f mp4 pipe:»);+''passthru(«ffmpeg <параметры кодирования и ссылка на поток> -f mp4 pipe:»);''
  
 И все было бы отлично, но видео грузится несколько секунд, и не воспроизводится в Safari на Mac и iOS. То ли особенность реализации кодека там такая, то ли просто фрагментированные MP4 толком не поддерживаются, не знаю — перепробовал все варианты. Еще заметил, что видео начинает «моргать» в браузере Google Chrome, если не обождать пару секунд перед стартом воспроизведения. И все было бы отлично, но видео грузится несколько секунд, и не воспроизводится в Safari на Mac и iOS. То ли особенность реализации кодека там такая, то ли просто фрагментированные MP4 толком не поддерживаются, не знаю — перепробовал все варианты. Еще заметил, что видео начинает «моргать» в браузере Google Chrome, если не обождать пару секунд перед стартом воспроизведения.
Строка 63: Строка 65:
 И знаете, получилось весьма сносно. Я доработал первоначальный скрипт, и теперь он: И знаете, получилось весьма сносно. Я доработал первоначальный скрипт, и теперь он:
  
-умеет выводить видео и в других форматах: OGV и WEBM; +  * умеет выводить видео и в других форматах: OGV и WEBM; 
-умеет выдавать по запросу статичную картинку (снимок); +  умеет выдавать по запросу статичную картинку (снимок); 
-если видит, что вкладка с ранее открытым видео была в фоне при запуске браузера, то переадресует на указанный вами сайт (например, каталог камер), таким образом, экономя ресурсы; +  если видит, что вкладка с ранее открытым видео была в фоне при запуске браузера, то переадресует на указанный вами сайт (например, каталог камер), таким образом, экономя ресурсы; 
-не стопорится в Яндекс-браузере на Mac. Там кодек тоже как-то хитро работает — до второго ключевого кадра воспроизводит, а потом всё. Для него пришлось делать дополнительную проверку, вдруг видео «сломалось».  Safari поступает более мудро — просто не воспроизводит и всё.+  не стопорится в Яндекс-браузере на Mac. Там кодек тоже как-то хитро работает — до второго ключевого кадра воспроизводит, а потом всё. Для него пришлось делать дополнительную проверку, вдруг видео «сломалось».  Safari поступает более мудро — просто не воспроизводит и всё. 
 Кажется, получилось уже много текста, поэтому перейдем к самому интересному — как его установить на свой сервер. Установка скрипта проста: Кажется, получилось уже много текста, поэтому перейдем к самому интересному — как его установить на свой сервер. Установка скрипта проста:
  
-берете сервер, например, с Debian, ставите Apache+PHP7 и FFMpeg; +  * берете сервер, например, с Debian, ставите Apache+PHP7 и FFMpeg; 
-получаете SSL-сертификат для своего сервера; +  получаете SSL-сертификат для своего сервера; 
-копируете файлы моего скрипта в любую доступную по www папку; +  копируете файлы моего скрипта в любую доступную по www папку; 
-открываете camera.php и указываете свой ключ (придумываете; допустима латиница и цифры) в переменной $key, а в $redirectToIfBackground указываете, куда переадресовывать из фоновых вкладок; +  открываете camera.php и указываете свой ключ (придумываете; допустима латиница и цифры) в переменной $key, а в $redirectToIfBackground указываете, куда переадресовывать из фоновых вкладок; 
-размещаете на страницах своего сайта трансляций ссылки на camera.php в таком формате: camera.php?a=<rtsp-ссылка в base64>&b=<ключ>&c=<rtsp-ссылка на второй поток в base64>. При этом параметр «c» необязательный, но очень желательный. +  размещаете на страницах своего сайта трансляций ссылки на camera.php в таком формате: camera.php?a=<rtsp-ссылка в base64>&b=<ключ>&c=<rtsp-ссылка на второй поток в base64>. При этом параметр «c» необязательный, но очень желательный. 
-Риску предположить, что на шаге 4 у вас могут возникнуть затруднения. Но здесь нет ничего сложного, можно взять любой онлайн base64 конвертер, например http://base64.ru/, и сконвертировать вашу ссылку на RTSP-поток.+  Риску предположить, что на шаге 4 у вас могут возникнуть затруднения. Но здесь нет ничего сложного, можно взять любой онлайн base64 конвертер, например http://base64.ru/, и сконвертировать вашу ссылку на RTSP-поток.
  
 И вроде бы на этом всё, но без одной маленькой детали рассказ был бы неполным. Если вы планируете сайт с камерами сделать на MODX Revolution, то используйте приложенный плагин, упрощающий работу по размещению ссылок. Инструкция по установке плагинов есть в документации к этой CMS. После установки плагина откройте его на редактирование и в начале файла подставьте свои значения в $key и $camera_server_url (иными словами — замените текст, выделенный заглавными буквами, своим ключом и адресом сервера). И вроде бы на этом всё, но без одной маленькой детали рассказ был бы неполным. Если вы планируете сайт с камерами сделать на MODX Revolution, то используйте приложенный плагин, упрощающий работу по размещению ссылок. Инструкция по установке плагинов есть в документации к этой CMS. После установки плагина откройте его на редактирование и в начале файла подставьте свои значения в $key и $camera_server_url (иными словами — замените текст, выделенный заглавными буквами, своим ключом и адресом сервера).
Строка 80: Строка 83:
 После его установки, в тексте ваших страниц ссылки на камеры теперь можно указывать в таком виде: После его установки, в тексте ваших страниц ссылки на камеры теперь можно указывать в таком виде:
  
-{camera*НАЗВАНИЕ*RTSP-ССЫЛКА*RTSP-ССЫЛКА НА ВТОРОЙ ПОТОК}+''{camera*НАЗВАНИЕ*RTSP-ССЫЛКА*RTSP-ССЫЛКА НА ВТОРОЙ ПОТОК}''
  
 Название и RTSP-ссылки подставляете свои. Если нет ссылки на второй поток, то дублируете ссылку основного потока. Если есть затруднения с поиском RTSP-ссылок на вашу камеру, то можно использовать программу Onvif Device Manager. Она покажет ссылку снизу слева, по клику на «Живое видео». Название и RTSP-ссылки подставляете свои. Если нет ссылки на второй поток, то дублируете ссылку основного потока. Если есть затруднения с поиском RTSP-ссылок на вашу камеру, то можно использовать программу Onvif Device Manager. Она покажет ссылку снизу слева, по клику на «Живое видео».
linux/rtsptoweb.1650447132.txt.gz · Последнее изменение: 2022/04/20 09:32 — novik