Задать вопрос
jimmyjonezz
@jimmyjonezz
Инженер

Как циклично записывать видео с камеры, в файлы небольшого размера при помощи ffmpeg?

Не силен в создании скриптов. Подскажите, как реализовать функциональность видеорегитратора на ПК. Есть ip-камера. Выдергиваю RTSP-поток при помощи ffmpeg и записываю в файл длительностью 15 минут, но функция работает единоразово:
ffmpeg -t 00:15:00 -i "rtsp://192.168.1.10:554/user=admin&password=&channel=1&stream=0.sdp" -vcodec copy -b:v 64k "/home/anton/video/$(date +%Y-%m-%d+%H-%M-%S).mkv"


Итак, не дождавшись ответа и самостоятельно поломав голову, а также прочитав кучу литературы, я все же смастерил скрипт. Кажется, что можно улучшить, но пока и так сойдет. Значение порога свободного месиа подбирается эксперементально. Жду, предложений по улучшению скрипта.
З.Ы.: Выяснилось, что find срабатывает неверно, после удаления старого файла.
#!/bin/bash
i='2700' #параметр обозначающий порог свободного места на диске в МБ
FREE=$(df -m | grep "/dev/sdb1" | awk '{print $4}')
while [ "$i" -le "$FREE" ] #запись пока есть свободное место на диске
do
	echo "Запись нового файла: " $(date +%Y-%m-%d+%H-%M-%S)".mkv"
	ffmpeg -t 00:05:00 -i "rtsp://192.168.1.10:554/user=admin&password=&channel=1&stream=0.sdp" -vcodec copy -b:v 64k "/media/anton/48D6-E2E1/$(date +%Y-%m-%d+%H-%M-%S).mkv"
	FREE=$(df -m | grep "/dev/sdb1" | awk '{print $4}') #проверим сколько осталось свободного места после записи файла
	if [ "$i" -gt "$FREE" ];
	then
		until [ "$i" -gt "$FREE" ]
		do		
			#ищим самый старый файл, за последние пять дней
			var_d=$(find /media/anton/48D6-E2E1 -type f -name '*.mkv' -mtime 5 -daystart | head -n 1 | rm)
			echo "Удаляем старый файл: " $var_d
			FREE=$(df -m | grep "/dev/sdb1" | awk '{print $4}') #проверим сколько осталось свободного места после удаления
			var_d=""
		done
	fi
done
  • Вопрос задан
  • 11801 просмотр
Подписаться 7 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
@3do
Получилось рабочее решение в пару строк - может кому пригадится.
1. Запуск ffmpeg в screen с именем record.
screen -d -m -S record ffmpeg -rtsp_transport tcp -i rtsp://192.168.0.100/avstream -c copy -map 0 -f segment -segment_time 1800 -segment_format mp4 -reset_timestamps 1 -copyts -flags global_header -strftime 1 /home/user001/video/%Y-%m-%d_%H-%M-%S.mp4

Запуск ffmpeg с параметром -f segment пишет поток rtsp непрерывно, разбивая автоматически на файлы длительностью 1800 секунд ( параметр -segment_time 1800 ), т.е. по 30 мин. Имя фа
-rtsp_transport tcp пришлось добавить, т.к. без этого терялись пакеты.

2. В /etc/crontab добавляем стоку
*  *	* * *	root	ls -t /home/user001/video/* | sed -e '1,96d' | xargs -d '\n' rm

которая раз в минуту проверяет данную директорию на количество файлов и оставляет только 96 самых свежих файлов, а остальные удаляет (96 по полчаса = 2 суток).
Ответ написан
Комментировать
A1ejandro
@A1ejandro
youtube блогер, ИТ-специалист
Ответ написан
Комментировать
only-victor
@only-victor
Рекомендую поставить motion. Может записывать только на движение. И работает с IP, usb камерами.
Ответ написан
Комментировать
@BAF285
Рекомендую скрипт для автоматического удаления файлов, что бы диск не переполнился
https://bafista.ru/skript-udaleniya-staryh-fajlov-...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы