LINUX.ORG.RU

motion + только запись потока с камеры

 ,


1

1

как заставить motion захватывать видеопоток rtsp с камеры без анализа этого потока на движение и т.п.? получается, что motion анализирует указанный в netcam_url поток, и, при вкл параметре movie_passthrough, пишет поток из netcam_high_url. для постоянной записи, без ожидания движения, включил параметр emulate_motion. но motion всё равно продолжает анализировать поток netcam_url - выявляется увеличением нагрузки на cpu при увеличении качества потока netcam_url

Перемещено hobbit из general

Пытался как-то пользоваться этой штукой, оно оказалось странное и непонятное. Проще вышло написать небольшую прогу на базе библиотек ffmpeg которая будет делать всё что надо, захват входа и запись а mp4 файл там вроде даже в готовых примерах есть. Осталось только логику анализа кадров прицепить, она не сложная но если даже её лень - можешь прицепить ещё библиотеку какую-нить.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)

Насколько я понял вы хотите использовать поток с низким разрешением для детекции, а поток с высоким для записи? Где-то мне попадался материал на такую конфигурацию, надо поискать…

yaba ★★★
()
Ответ на: комментарий от yaba

нет, мне детекция совсем не нужна. мне нужен только захват потока и его сохранение в хранилище

man8531
() автор топика
Последнее исправление: man8531 (всего исправлений: 1)
Ответ на: комментарий от man8531

Ну раз так, тогда смысл использовать motion? Ведь все события у него пляшут от детекции. Если просто сохранять поток, тогда может обычной записи с помощью ffmpeg достаточно?

yaba ★★★
()
Ответ на: комментарий от man8531

ffmpeg нужно явно обвязывать чем-то

Нечего слишком обвязывать, работает подобное с несколькими камерами без проблем годами:

#!/bin/bash

while true; do

ffmpeg -loglevel quiet -rtsp_transport tcp -i rtsp://$1 -c copy -y -t 01:00:00 $(date +"%Y-%m-%d-%H-%M-%S").mp4

done;

можно еще добавить -timeout 5000000 чтобы сократить незапись при перебоях с камерами.

yandrey ★★
()
Ответ на: комментарий от man8531

верно, надо обвязывать. На две камеры сделал себе такое в компе, когда диск в аппаратном видеорегистраторе накрылся.

Там мало отслеживать процесс ffmpeg. Бывает он висит, но не пишет, надо следить растет ли размер директории.

Могу дать свои скрипты, они писались быстро, но работают уже не один месяц. Если адаптировать под большое кол-во камер, то надо сделать общие скрипты и конфиги отдельно, а не хрдкодед как оно сейчас

futurama ★★★★★
()
Последнее исправление: futurama (всего исправлений: 2)
Ответ на: комментарий от man8531

Нет. Это видимо другая версия, но похоже на это. Ого 2017г. Не последние в 2024 делал

-rwxr-xr-x 1      1377 Jan  7 19:01 check_cameras_jobs.sh
-rwxr-xr-x 1       503 Feb  4 15:18 cam1-store.sh
-rwxr-xr-x 1       503 Feb  4 15:18 cam2-store.sh

$ cat bin/check_cameras_jobs.sh

#!/bin/bash

PATH='/bin:/usr/bin:/sbin:/usr/sbin'

exec  > /home/user/camera.log
exec 2> /home/user/camera.err

[ `date '+%H'` -eq 0 ] && exit 0

CAMDIR='/camera'
CAM1='cam1'
CAM2='cam2'

#IF no space on disk
while ! /usr/lib/nagios/plugins/check_disk -w 15% -c 10% -p $CAMDIR >/dev/null 2>&1; do
    # clean up
    RMDIR1=`ls -1rt $CAMDIR/$CAM1 |head -1`
    RMDIR2=`ls -1rt $CAMDIR/$CAM2 |head -1`
    [ -n "$RMDIR1" ] && rm -rf $CAMDIR/$CAM1/$RMDIR1
    [ -n "$RMDIR2" ] && rm -rf $CAMDIR/$CAM2/$RMDIR2
    sleep 5
