Запись видео с камер: различия между версиями

Материал из IT в школе
Перейти к навигацииПерейти к поиску
Строка 49: Строка 49:
fi
fi


#запуск сервера rtdp на порту 8554
#запуск сервера rtsp на порту 8554


nohup ffmpeg -thread_queue_size 1024 -f v4l2 -input_format mjpeg  -i ${V4L}  -f pulse -ac 1 -thread_queue_size 1024 -i ${PULSE}  -acodec aac -vcodec libx264 -preset ultrafast -crf 22 -s hd720 -vf format=yuv420p -profile:v main -threads 0 -f mpegts - | vlc -vv -I dummy -  --sout='#rtp{sdp=rtsp://:8554/} --sout-all --sout-keep' >/dev/null 2>/dev/null &
nohup ffmpeg -thread_queue_size 1024 -f v4l2 -framerate 15 -input_format mjpeg  -i ${V4L}  -f pulse -ac 1 -thread_queue_size 1024 -i ${PULSE}  -acodec aac -vcodec libx264 -preset ultrafast -crf 22 -s hd720 -vf format=yuv420p -profile:v main -threads 0 -f mpegts - 2>/dev/null | vlc -I dummy -  --sout='#rtp{sdp=rtsp://:8554/} --sout-all --sout-keep' >/dev/null 2>/dev/null &
#
#vlc -I dummy - --sout='#std{access=http,mux=ts,dst=:8080}'


#ссылка для просмотра или записи rtsp://<you ip>:8554/ (последний символ важен!)
# Для того чтобы подключаться по http, часть команды после vlc следует заменить на следующую (у меня работает плохо)
# vlc -I dummy - --sout='#std{access=http{mime=video/mp4},mux=ts,dst=:8080}'
# большая часть взята отсюда https://stackoverflow.com/questions/26999595/what-steps-are-needed-to-stream-rtsp-from-ffmpeg





Версия 11:09, 21 декабря 2022

IP камеры

Для записи с IP камер во время диагностики МЦКО удобно использовать например моноблок учителя. Чтобы ничего не забыть прописываем в crontab (файл /var/spool/cron/teacher) расписание диагностик на день, и комп сам их включит и выключит запись через заданное время, а файлы заботливо сложит в указанный Вами каталог, который можно и расшарить.

Также можно писать видео с аналогового видеорегистратора DAHUA (RVI), а также другие с программой стандарта ONVIF по сети. Регистратор при этом используется как конвертор сигнала, наличие в нем HDD по сути необязательно.

URL в случае DAHUA/RVI (возможно не всех моделей - сверяйте с данными производителя) имеет вид rtsp://admin:<pass>@<ip>:554/cam/realmonitor?channel=4&subtype=0, subtype - поток высокого (0) или низкого (1) разрешения

URL в случае IP регистратора HIKVISION вид rtsp://<user>:<pass>@<ip>:554/ISAPI/Streaming/Channels/102 (Здесь 1- номер канала 2- низкое разрешение) высокое разрешение (1 вместо 2) записывается в H265

Благодаря отсутствию перекодировки, загрузка процессора минимальна, однако формат файла определённый. Для настроенных на ЕЦХД камер в кабинетах информатики это кодек H264. Файл проигрывается проигрывателем VLC

#!/bin/bash

#url камеры
CAMURL="rtsp://subaccount:Subxxxxx@10.xx.xx.xx"
#укажите номер кабинета
CAB="302" 
#формат даты можно установить по вкусу прочитав man date
DATE=`date +%F-%H-%M`
#файл куда писать. например в самба шару
FILE="/home/share/${DATE}-${CAB}-%02d.mp4"
#длительность записи в секундах
LEN=4000
#длительность одного файла (программа нарезает запись как Вам надо)
SEGMENT=3600

ffmpeg -i ${CAMURL} -vcodec copy -acodec copy -map 0 -t ${LEN} -f segment -segment_time ${SEGMENT} -segment_format mp4 ${FILE} &>/dev/null &

Пояснение: знак & в конце означает запустить программу и выйти в shell - то есть по сути сделать программу резидентной или демоном. НО! это работает долго только если программа ничего не выводит (иначе при закрытии shell, когда некуда будет выводить, команда закроется). Чтобы этого не происходило, вывод перенаправлен в /dev/null - то есть в пустоту. Обратите внимание, Linux имеет два выводных потока - обычный, так называемый stdout и ошибок stderr. И перенаправлять надо оба, что и сделано (можно перенаправить по-отдельности так: ... 1>/dev/null 2>/dev/null ...). Если есть желание почитать что выводит программа, можно перенаправить вывод в файл (только чтобы он был в каталоге, доступном для записи)

Если процесс запускается на сервере через ssh, то следует знать об особенности запуска процессов от пользователя, который собирается после запуска разлогиниться. В Альтлинукс и МОС процессы, запущенные пользователем останавливаются при выходе этого пользователя. В случае, если Вы собираетесь запустить и разлогиниться, для корректного функционирования записи эту особенность поведения (она зависит от дистрибутива Linux) надо заблокировать. для этого нужно установить пакет systemd-settings-disable-kill-user-processes.

WEB камеры

Скрипт ниже можно запускать на доске, чтобы превратить ее c подключенной web-камерой в rtsp камеру наблюдения. Скрипт пока в разработке

#!/bin/bash
#крипт запускается НЕ от root
#ПОИСК ИСТОЧНИКА ЗВУК ПО НАЗВАНИЮ webcam
PULSE=`pactl list short sources | grep --ignore-case webcam | awk '{ print $1 }'`
#НЕ найдя берем источник по умолчанию
if [ -z "${PULSE}" ]; then
PULSE=default
fi
#ПОМСК ИСТОЧНИКА ВИДЕО
V4L=`v4l2-ctl --list-devices | grep -A 1 --ignore-case webcam | grep /dev/ | awk '{ print $1 }'`
#НЕ НАЙДЯ БЕРЕМ ПЕРВЫЙ
if [ -z "${V4L}" ]; then
V4L=/dev/video0
fi

#запуск сервера rtsp на порту 8554

nohup ffmpeg -thread_queue_size 1024 -f v4l2 -framerate 15 -input_format mjpeg  -i ${V4L}  -f pulse -ac 1 -thread_queue_size 1024 -i ${PULSE}  -acodec aac -vcodec libx264 -preset ultrafast -crf 22 -s hd720 -vf format=yuv420p -profile:v main -threads 0 -f mpegts - 2>/dev/null | vlc -I dummy -  --sout='#rtp{sdp=rtsp://:8554/} --sout-all --sout-keep' >/dev/null 2>/dev/null &

#ссылка для просмотра или записи rtsp://<you ip>:8554/ (последний символ важен!)
# Для того чтобы подключаться по http, часть команды после vlc следует заменить на следующую (у меня работает плохо)
# vlc -I dummy - --sout='#std{access=http{mime=video/mp4},mux=ts,dst=:8080}'
# большая часть взята отсюда https://stackoverflow.com/questions/26999595/what-steps-are-needed-to-stream-rtsp-from-ffmpeg