Вопрос или проблема
У меня есть собственная команда выполнения 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 — мощный и распространенный инструмент для обработки аудио и видео. Он поддерживает множество кодеков и форматов, а также может работать с потоковым видео, например, через RTSP (Real Time Streaming Protocol). Одной из функций ffmpeg является возможность записи потокового видео и разделение его на сегменты.
Однако работа с потоковыми данными, особенно через RTSP, может быть сложной из-за нестабильности соединения, потерь пакетов и задержек. Кроме того, такие параметры, как обнаружение движения, накладывают дополнительные требования на обработку видео.
Пример использования
Ваш docker-команда запускает контейнер с ffmpeg, который реализует следующие основные функции:
- Запись RTSP-потока: используется протокол UDP для подключения к камере.
- Обнаружение движения: применяется фильтр
select= gt(scene, 0.01)
для определения изменений в кадрах. - Сегментация видео: каждые 60 секунд видео разбивается на отдельные файлы.
- Использование tmpfs для хранения видео до их окончательной обработки и сохранения на диске.
Возможные причины и рекомендации
1. Проблемы с обнаружением движения
Параметр select=gt(scene, 0.01)
определяет порог чувствительности для обнаружения движения. При высоком значении сцены могут детектироваться реже. Попробуйте уменьшить значение порога, например, до 0.005
, чтобы повысить чувствительность.
2. Ограничение ресурсов
Несмотря на то, что у вас 64 ГБ ОЗУ и 2 CPU, возможно, что ресурсы исчерпываются из-за интенсивности обработки видео. Проверьте загрузку CPU и использование памяти внутри контейнера с помощью docker-команды docker stats
. Попробуйте увеличить количество потоков, если это возможно (-threads
).
3. Проблема с сетью
Поток через RTSP может быть прерван из-за плохого сетевого соединения. Проверьте стабильность сети между камерой и вашим сервером. Попробуйте задать параметр -tune zerolatency
, чтобы снизить задержку при записи.
4. Ошибки в кодеке и параметры
Убедитесь, что выбранные параметры кодека подходят для вашего случая. Параметры, такие как -crf
, -preset
, -pix_fmt
, влияют на качество и скорость кодирования. Возможно, стоит экспериментировать с их значениями.
5. Возможные ошибки в самой конфигурации
Обратите внимание на комбинацию флагов, таких как movflags +faststart+write_colr+frag_keyframe
. Попробуйте исключить некоторые из них поочередно, чтобы оценить их влияние на стабильность выполнения команды.
6. Логи и отладка
У вас уже задан уровень логирования -loglevel debug
, что правильно для отладки. Анализируйте вывод логов, чтобы определить точный момент, когда команда перестает корректно работать. Обратите внимание на любые предупреждения или ошибки.
Практическое применение
Внедряя изменения по вышеописанным рекомендациям, вы можете улучшить стабильность работы ffmpeg:
- Уменьшите порог для обнаружения движения.
- Проверьте используемые во время выполнения ресурсы, чтобы оптимизировать нагрузку.
- Убедитесь в стабильности сетевого соединения, чтобы избежать потерь пакетов.
- Настройте параметры кодека для достижения оптимальных результатов.
- Тестируйте конфигурацию без избыточных флагов и с минимальными изменениями, чтобы определить причину проблемы.
- Постоянно проверяйте логи для более точного диагностирования проблем.
Заключение: вашей задачей является тонкая настройка всех параметров и проверка различных аспектов — от сетевого соединения до конфигураций ffmpeg — чтобы достичь устойчивой работы вашего решения.