done

# если ffmpeg умер, то и screen тоже
# проверяем screen
screen -ls | grep -q "$CAM1" || screen -d -m -S $CAM1 ~/bin/${CAM1}-store.sh
screen -ls | grep -q "$CAM2" || screen -d -m -S $CAM2 ~/bin/${CAM2}-store.sh

sleep 5

# check if ffmpeg is working
# check that dir is grow

TODAYDIR=`date '+%Y-%m-%d'`
SIZE11=`du -sk $CAMDIR/$CAM1/$TODAYDIR | cut -f1`
SIZE21=`du -sk $CAMDIR/$CAM2/$TODAYDIR | cut -f1`
sleep 30
SIZE12=`du -sk $CAMDIR/$CAM1/$TODAYDIR | cut -f1`
SIZE22=`du -sk $CAMDIR/$CAM2/$TODAYDIR | cut -f1`
if [ "$SIZE11" -eq "$SIZE12" ]; then
    # kill ffmpeg 1
    pkill -9 -f '1&stream=0'
    pkill -9 -f 'cam1-store'
    sleep 1
    screen -d -m -S $CAM1 ~/bin/${CAM1}-store.sh
    screen -wipe
fi
if [ "$SIZE21" -eq "$SIZE22" ]; then
    # kill ffmpeg 2
    pkill -9 -f '3&stream=0'
    pkill -9 -f 'cam2-store'
    sleep 1
    screen -d -m -S $CAM2 ~/bin/${CAM2}-store.sh
    screen -wipe
fi

$ cat bin/cam1-store.sh

#!/bin/bash

REG_IP='192.168.1.5'
CAM_NUM=cam1
VDIR=/camera/${CAM_NUM}
RTSP1='rtsp://'$REG_IP'/user=admin&password=XXXXXXX&channel=1&stream=0'

SUFF='.mp4'

while :; do
    SEC=$((`date +%s -d 'today 23:59:59'` - `date +%s`))
    mkdir -p $VDIR/`date '+%Y-%m-%d'`
    cd $VDIR/`date '+%Y-%m-%d'`
    PREF1=`date +%s`

    ffmpeg -rtsp_transport tcp -nostdin -i "$RTSP1" -t $SEC -r 30 -vcodec copy -an -f segment -segment_time 60 -segment_format mp4  "${PREF1}-%d${SUFF}" 2>/dev/null

    sleep 3
done
$ du -sh /camera/cam*/*
36G	/camera/cam1/2024-04-06
34G	/camera/cam1/2024-04-07
26G	/camera/cam1/2024-04-08

23G	/camera/cam2/2024-04-06
23G	/camera/cam2/2024-04-07
18G	/camera/cam2/2024-04-08

$ df -h /camera/
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/vg1-cam  250G  158G   93G  63% /camera
futurama ★★★★★
()
Последнее исправление: futurama (всего исправлений: 5)
Ответ на: комментарий от futurama

Ого 2017г.

CAMNUM="$1"
if   [ "$CAMNUM" -eq 1 ]; then
       IP='10.0.0.202'
elif [ "$CAMNUM" -eq 2 ]; then
       IP='10.0.0.201'
elif [ "$CAMNUM" -eq 3 ]; then
       IP='10.0.0.203'
else
       echo "Unknown cam number: \"$CAMNUM\""
       exit 1
fi

в 2017г. массивы в bash ещё не изобрели?))

IP[1]='10.0.0.202'
IP[2]='10.0.0.201'
IP[3]='10.0.0.203'

if [ -z "${IP[$CAMNUM]}" ]; then
        echo "Unknown cam number: \"$CAMNUM\""
        exit 1
fi

yandrey ★★
()