Я пытаюсь придумать способ использовать ffmpeg для записи записи веб-камеры в файл, одновременно отправляя некоторые кадры в процесс Python для онлайн-обработки. Важные части —
- Запись с веб-камеры является наивысшим приоритетом, должна поддерживать высокую частоту кадров и не должна прерываться / блокироваться чем-либо еще.
- Онлайн-обработка — это «максимум усилий» — в каждый момент времени я хотел бы получить последний кадр и обработать его. По сути, оставаясь в реальном времени, отбрасывая кадры, которые накапливались, пока я обрабатывал более старый кадр.
Я пробовал следующее
ffmpeg -video_size 1920x1080 -pixel_format mjpeg -i /dev/video5 -c:v libx264 -copyts -crf 0 -preset veryfast /tmp/test.mkv -f rawvideo pipe: | my_process
но проблема в том, что поток rawvideo блокирует поток, который записывает в файл, когда my_process не успевает.
Также попытался разделить на два процесса —
- Процесс, записывающий запись с веб-камеры
ffmpeg -video_size 4096x2160 -pixel_format mjpeg -i /dev/video5 -c:v libx264 -copyts -crf 0 -preset veryfast /tmp/test.mkv
- Процесс, который передается прямо из записи, пока она пишется.
tail -c +1 -F /tmp/test.mkv | ffmpeg -i pipe: -f rawvideo pipe: | my_process
но опять же — my_process иногда блокирует декодирование и отстает от реального времени. Более того, этот подход кажется нестабильным, иногда приводя к следующим ошибкам:
DTS 1626698042933, следующий: 2046000 st: 0 недопустимое отбрасывание
PTS 1626698042933, следующий: 2046000 недействительный сброс st: 0
Я уверен, что есть гораздо лучшее решение моей проблемы. Буду признателен за предложения 🙂
Спасибо! Вова
1 ответ
Использовать фифо мультиплексор для вывода по конвейеру.
ffmpeg -video_size 1920x1080 -pixel_format mjpeg -i /dev/video5 -c:v libx264 -copyts -crf 0 -preset veryfast /tmp/test.mkv -map 0 -f fifo -fifo_format rawvideo -drop_pkts_on_overflow true -attempt_recovery 1 -recovery_wait_time 1 rawvideo pipe: | my_process
