Точно обрезайте видео с помощью ffmpeg

Точно обрезайте видео с помощью ffmpeg

Я хотел бы монтировать видео с помощью ffmpeg для машинного обучения.

Как я могу гарантировать, что если я вырежу (например) 1 секунду видео с частотой 25 кадров в секунду, то это даст ровно 25 кадров синхронизированного звука и видео?

Я видел, что ffmpeg ищет ключевые кадры во время резки, выбирая ближайший. У меня были проблемы, так как он генерировал отрицательные временные метки и заполнял конец вырезанного видео скопированными кадрами.

Я понимаю, что метаданные не отображают реальные fps и т. д.

Так каков же должен быть конвейер для получения точных нарезок с точным количеством кадров, соответствующих аудиопотоку?

Спасибо

решение1

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

  • Прежде всего, вам нужно вырезать видео (игнорируя аудио на мгновение), это лучше всего сделать с помощью -ss inpointи -pix_fmt yuv420p -an -f yuv4mpegpipe -frames:v 25перенаправления в один x264или другой экземпляр ffmpeg. Это оказалось надежным способом вырезать видеопоток с точностью до кадра.
  • Для аудио самый простой способ — преобразовать в -c:a pcm_s16leи «-f s16le», а затем обработать результат на уровне файла, чтобы он содержал правильное количество байтов с правильного смещения.
  • Последний ffmpegпроход может сжать аудио, если необходимо, или просто соединить его с видео. Поскольку необработанный PCM не содержит временных меток, нет возможности для асинхронности.

Это оказалось надежным способом поместить видео из сомнительных источников (например, коммерческие клипы от какого-либо рекламодателя) в строго регулируемый линейный поток (например, телеканал) без внесения каких-либо артефактов.

Связанный контент