Вопрос или проблема
У меня есть собственная команда 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, которые проявляются спустя несколько минут после начала выполнения операции, необходимо учитывать несколько факторов, которые могут повлиять на стабильность и эффективность обработки видео потока:
-
Проблемы с производительностью процессора и памяти: Несмотря на достаточный объём памяти и наличие нескольких процессоров, важно правильно распределить ресурсы. Использование флага
-threads
позволяет контролировать количество потоков, которые FFmpeg может использовать. -
Проблемы с сетью и подключением к RTSP-источнику: RTSP — это сетевой протокол, и сбои в сети, перегрузка или проблемы с подключением могут приводить к тому, что поток перестанет обрабатываться корректно.
-
Правильная настройка фильтров: В вашей команде FFmpeg вы используете фильтр
select="gt(scene, 0.01)"
, который отвечает за обнаружение изменения сцены. Если настройки фильтра не оптимальны для текущего видеопотока, это может привести к неправильной работе механизма обнаружения движения. -
Кодеки и параметры компрессии: Параметры такие как
-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
Здесь задана высокая компрессия и низкий битрейт, что может снижать качество видео и вызывать временные задержки в обработке.
Применение
Для анализа и решения проблемы попробуйте выполнить несколько шагов:
-
Оптимизация фильтров:
- Попробуйте изменить коэффициент
gt(scene, 0.01)
или замените его другими методами обнаружения движения. Рассмотрите возможность использования двойного порога для уменьшения ложных срабатываний.
- Попробуйте изменить коэффициент
-
Тестирование сети:
- Проверьте стабильность подключений к RTSP-источнику. Возможно, стоит использовать более стабильный протокол транспортировки или изменить параметры повторного подключения.
-
Использование ресурсов:
- Убедитесь, что контейнер может использовать достаточное количество потоков без влияния на другие процессы, запущенные на сервере.
-
Логи FFmpeg:
- Увеличьте уровень логирования, чтобы выявить любые скрытые предупреждения или сообщения об ошибках, которые могут подсказать дополнительные пути для диагностики проблемы.
-
Тестирование на стабильность:
- Попробуйте выполнить подобную задачу вне Docker, чтобы понять, возникает ли проблема из-за контейнеризации. Также организуйте стресс-тесты при различных нагрузках.
Следуйте этим шагам и производите изменения постепенно, чтобы можно было четко идентифицировать, какое именно вмешательство способствует устранению проблемы. В результате детального анализа и оптимизации конфигурации ваша система записи видео должна стабильно работать на необходимом вам уровне.