Я хотел бы монтировать видео с помощью 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 не содержит временных меток, нет возможности для асинхронности.
Это оказалось надежным способом поместить видео из сомнительных источников (например, коммерческие клипы от какого-либо рекламодателя) в строго регулируемый линейный поток (например, телеканал) без внесения каких-либо артефактов.