Как это сделать с помощью FFmpeg?
Пример без FFmpeg:
Adobe After Effects
Sony Vegas Pro
Я решил!
ffmpeg -i input.mp4 -lavfi '[0:v]scale=ih*16/9:-1,boxblur=luma_radius=min(h\,w)/20:luma_power=1:chroma_radius=min(cw\,ch)/20:chroma_power=1[bg];[bg][0:v]overlay=(W-w)/2:(H-h)/2,crop=h=iw*9/16' -vb 800K output.webm
Входные данные: https://www.youtube.com/watch?v=17uHCHfgs60
Выходные данные: http://www.youtube.com/watch?v=CgZsDLfzrTs
boxblur
. Это решение на 60% быстрее и не включено в лицензию GPL.
- person lasnow; 05.04.2019
Принятый ответ здесь выполняется навсегда, потому что он выполняет так много ненужных вычислений. Нам не нужно размывать пиксели, которые, как мы точно знаем, будут вне области просмотра в выходном видео.
Таким образом, лучшим решением было бы сначала обрезать ту часть видео, которая будет видна на выходе. Затем мы масштабируем эту часть, чтобы «заполнить» окно просмотра. Наконец, мы накладываем исходное видео поверх него.
Below example assumes that input video has greater
aspect ratio than output video.
┌─────────────┐
┌─────────────┐ │ │
│ Input video │ │ Output │
│ │ │ video │
└─────────────┘ │ │
│ │
└─────────────┘
Для этого мы будем использовать график фильтров. Наш фильтр будет выглядеть следующим образом в точечной нотации:
[original]
input --> split -------------------------------> overlay --> output
│ ^
│[copy] [blurred]│
└──────> crop ──> scale ──> gblur ─────────┘
Предполагая, что разрешение входного видео составляет 1280 x 720, команда выглядит следующим образом:
ffmpeg -i input.mp4 -vf 'split [original][copy]; [copy] crop=ih*9/16:ih:iw/2-ow/2:0, scale=1280:2282, gblur=sigma=20[blurred]; [blurred][original]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2' output.mp4
ffmpeg -i input.mp4 -vf 'split[original][copy];[copy]scale=ih*16/9:-1,crop=h=iw*9/16,gblur=sigma=20[blurred];[blurred][original]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2' output.mp4
, с этим изменением оно на 60% быстрее, чем принятый ответ.
- person lasnow; 05.04.2019
Я сделал универсальное решение для любого типа видео. Подходит для вертикального и горизонтального видео. Он изменяет размер видео до 1080p (можно использовать и для 720p) и заполняет все пустое пространство размытым видео этого.
ffmpeg -i input.mp4 -lavfi "[0:v]scale=1920*2:1080*2,boxblur=luma_radius=min(h\,w)/20:luma_power=1:chroma_radius=min(cw\,ch)/20:chroma_power=1[bg];[0:v]scale=-1:1080[ov];[bg][ov]overlay=(W-w)/2:(H-h)/2,crop=w=1920:h=1080" output.mp4
Я не смог заставить ни одно из предыдущих решений работать с ffmpeg 3.4.2 в Windows.
Однако это сработало:
ffmpeg -i <input_file> -filter_complex "[0:v]scale=ih*16/9:-1,boxblur=luma_radius=min(h\,w)/20:luma_power=1:chroma_radius=min(cw\,ch)/20:chroma_power=1[bg];[bg][0:v]overlay=(W-w)/2:(H-h)/2,crop=h=iw*9/16" <output_file>
Не забудьте заменить <input_file>
и <output_file>
соответствующими именами файлов.
Вы можете попробовать наложить видео на размытое изображение, подобное этому.
ffmpeg -i input_video -loop 1 -i input_image -t 10 -filter_complex "
[0:v]scale=-1:720[scaled_video];
[1:v]scale=1280:720,boxblur=50[blur_image];
[blur_image][scaled_video]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2[outv]" -c:v libx264 -aspect 1280/720 -map [outv] -map 0:a -c:a copy output_video
Входное изображение будет зацикливаться на протяжении выходного видео на -loop 1
. И -t 10
ограничит продолжительность выходного видео до 10 секунд. В этом примере я использовал 1280:720 в качестве разрешения выходного видео и масштабировал входные данные, чтобы соответствовать этому соотношению. 0:v
относится к входному видео, и оно будет масштабировано до высоты 720, а ширина будет скорректирована соответствующим образом.
Здесь я использовал фильтр boxblur
, где есть несколько других, таких как sab
, smartblur
и unsharp
. map
получит указанные обработанные входные потоки и соответственно сопоставит их с выходным потоком.
Надеюсь, что это поможет вам!
-f lavfi -i color=black
вместо второго изображения.
- person Chamath; 19.02.2017