video - FFmpeg:将任何视频转换为边栏模糊的方形 1:1 视频

标签 video command-line ffmpeg windows-scripting

与此主题非常相似:

FFmpeg: How to convert vertical video with black sides, to video 16:9, with blurred background sides

我正在尝试为自己制作一个 bat 文件,以自动化我的 Instagram 视频创作。
这个想法是我制作可变分辨率和可变纵横比的视频。我不想花时间在每个视频上,只是为了让它适合。

所以这是我对那个 bat 文件的目标:

  • 必须输出方形视频
  • 原始视频无论是什么都必须保持其原始纵横比
  • 填补原始视频空白和正方形纵横比的空白必须用原始视频的平方和模糊版本来填充
  • (可选)让我选择输出分辨率(为了节省编码时间,因为 AFAIK Instagram 仅显示 600px² 视频(?))

  • 到目前为止,我设法获得了仅适用于垂直或水平视频但不能同时适用于两者的结果。或者最终将原始视频裁剪,这是我不想要的:我根据需要对我的主题进行构图,并且我不想预先考虑 FFmpeg 编码可以做的额外裁剪。

    到目前为止,这是我的脚本:

    echo off
    :again
    
    ffmpeg.exe -i "%~1" ^
        -c:v libx264 -crf 23 -filter_complex "[0:v]scale=600*2:600*2,boxblur=luma_radius=min(h\,w)/20:luma_power=1:chroma_radius=min(cw\,ch)/20:chroma_power=1[bg];[0:v]scale=600:-1[ov];[bg][ov]overlay=(W-w)/2:(H-h)/2,crop=w=600:h=600"  -profile:v baseline -level 3.0 -pix_fmt yuv420p -preset faster -tune fastdecode ^
        -c:a aac -ac 2 -b:a 128k ^
        -movflags faststart ^
        "%~p1%~n1_Instagramized.mp4" -y
    
    if NOT ["%errorlevel%"]==["0"] pause
    shift
    if "%~1" == "" goto:eof
    goto:again
    

    编辑:

    感谢@Gyan,我得到了the solution .我也添加了我的输入:

    由于我可能经常重复使用该 bat 文件并且可能想要更改输出分辨率,因此将分辨率硬编码在六个不同的位置并不方便。
    所以我创建了一个名为 SquareSize 的变量。使用 %SquareSize% 调用(而不是硬编码的分辨率)并使用 set SquareSize=XXX 在文件开头设置.所以现在我可以在需要时轻松更改,只需打开它并编辑 XXX。

    echo off
    :again
    
    set SquareSize=600
    
    ffmpeg.exe -i "%~1" ^
        -c:v libx264 -crf 23 ^
        -filter_complex "[0:v]split=2[blur][vid];[blur]scale=%SquareSize%:%SquareSize%:force_original_aspect_ratio=increase,crop=%SquareSize%:%SquareSize%,boxblur=luma_radius=min(h\,w)/20:luma_power=1:chroma_radius=min(cw\,ch)/20:chroma_power=1[bg];[vid]scale=%SquareSize%:%SquareSize%:force_original_aspect_ratio=decrease[ov];[bg][ov]overlay=(W-w)/2:(H-h)/2" ^
        -profile:v baseline -level 3.0 -pix_fmt yuv420p -preset faster -tune fastdecode ^
        -c:a aac -ac 2 -b:a 128k ^
        -movflags faststart ^
        "%~p1%~n1_Instagramized.mp4" -y
    
    if NOT ["%errorlevel%"]==["0"] pause
    shift
    if "%~1" == "" goto:eof
    goto:again
    

    最佳答案

    这就是 filter_complex 应该是的,
    "[0:v]split=2[blur][vid];[blur]scale=L:L:force_original_aspect_ratio=increase,crop=L:L,boxblur=luma_radius=min(h\,w)/20:luma_power=1:chroma_radius=min(cw\,ch)/20:chroma_power=1[bg];[vid]scale=L:L:force_original_aspect_ratio=decrease[ov];[bg][ov]overlay=(W-w)/2:(H-h)/2"
    替换 L用文字数字或变量表示边的长度。

    关于video - FFmpeg:将任何视频转换为边栏模糊的方形 1:1 视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58892160/

    相关文章:

    ios - 使用 Metal/OpenGL ES 在 iOS 中渲染视频

    python - opencv 无法停止流 : Inappropriate ioctl for device

    ios - 音频和视频流播放器

    java - Runtime.getRuntime().exec 如何运行 goto 命令

    Linux 上的 C : Parse arguments from '<' and '|'

    database - 使用 grep 提取文件之间的行

    filter - ffmpeg 仅对部分视频使用带有 alphamerge 的 complex_filter

    FFMPEG:仅反转视频文件的一部分

    ffmpeg - 在级联视频上添加 Logo

    ios - 如何在 iOS 中播放 NSData 音频或视频?