RTSP сервер средствами ffserver & ffmpeg
RTSP расшифровывается как Real Time Streaming Protocol — потоковый протокол реального времени — по сути это протокол управления вещанием, он позволяет выполнять несколько команд, такие как «старт», «стоп», «переход на определённое время».
Тестировал:
•Одноплатный компьютер Orange PI PC
•Web-камера LOGITECH HD Webcam C270
Важно! Камера должна на выходе иметь изображение, которое не нужно перекодировать.
Если вы запустили потоковое видео средствами ffserver & ffmpeg , RTSP сервер запускается после редактирования /etc/ffserver.conf
nano /etc/ffserver.conf
Мой /etc/ffserver.conf
Port 8090
RTSPPort 8091
RTSPBindAddress 0.0.0.0
MaxClients 100
MaxBandwidth 20000
<Feed feed.ffm>
File /tmp/feed.ffm FileMaxSize 5M
Launch ffmpeg -f video4linux2 -i /dev/video0
</Feed>
# RTSP
<Stream live>
Feed feed.ffm
Format rtp
VideoFrameRate 10
VideoBufferSize 2000
VideoBitRate 800
VideoQMin 1
VideoQMax 31
VideoSize 640x480
Noaudio
</Stream>
Сохраняем изменения в файле (ctrl + o) и закрываем файл (ctrl + x).
запускаем ffserver:
опция -d отладочный режим
ffserver -d
rtsp://Ваш_IP:8091/live смотрим в VLC
Интересный, но мной не проверенный плеер:
HTML5 RTSP Player
поддерживает:
Browser support:
•Firefox v.42+
•Chrome v.23+
•OSX Safari v.8+
•MS Edge v.13+
•Opera v.15+
•Android browser v.5.0+
•IE Mobile v.11+
Мне был задан вопрос “Как автоматически запускать и останавливать RTSP сервер при заходе на веб страницу?”
RTSP сервер можно запускать и останавливать bash скриптом. Google в помощь.

Как запустить команду ffmpeg -s 640x480 -r 30 -f video4linux2 -i /dev/video0 http://localhost:8090/feed.ffm в фоновом режиме?
ffserver работает в фоновом режиме.
Если я эту команду просто запускаю, то поток с usb-камеры передается в сеть нормально. Но при этом занят терминал. И второй запуск другой программы с терминала не возможен.
Импеданс & не помогает
ffmpeg -s 640x480 -r 30 -f video4linux2 -i /dev/video0 http://localhost:8090/feed.ffm & – создает PID процесса. но потока нет!!!!
У Вас так же???
если ffserver работает в фоновом режиме, то ffmpeg запущен тоже в фоновом режиме строкой Launch ffmpeg -f video4linux2 -i /dev/video0 в конфиге ffserver-а.
так ffmpeg можно запустить в фоне:
ffmpeg -s 640x480 -r 30 -f video4linux2 -i /dev/video0 http://localhost:8090/feed.ffm 2>/dev/null >/dev/null&
ну или запустить другую программы, с другого терминала.
Эта комбинация ffmpeg -s 640x480 -r 30 -f video4linux2 -i /dev/video0 http://localhost:8090/feed.ffm 2>/dev/null >/dev/null&
не работает
Прекрасно работает вот такая команда
sh -c “ffmpeg -s 640x480 -r 30 -f video4linux2 -i /dev/video0 http://localhost:8090/feed.ffm > log 2>&1 &”
Осталось за малым Отловить запрос rtsp://ip:port/live отсылаемый на сервер и запустить нужную ffmpeg команду.
Но как отловить запрос? не могу понять. Дайте наводку, пожалуйста.
Apache + PHP, попробуйте сначала включать светодиоды, кнопками с веб страницы.
Не понял логики. Причем Apache? Запрос такого рода rtsp://192.168.1.231:8091/live. В ip-камере там тоже доп сервер стоит?
Когда посылается аналогичный запрос на ip-камеру, она включается и отдает поток. Запрос разрывается и камера выключается. Как это сделано? Здесь ведь аналогичная ситуация.
про включение и выключении камеры тут https://ru.wikipedia.org/wiki/RTSP ничего не сказано. Как это сделано в ip-камерах я не знаю.
логично, что слушаются необходимые порты и в случае активности на определенном порту скриптом включается вещание.
Apache + PHP позволят по сети запускать ffmpeg, что автоматом включит USB камеру.
“Важно! Камера должна на выходе иметь изображение, которое не нужно перекодировать.”
Это значит я не могу никак вещать h264, если камера на выходе имеет mjpeg? То есть до ffserver я не могу перекодировать поток используя ffmpeg?
Работать будет, но при перекодировке нагрузка на CPU весьма значительная.
Спасибо, обнадежили. Я долго пытался добавить в выше приведенный конфигурационный файл изменения, но все с ошибками. Можете привести конфигурационный файл или дать направление в каком пути двигаться, на данный момент ошибки требуют presets, а их для cedrus264 в ffmpeg нет
cedrus тут и не должен работать.
вещать h264 можно используя VideoCodec libx264
Скажите, поток отдаем rtsp в сеть, а пароль можно ставить на него? Как-то не хочется транслировать “открытым текстом”)
У FFServerа нет возможности ставить пароль, но можно разрешить доступ по IP
директивы #ACL ALLOW и #ACL DENY в конфиге.
https://www.ffmpeg.org/sample.html
ua3nbw спасибо за ответ!
Скажите, есть дебиан и камера usb с270. Можно средствами ffmpeg сделать rtsp трансляцию чтобы это выглядело как будто ip камера? У меня есть апельсинка и камера. Не хочится покупать ip камеру для видеонаблюдения. Сервер к сожалению понимает только ip камеры(
Это и выглядит как будто ip камера.
Адресс ip камеры rtsp://Ваш_IP:8091/live
Спасибо!!!
Настроил и подключился но задержка большая( От чего зависит такая большая задержка? Дело в кодеке? Можно как то без кодека или сжатия обойтись? Камера с270 ведь не кодированный сигнал отдает, на прямую или самым легким кодеком.
Извините за такие вопросы, но я первый раз этим занимаюсь(((
без сжатия не обойтись.
задержка будет всегда, для уменьшения задержки поиграйтесь с параметрами.
VideoFrameRate 10
VideoBufferSize 2000
VideoBitRate 800
VideoQMin 1
VideoQMax 31
задержка чуть более 1сек. у меня получалась при трансляции с сервера потокового вещания
Не подскажите что нужно дописать в конфиг чтобы еще звук с микрофона прикрутить?
# Noaudio
https://www.ffmpeg.org/sample.html
Bitrate for the audio stream. Codecs usually support only a few
different bitrates.
AudioBitRate 32
Number of audio channels: 1 = mono, 2 = stereo
AudioChannels 1
Sampling frequency for audio. When using low bitrates, you should
lower this frequency to 22050 or 11025. The supported frequencies
depend on the selected audio codec.
AudioSampleRate 44100