FFmpeg: как преобразовать вертикальное видео с черными сторонами в видео 16: 9 с размытыми сторонами фона

Вертикальное видео с размытым фоном по бокам

Как это сделать с помощью FFmpeg?

Пример без FFmpeg:
Adobe After Effects
Sony Vegas Pro


person Andrey    schedule 11.06.2015    source источник


Ответы (5)


Я решил!

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

person Andrey    schedule 14.06.2015
comment
Это не работает на Ubuntu 16.04 с версией ffmpeg 2.8.11-0ubuntu0.16.04.1 - person Benoit; 18.08.2017
comment
В видео есть ошибка: недопустимый размер слишком большой или неположительный для ширины «312» или высоты «176» @Adrian Мне действительно нужен этот скрипт или команда, пожалуйста, исправьте это. - person X 47 48 - IR; 28.08.2018
comment
У вас должна быть включена GPL, чтобы использовать фильтр boxblur. Это решение на 60% быстрее и не включено в лицензию GPL. - person lasnow; 05.04.2019
comment
как я могу изменить размер на 1280x720 с этими аргументами? - person alpertayfun; 26.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
person Abhinav Chauhan    schedule 10.02.2019
comment
Привет! В моем случае ваше решение на 80% быстрее... но на выходе нет разрешения 16:9. Мне удалось изменить свойства обрезки и масштабирования, чтобы удовлетворить заданному разрешению 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
comment
@lasnow Было ли входное разрешение также 1280 x 720? - person Abhinav Chauhan; 10.04.2019
comment
Нет, у меня на входе вертикальное видео, и мне нужно выходное видео 1280x720 или 16:9. Я думаю, это то, что спросили. - person lasnow; 10.04.2019
comment
@lasnow Это причина, по которой вы не получили ожидаемого результата. Ответ предполагает, что входное разрешение равно 1280 x 720. - person Abhinav Chauhan; 11.04.2019
comment
Да, вы правы, ваше решение имеет вход 1280x720, но возвращает 1280x2282 ... человек, который спрашивал в этом посте, и я искали выходное соотношение сторон 16: 9, которого нет в вашем решении. - person lasnow; 12.04.2019
comment
@lasnow Вы должны сделать этот ответ, который сработал для меня, как и ожидалось, и намного быстрее, чем большинство других ответов здесь. - person Hashim Aziz; 20.04.2021

Я сделал универсальное решение для любого типа видео. Подходит для вертикального и горизонтального видео. Он изменяет размер видео до 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

Результат 1

Результат 2

person Леонид Павлов    schedule 05.11.2019
comment
Это был единственный ответ, который сработал для меня. Спасибо Леонид Павлов - person londonfed; 17.06.2020
comment
Это работало из коробки, для квадратного видео! Спасибо! - person jfix; 06.11.2020
comment
Никак не получалось конвертировать вертикальное видео в формат 16:9. Результат 1920x1080, но растянутый по вертикали. - person Hashim Aziz; 20.04.2021

Я не смог заставить ни одно из предыдущих решений работать с 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> соответствующими именами файлов.

person Richard    schedule 18.03.2018
comment
Не могли бы вы предоставить обратный эквивалент этого? (с 16:9 до 9:16) - person WebDiva; 13.02.2021

Вы можете попробовать наложить видео на размытое изображение, подобное этому.

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 получит указанные обработанные входные потоки и соответственно сопоставит их с выходным потоком.

Надеюсь, что это поможет вам!

person Chamath    schedule 13.06.2015
comment
Могу ли я наложить видео на черный фон, например «youtube»? - person Hoàng Trần; 19.02.2017
comment
Да. Используйте -f lavfi -i color=black вместо второго изображения. - person Chamath; 19.02.2017
comment
Это не работает на Ubuntu 16.04 с версией ffmpeg 2.8.11-0ubuntu0.16.04.1 - person Benoit; 18.08.2017
comment
Даже не на Ubuntu 15.04 с версией ffmpeg 2.5.10-0ubuntu0.15.04.1 (в контейнере докера) - person Benoit; 18.08.2017