Jump to content
Калькуляторы

ffmpeg и обработка rtsp ссылок

Всем добрый день.

Мне необходима помощь для выбора правильного технического решения в следующей задаче:

Есть некоторое количество ip камер, с этих камер я забираю rtsp поток с помощью ffmpeg и с его же помощью на этот поток накладываю время и дату.

Как мне далее реализовать возможность вещания обработанного потока в rtsp ? т.е. схема ip-camera ->ffmpeg -> обработанные rtsp потоки

Подозреваю, что необходимо отдать обработанный поток на некий rtsp сервер. Но не очень понимаю каким образом это сделать

 

 

Share this post


Link to post
Share on other sites

А сами камеры не могут наложить на картинку время и дату ??? Или "некрасиво" ?
 

Share this post


Link to post
Share on other sites

"Некий сервер rtsp" не нужен - им будет сам ffmpeg - http://ffmpeg.org/ffmpeg-protocols.html#rtsp  - раздел Examples. Для множественных потоков - смотреть ffserver

P.S. - и черкните (если не тайна) модельки камер - давно уже не встречал камер, которые дату и время сами не могут....

 

Edited by snapoid

Share this post


Link to post
Share on other sites

как раз читаю этот раздел документации. И там написано:

Send a stream in realtime to a RTSP server, for others to watch:

 

ffmpeg -re -i input -f rtsp -muxdelay 0.1 rtsp://server/live.sdp

 

Что выступает в качестве RTSP server из данного примера документации.

Выше в этом же разделе дана ссылка https://github.com/revmischa/rtsp-server на данное ПО. Прихожу к выводу, что надо отправлять поток на него

 

Касательно модели камер не скажу, они стоят на удаленной площадке и у меня есть только rtsp ссылки на потоки. Знаю только, что это чудесный продукт импортозамещения, что-то с сильно "порезанной" прошивкой

Share this post


Link to post
Share on other sites

ffmpeg — это комбайн, который может практически что угодно.

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

Я аналогичное делаю на VLC, он мне как-то больше понравился.

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

Share this post


Link to post
Share on other sites
Just now, alibek said:

аналогичное делаю на VLC, он мне как-то больше понравился.

расскажите подробнее, как это осуществляете ?

Share this post


Link to post
Share on other sites

Так напишите место rtsp://server/live.sdp   rtsp://localhost:порт/live.sdp или rtsp://IP_машины_на_которой_ffmpeg:порт/live.sdp

