
У меня есть несколько IP-камер, с которых я хочу непрерывно захватывать видео. Я создаю скрипт, который будет оборачиваться вокруг ffmpeg для захвата из различных источников RTSP. Но я борюсь с тем, как захватывать и хранить данные... в частности, как захватывать бесшовные клипы?
Для ясности, если я просто выполню такую команду:
ffmpeg -i rtsp://ip_cam file.mp4
Это будет продолжаться вечно, пока не заполнит мой жесткий диск (или пока я не достигну какого-то верхнего предела ffmpeg или файловой системы). Поэтому я думал сделать что-то вроде этого:
ffmpeg -i rtsp://ip_cam -fs 104857600 file-1.mp4
Это ограничит файлы размером 100 МБ каждый. Мой скрипт-обертка может запустить новый экземпляр, как только этот завершится:
ffmpeg -i rtsp://ip_cam -fs 104857600 file-2.mp4
И так далее (я могу создать отдельный процесс, который будет очищать старые файлы по мере необходимости для освобождения места). Проблема с этим подходом в том, что запуск ffmpeg занимает 1-2 секунды,что означает, что в это время рассматриваемая камера ничего не записывает..
Еще одна вещь, которую следует учесть, заключается в том, что для каждого файла мне нужно знать начальную и конечную временную метку, например, это file-1.mp4
может быть от "2015-09-12 09:03:42" до "2015-09-12 11:24:21". Таким образом, если пользователь захочет получить определенный клип, я буду знать, где его получить. И если я запускаю ffmpeg для каждого клипа, а затем он останавливается в конце каждого клипа, я могу захватить и сохранить эту информацию. Но если предлагаемый подход заключается в том, чтобы сказать ffmpeg работать бесконечно, сохраняя вывод отдельными фрагментами (если ffmpeg может это сделать), это может не сработать, поскольку я не смогу собрать эту информацию.
Любая информация будет оценена по достоинству.
решение1
Попробуйтесегментный мультплексор.
ffmpeg -i rtsp://ip_cam -c copy -f segment -segment_list out.list -segment_time 900 \
-segment_atclocktime 1 -strftime 1 "%Y-%m-%d_%H-%M-%S.mkv"
-segment_list
Создайте файл списка.-segment_time
Установите длительность сегмента. Значение должно быть спецификацией длительности. Значение по умолчанию — 2. Обратите внимание, что разделение может быть неточным, если вы не принудительно зададите ключевые кадры потока ссылок в заданное время. См.сегмент мультиплексора документациядля получения дополнительной информации.-segment_atclocktime
Если установлено значение "1", разбить на регулярные интервалы времени часов, начиная с 00:00 часов. Значение времени, указанное в ,-segment_time
используется для установки длины интервала разбиения. Например, если segment_time установлено на "900", это позволяет создавать файлы в 12:00 часов, 12:15, 12:30 и т. д.-strftime
Это позволяет именовать сегменты по времени создания файла.
Примеры имен выходных файлов:
$ ls -m1
2015-09-12_14-10-02.mkv
2015-09-12_14-10-14.mkv
2015-09-12_14-10-24.mkv
2015-09-12_14-10-34.mkv
2015-09-12_14-10-44.mkv
2015-09-12_14-10-54.mkv
Смотритедокументыдля получения дополнительных опций и информации.