FFmpeg: как конвертировать вертикальное видео с черными сторонами, к видео 16: 9, с размытыми фоновой стороной
![Vertical video with blurred background sides]()
Как это сделать с помощью FFmpeg?
Пример без FFmpeg:
Adobe After Effects
Sony Vegas Pro
Ответы
Ответ 1
Я решил!
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
Ответ 2
Принятый ответ здесь выполняется вечно, потому что он делает так много ненужных вычислений. Нам не нужно размыть пиксели, которые мы точно знаем, что они будут вне области просмотра в выходном видео.
Таким образом, лучшим решением было бы сначала обрезать ту часть видео, которая будет видна на выходе. Затем мы масштабируем эту часть, чтобы "заполнить" область просмотра. Наконец, мы накладываем оригинальное видео поверх него.
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
Ответ 3
Вы можете попробовать накладывать видео на смазанное изображение следующим образом.
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
будет получать указанные обработанные входные потоки и соответственно отображать их в выходной поток.
Надеюсь, это поможет вам!
Ответ 4
Я не смог получить ни одно из предыдущих решений для работы с 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>
соответствующими именами файлов.
Ответ 5
я использую эту команду:
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