【问题标题】:FFmpeg: How to convert vertical video with black sides, to video 16:9, with blurred background sidesFFmpeg:如何将带有黑色边的垂直视频转换为视频 16:9,背景边模糊
【发布时间】:2021-12-31 15:46:59
【问题描述】:

如何使用 FFmpeg 制作?

没有 FFmpeg 的示例:
Adobe After Effects
Sony Vegas Pro

【问题讨论】:

    标签: video background ffmpeg blur


    【解决方案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

    【讨论】:

    • 这不适用于带有 ffmpeg 版本 2.8.11-0ubuntu0.16.04.1 的 ubuntu 16.04
    • 视频出现错误:对于宽度 '312' 或高度 '176' 而言,无效的尺寸太大或非正数 @Adrian 我真的需要这个脚本或命令,请修复它。跨度>
    • 您必须启用 GPL 才能使用 boxblur 过滤器。 This 解决方案的速度提高了 60%,并且不包含在 GPL 许可中。
    • 如何使用该参数调整 1280x720 的大小?
    • 在 Windows 上执行此操作需要完整构建。可以从这里下载:gyan.dev/ffmpeg/builds/ffmpeg-git-full.7z(ffmpeg官网提到的来源)。
    【解决方案2】:

    我为任何类型的视频制作了通用解决方案。适用于垂直和水平视频。它将视频大小调整为 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:

    【讨论】:

    • 这是唯一对我有用的答案。谢谢 Леонид Павлов
    • 这是一个开箱即用的方形视频!谢谢!
    • 根本无法将我的垂直视频转换为 16:9。结果为 1920x1080,但垂直拉伸。
    • @HashimAziz 我认为最好是看到一个顶部和底部被裁剪的填充视频,而不是改变比例并在宽度上拉伸 3-4 倍,例如面部,它看起来很糟糕
    【解决方案3】:

    这里接受的答案需要永远执行,因为它进行了很多不必要的计算。我们不需要模糊我们确定会在输出视频中超出视口的像素。

    因此,更好的解决方案是首先裁剪将在输出中可见的视频部分。然后我们缩放这部分以“填充”视口。最后,我们将原始视频叠加在上面。

    Below example assumes that input video has greater
    aspect ratio than output video.
                        ┌─────────────┐
    ┌─────────────┐     │             │
    │ Input video │     │   Output    │
    │             │     │   video     │
    └─────────────┘     │             │
                        │             │
                        └─────────────┘
    

    我们将使用filter graph 来实现这一点。我们的过滤器将以点符号表示如下:

                    [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
    

    【讨论】:

    • 嗨!在我的情况下,您的解决方案要快 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%。
    • @lasnow 你输入的分辨率也是 1280 x 720 吗?
    • 不,我的输入是垂直视频,我想要一个 1280x720 或 16:9 的输出视频。我想这是被问到的。
    • @lasnow 这就是你没有得到预期结果的原因。答案假设输入分辨率为 1280 x 720
    • 是的,你是对的,你的解决方案有一个 1280x720 的输入,但返回一个 1280x2282... 在这篇文章中问的人和我正在寻找 16:9 的输出纵横比,这是你的解决方案没有
    【解决方案4】:

    我无法在 Windows 上使用 ffmpeg 3.4.2 获得之前提供的任何解决方案。

    但是这确实有效:

    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>
    

    不要忘记将&lt;input_file&gt;&lt;output_file&gt; 替换为适当的文件名。

    【讨论】:

    • 您能否提供与此相反的等价物? (16:9 到 9:16)
    【解决方案5】:

    您可以尝试将视频叠加在这样的模糊图像上。

    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 过滤器,还有其他几个过滤器,例如sabsmartblurunsharpmap 将获取指定的处理过的输入流并相应地映射到输出流。

    希望对您有所帮助!

    【讨论】:

    • 我可以像“youtube”一样将视频叠加在黑色背景上吗?
    • 是的。使用-f lavfi -i color=black 而不是第二张图片。
    • 这不适用于具有 ffmpeg 版本 2.8.11-0ubuntu0.16.04.1 的 ubuntu 16.04
    • 即使不是在 ubuntu 15.04 上使用 ffmpeg 版本 2.5.10-0ubuntu0.15.04.1(在 docker 容器中)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 2015-03-31
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多