FFmpeg/AVconc — захват бесшовного видео

FFmpeg/AVconc — захват бесшовного видео

У меня есть несколько 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

Смотритедокументыдля получения дополнительных опций и информации.

Связанный контент