Как использовать ffmpeg для масштабирования изображения и определения желаемых кадров в секунду? - PullRequest
0 голосов
/ 28 марта 2020

Я использую ffmpeg для преобразования кадров из mp4 в png изображения.
Мне бы хотелось 20 кадров в секунду И я также хотел бы, чтобы изображения масштабировались до 1920x1080. Оригинальный mp4 - 240p (426x240).

Позволяет указать 20 кадров в секунду после флага -vf, но не позволяет масштабировать изображения.

ffmpeg -i 240_video.mp4 -vf scale=1920:1080 fps=20 240_scaled/out%d.png

Если я пропускаю scale=1920:1080, команда работает, но, конечно, я получаю 426x240 изображений.

1 Ответ

1 голос
/ 28 марта 2020

Вы можете связать линейные фильтры вместе запятыми:

ffmpeg -i 240_video.mp4 -vf "fps=20,scale=1920:1080" 240_scaled/out%d.png
  • Если ваш вход имеет более 20 кадров в секунду, то ffmpeg пропустит кадры для преобразования в 20 кадров в секунду. Если ваш ввод менее 20 кадров в секунду, то ffmpeg будет дублировать кадры для преобразования в 20 кадров в секунду. Если вы хотите, чтобы все кадры были такими, как есть, то пропустите фильтр fps.
  • Сначала я использовал фильтр fps , потому что в этом случае, предполагая, что ваша частота кадров на входе выше, чем 20 кадров в секунду, он будет немного эффективнее и быстрее, чем первое масштабирование, потому что кадры будут отбрасываться до фильтра .

Многим игрокам не понравится результат, потому что он не будет 4 : 2: 0, так что вы можете добавить фильтр format :

ffmpeg -i 240_video.mp4 -vf "fps=20,scale=1920:1080,format=yuv420p" 240_scaled/out%d.png

426x240 с масштабированием при сохранении соотношения сторон на самом деле 1920x1082 или 1917x1080, поэтому добавьте pad или обрезать для компенсации. Или обратитесь к опции force_original_aspect_ratio в масштабе. setsar добавлено, так что вы не получите странный SAR. -movflags +faststart добавляется в случае прогрессивного воспроизведения.

ffmpeg -i 240_video.mp4 -vf "fps=20,scale=1920:-1,crop=1920:1080,setsar=1,format=yuv420p" -movflags +faststart 240_scaled/out%d.png
...