Как это сделать с помощью 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
Принятый ответ здесь выполняется вечно, потому что он делает так много ненужных вычислений. Нам не нужно размыть пиксели, которые мы точно знаем, что они будут вне области просмотра в выходном видео.
Таким образом, лучшим решением было бы сначала обрезать ту часть видео, которая будет видна на выходе. Затем мы масштабируем эту часть, чтобы "заполнить" область просмотра. Наконец, мы накладываем оригинальное видео поверх него.
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_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
будет получать указанные обработанные входные потоки и соответственно отображать их в выходной поток.
Надеюсь, это поможет вам!
Я не смог получить ни одно из предыдущих решений для работы с 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.mp4 -r 25.00 -profile: v "Базовая линия" -level "3.0" -b: v 1200k -c: aac -b: 80k -ar 48000 -filter_complex "[0: v] масштабировать = IH * 16/9: -1, boxblur = luma_radius = мин (ч \, ш)/20: luma_power = 1: chroma_radius = мин (Cw \, ч)/20: chroma_power = 1 [bg]; [bg] [0: v] оверлей = (Ww)/2: (Hh)/2, кадрирование = h = iw * 9/16 "output.mp4