Почему моя команда ffmpeg работает только первые несколько минут?

Вопрос или проблема

У меня есть собственная команда exec ffmpeg в docker для записи rtsp потока с использованием детекции движения, которая создает сегменты каждые 60 секунд. Но эта команда правильно распознает движение только первые 1-2 минуты, и без каких-либо ошибок ffmpeg не детектирует движение. Я использую самую последнюю версию ffmpeg.

docker run -d -v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
--tmpfs /tmpfs:rw,noexec,nosuid,size=100M,mode=1777 \
-v /data/ARCHIVE:/ARCHIVE \
-e ARCHIVE_PATH="/ARCHIVE/Cam1" \
--restart=unless-stopped \
-d --name rec-Cam1 \
ffmpeg-recorder -loglevel debug -rtsp_transport udp \
-i rtsp://user:[email protected]:554 \
-pix_fmt yuv420p -threads 4 -fflags +igndts+discardcorrupt \
-use_wallclock_as_timestamps 1 -fps_mode cfr \
-filter_complex "[0:v]split=2[full][motion];[motion]crop=1270:710:0:10,select="gt(scene, 0.01)"[detect];[full][detect]overlay=0:10[output];" \
-map "[output]" \
-r 10 \
-c:v h264 \
-b:v 500k \
-maxrate 1000k \
-crf 20 \
-preset veryslow \
-f segment \
-segment_time 60 \
-reset_timestamps 1 \
-strftime 1 \
-reconnect_at_eof 1 \
-reconnect_streamed 1 \
-reconnect_delay_max 120 \
-movflags +faststart+write_colr+frag_keyframe \
 /tmpfs/Cam1_%Y%m%d%H%M%S.mp4

Эта команда использует tmpfs, а затем inotifywait копирует готовый файл на хранилище, образ построен – ffmpeg + inotify. Это часть моей программы. Но основная проблема в том, что эта конфигурация работает неправильно. У меня 64 Гб ОЗУ и 2xЦПУ, я думаю, что это не проблема аппаратного обеспечения.

Ответ или решение

Теория

FFmpeg — это мощный инструмент для обработки видео и аудио потоков, который позволяет выполнять множество различных операций, таких как конвертация форматов, изменение качества видео, добавление фильтров и многое другое. Использование FFmpeg в контейнерах Docker предоставляет определенные преимущества в плане изоляции окружения и удобства развёртывания.

Когда мы говорим о проблемах с FFmpeg, которые проявляются спустя несколько минут после начала выполнения операции, необходимо учитывать несколько факторов, которые могут повлиять на стабильность и эффективность обработки видео потока:

  1. Проблемы с производительностью процессора и памяти: Несмотря на достаточный объём памяти и наличие нескольких процессоров, важно правильно распределить ресурсы. Использование флага -threads позволяет контролировать количество потоков, которые FFmpeg может использовать.

  2. Проблемы с сетью и подключением к RTSP-источнику: RTSP — это сетевой протокол, и сбои в сети, перегрузка или проблемы с подключением могут приводить к тому, что поток перестанет обрабатываться корректно.

  3. Правильная настройка фильтров: В вашей команде FFmpeg вы используете фильтр select="gt(scene, 0.01)", который отвечает за обнаружение изменения сцены. Если настройки фильтра не оптимальны для текущего видеопотока, это может привести к неправильной работе механизма обнаружения движения.

  4. Кодеки и параметры компрессии: Параметры такие как -b:v, -crf, -preset, movflags, используемые в команде, оказывают влияние на качество и скорость обработки видео. Неправильно настроенные параметры могут вызвать проблемы.

Пример

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

  • Запуск контейнера Docker:

    docker run -d --name rec-Cam1 ffmpeg-recorder ...

    Контейнер инициируется корректно, без проблем на этом этапе.

  • Источник RTSP-потока:

    -i rtsp://user:[email protected]:554

    Убедитесь, что нет проблем с правами доступа или стабильностью соединения с RTSP-источником.

  • Комплексные фильтры:

    -filter_complex "[0:v]split=2[full][motion];[motion]crop=1270:710:0:10,select="gt(scene, 0.01)"[detect];[full][detect]overlay=0:10[output];"

    Эффективность работы фильтров зависит от корректности их параметров. Возможно, стоит поэкспериментировать с коэффициентом gt(scene, 0.01).

  • Форматирование видео:

    -c:v h264 -b:v 500k -maxrate 1000k -crf 20 -preset veryslow

    Здесь задана высокая компрессия и низкий битрейт, что может снижать качество видео и вызывать временные задержки в обработке.

Применение

Для анализа и решения проблемы попробуйте выполнить несколько шагов:

  1. Оптимизация фильтров:

    • Попробуйте изменить коэффициент gt(scene, 0.01) или замените его другими методами обнаружения движения. Рассмотрите возможность использования двойного порога для уменьшения ложных срабатываний.
  2. Тестирование сети:

    • Проверьте стабильность подключений к RTSP-источнику. Возможно, стоит использовать более стабильный протокол транспортировки или изменить параметры повторного подключения.
  3. Использование ресурсов:

    • Убедитесь, что контейнер может использовать достаточное количество потоков без влияния на другие процессы, запущенные на сервере.
  4. Логи FFmpeg:

    • Увеличьте уровень логирования, чтобы выявить любые скрытые предупреждения или сообщения об ошибках, которые могут подсказать дополнительные пути для диагностики проблемы.
  5. Тестирование на стабильность:

    • Попробуйте выполнить подобную задачу вне Docker, чтобы понять, возникает ли проблема из-за контейнеризации. Также организуйте стресс-тесты при различных нагрузках.

Следуйте этим шагам и производите изменения постепенно, чтобы можно было четко идентифицировать, какое именно вмешательство способствует устранению проблемы. В результате детального анализа и оптимизации конфигурации ваша система записи видео должна стабильно работать на необходимом вам уровне.

Оцените материал
Добавить комментарий

Капча загружается...