Но насколько помню - были с этим грабли, хотя в Streaming Guide (https://trac.ffmpeg.org/wiki/StreamingGuide) есть пример

ffmpeg -i input -f rtsp -rtsp_transport tcp rtsp://localhost:8888/live.sdp

Я в свое время делал "рестример" для Ubiquti AirCam-ов в Интеллект - он тогда не понимал RTSP-поток по TCP, а камеры не могли отдавать в UDP. Пришлось использовать ffserver
 

Share this post


Link to post
Share on other sites

Есть три скрипта.

Один скрипт генерирует VLM-файл, содержащий блоки с описанием каналов примерно такого вида:

#Обзорные камеры: CAM-910 - КОМСОМОЛЕЦ
new CAM-910 broadcast enabled loop
setup CAM-910 input rtsp://usr:pwd@cam-910.local/cam/realmonitor?channel=1&subtype=0
setup CAM-910 output #std{access=udp,dst=239.0.9.10:1234}
control CAM-910 play

В строку output можно добавить транскодирование и наложение текста, оно работает, но сильно увеличивает нагрузку на CPU.

Я делаю вывод в мультикаст, но можно использовать любой способ вывода.

 

Второй скрипт запускает VLC с нужными параметрами (запускаю в screen-сессии, это проще и удобнее, чем демонизировать VLC):

#!/bin/sh

CONF="/srv/iptv/cam.conf"
SCREEN="screen -S vlc-cam -d -m"
VLC="/usr/bin/cvlc"
MGMT="-I telnet --telnet-password iptv"
DEBUG="-v --logfile /srv/iptv/vlc-cam.log --log-verbose -1"

if [ ! -f $CONF ]; then
        echo "Config-file $CONF not exists"
        exit 0
fi

$SCREEN $VLC $DEBUG $MGMT --vlm-conf=$CONF --ttl 5

Ну а третий скрипт следит за VLC (иногда VLC зависает или вылетает) и при необходимости перезапускает его.

Share this post


Link to post
Share on other sites

Похожая схема, nginx+rtmp и ffmpeg, только без перекодирования. Забираю rtsp потоки с полсотни камер, конвертирую в hls и сливаю в стример с инфоканалом.

nginx держит буфер и реврайтит урлы в удобный вид.

для ffmpeg

ffmpeg -i rtsp://xxx:yyy@1.2.3.4:554/Streaming/Channels/101 -c copy -f flv -an rtmp://localhost:1935/hls/live

 

Share this post


Link to post
Share on other sites
1 minute ago, undro said:

Забираю rtsp потоки с полсотни камер, конвертирую в hls и сливаю в стример с инфоканалом.

Каким стримером вы пользуетесь и каким образом отдаете hls в стример 

Share this post


Link to post
Share on other sites

Стример забирает hls, накладывает лого+текстовые вставки и отдает mcast. Сам стример - проприетарная разработка. Могу конфигами nginx поделиться.

 

Share this post


Link to post
Share on other sites
1 minute ago, undro said:

Могу конфигами nginx поделиться.

Было бы не плохо

 

Какой стриммер можете порекомендовать ?

 

Share this post


Link to post
Share on other sites

Зависит от того, что вам нужно на выходе.

Для меня головной болью было реализовать бесшовное переключение картинки с камер в выходном mcast.

Сделать это на коленке с помощью vlc/ffmpeg так и не получилось.

Share this post


Link to post
Share on other sites

На выходе мне нужно получить обработанный rtsp поток, т.е поток, куда я добавил время и дату.

Достаточно возможности посмотреть его в vlc

Edited by alex.podolin

Share this post


Link to post
Share on other sites

 

Скрытый текст

ngnix.conf


user nginx;
worker_processes 4;
pid /run/nginx.pid;
error_log  /var/log/nginx/nginx_error.log debug; env PATH;

http {
     access_log /var/log/nginx/access.log;
     error_log /var/log/nginx/error.log;
     include       mime.types;
     default_type  application/octet-stream;
     sendfile        on;
     keepalive_timeout  65;
     proxy_cache_path  /var/www/cache/local levels=1:2 keys_zone=nginx_local_cache:1m inactive=30m max_size=512M;
     proxy_temp_path   /var/www/cache/local/tmp;

     server {
         listen 80;
         location /stat {
             rtmp_stat all;
             rtmp_stat_stylesheet stat.xsl;
         }
         location /stat.xsl {
             root /etc/nginx;
         }
         location / {
             rtmp_control all;
         }
         error_page   500 502 503 504  /50x.html;
         location = /50x.html {
             root   html;
         }
         include cams.conf;
     }
}

rtmp {
     access_log /var/log/nginx/rtmp_access.log;
     server {
         listen 1935;
         ping 30s;
         notify_method get;
         include rtmp.conf;
    }
}

 

cams.conf


types {
    application/vnd.apple.mpegurl m3u8;
    video/mp2t ts;
}

location ~* /hls/.*\.m3u8$ {
    rewrite "/(.*)/hls/(.*)$" /hls-$1/$2 break;
    root /tmp/;
    expires 10s;
    add_header Cache-Control public;
}

location ~* /hls/.*\.ts$ {
    rewrite "/(.*)/hls/(.*)$" /hls-$1/$2 break;
    root /tmp/;
    expires 3m;
    add_header Cache-Control public;
}

location @fallback_img {
    rewrite (.+) /fallback.jpg break;
    root /etc/nginx/;
}

rtmp.conf


chunk_size 4000;

application hls_XX {
    live on;
    sync 10ms;
    exec_static ffmpeg -i rtsp://xxx:yyy@1.2.3.4:554/Streaming/Channels/101 -c copy -f flv -an rtmp://localhost:1935/hls-1/live ;
    hls on;
    hls_path /tmp/hls-xx/;
    hls_fragment_naming timestamp; 
}

application hls_YY {
    live on;
    sync 10ms;
    exec_static ffmpeg -i rtsp://xxx:yyy@5.6.7.8:554/Streaming/Channels/101 -c copy -f flv -an rtmp://localhost:1935/hls-2/live ;
    hls on;
    hls_path /tmp/hls-yy/;
    hls_fragment_naming timestamp; 
}

 

 

Камеры добавляются в rtmp.conf по шаблону.

Потоки забираются в виде http://ip:80/xx/hls/live.m3u8

Share this post


Link to post
Share on other sites

Доброго дня. 

IP камеры (H.264/H.264+/H.265/H.265+), 30 шт. подключены к DVR, пишет локально и реплицирует архив на FTP (могу завернуть на любое облако), сейчас онлайн трансляцию снимаю через RTSP поток в связке с rtsp.me -- но это временный костыль, т.к. требуется удалённая работа с архивом. 

Подскажите пожалуйста, каким образом прикрутить на сайт (bootstrap/yii) плеер с выборкой по архиву, таймлайном? Смотрю на стек из FFmpeg, ffserver, motion

Share this post


Link to post
Share on other sites

Есть уже готовая сборка на докере nginx+rtmp+hls  https://github.com/alfg/docker-nginx-rtmp

Для проигрывания на сайте использовал hls.js. В URl передается переменная с названием камеры на поток m3u8, а далее через iframe можно подключать куда угодно.

Edited by morf

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now