簡體   English   中英

FFmpeg:如何將帶黑框的水平非全高清視頻渲染為 1920x1080 視頻,背景模糊

[英]FFmpeg: How to render horizontal non full hd video with black frames, to video in 1920x1080, with blurred background

示例視頻:

在此處輸入圖像描述

期望的結果:

在此處輸入圖像描述

完整的命令可能如下所示:

ffmpeg -y -i in.jpg -filter_complex "scale=1920:1080,setsar=1:1,crop=1584:896:172:92,split[crp0][crp1];[crp0]scale=1920:1080,setsar=1:1,gblur=sigma=30[blur];[blur][crp1]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2" out.jpg

該命令應用您發布的圖像(名為in.jpg )。


樣本 output:
在此處輸入圖像描述


過濾器鏈:

  • scale=1920:1080,setsar=1:1 - 將輸入調整為 1920x1080( setsar用於固定縱橫比)。
  • crop=1584:896:172:92 - 裁剪黑框內的部分。
  • split[crp0][crp1] - 將裁剪后的 output 拆分為兩個相同的流(兩個相同的圖像)。
  • [crp0]scale=1920:1080,setsar=1:1,gblur=sigma=30[blur] - 將裁剪后的圖像調整為 1920x1080 並對調整后的圖像進行模糊處理。
    將模糊圖像存儲在臨時變量[blur]中。
  • [blur][crp1]overlay=... - 在模糊圖像上疊加[crp1]

對於視頻文件,它的工作方式相同。
例子:

ffmpeg -y -i in.mp4 -filter_complex "scale=1920:1080,setsar=1:1,crop=1584:896:172:92,split[crp0][crp1];[crp0]scale=1920:1080,setsar=1:1,gblur=sigma=30[blur];[blur][crp1]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2" -vcodec libx264 -pix_fmt yuv420p -acodec copy out.mp4

使用cropdetect過濾器查找crop參數:

cropdetect過濾器說明:

自動檢測裁剪尺寸。
它計算必要的裁剪參數並通過日志系統打印推薦參數。
檢測到的尺寸對應於輸入視頻的非黑色區域。

這篇文章描述了使用 Linux 的cropdetect結果。

我想在 Windows 10 中使用它,並找到了這個例子
但它不工作...


以下代碼有效(使用 ffmpeg 版本 4.4.1-full_build-www.gyan.dev):

ffmpeg -hide_banner -i in.jpg -vf scale=1920:1080,setsar=1:1,cropdetect=skip=0 -t 1 -f null - 2>&1 | findstr /R /C:"crop=" > log.txt
for /F "tokens=14* delims= " %%i in (log.txt) do set crop=%%i
echo %crop%

使用%crop%和 FFmpeg 命令:

ffmpeg -y -i in.jpg -filter_complex "scale=1920:1080,setsar=1:1,%crop%,split[crp0][crp1];[crp0]scale=1920:1080,setsar=1:1,gblur=sigma=30[blur];[blur][crp1]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2" out.jpg

不寫入log.txt的批處理文件:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set count=1
for /F "tokens=2* delims==" %%F in ('"ffmpeg -hide_banner -i in.jpg -vf scale=1920:1080,setsar=1:1,cropdetect=skip=0 -t 1 -f null - 2>&1"') do (
  set var!count!=%%F
  set /a count=!count!+1
)
echo %var1%

ffmpeg -y -i in.jpg -filter_complex "scale=1920:1080,setsar=1:1,crop=%var1%,split[crp0][crp1];[crp0]scale=1920:1080,setsar=1:1,gblur=sigma=30[blur];[blur][crp1]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2" out.jpg
endlocal

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM