Как получить побочный поток при записи видеозаписи в файл

Я пытаюсь придумать способ использовать ffmpeg для записи записи веб-камеры в файл, одновременно отправляя некоторые кадры в процесс Python для онлайн-обработки. Важные части —

  1. Запись с веб-камеры является наивысшим приоритетом, должна поддерживать высокую частоту кадров и не должна прерываться / блокироваться чем-либо еще.
  2. Онлайн-обработка — это «максимум усилий» — в каждый момент времени я хотел бы получить последний кадр и обработать его. По сути, оставаясь в реальном времени, отбрасывая кадры, которые накапливались, пока я обрабатывал более старый кадр.

Я пробовал следующее

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 не успевает.

Также попытался разделить на два процесса —

  1. Процесс, записывающий запись с веб-камеры
ffmpeg -video_size 4096x2160 -pixel_format mjpeg -i /dev/video5 -c:v libx264 -copyts -crf 0 -preset veryfast /tmp/test.mkv
  1. Процесс, который передается прямо из записи, пока она пишется.
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 ответ
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

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

    Ваш адрес email не будет опубликован. Обязательные поля помечены *