我正在尝试编写这个脚本,它可以在目录中查找视频文件,自动删除黑条并转码为 x265...
@echo off
setlocal enabledelayedexpansion
REM Loop through all video files in the current directory
for %%F in (*.mp4, *.avi, *.mkv, *.ts) do (
echo Processing "%%F"
REM Use FFMPEG to detect crop values
for /f "tokens=*" %%a in ('ffmpeg -i "%%F" -vf "cropdetect" -f null - 2^>^&1 ^| find /i "crop="') do (
set cropfilter=%%a
)
REM Extract the crop filter result
set cropfilter=!cropfilter:*crop=!
set cropfilter=!cropfilter: =!
REM Use the detected crop filter to crop the video
if not "!cropfilter!"=="" (
echo Detected crop filter: !cropfilter!
ffmpeg -i "%%F" -map 0:v:0 -map 0:a:0 -map 0:s? -c:v:0 libx265 -crf 18 -vf "crop=!cropfilter!" -c:a:0 aac -ac 2 -b:a:0 256k -c:a:1 aac -ac 6 -b:a:1 512k -c:s copy "encoded.mkv"
) else (
echo No cropping needed for "%%F".
)
)
echo Processing complete.
pause
我正在努力正确解析初始 ffmpeg 查询输出的裁剪值。目前它抓住的是:
detect_0@000001ce4b0e2040]x1:0x2:1919y1:131y2:948w:1920h:816x:0y:132pts:625483604t:6949.817822limit:0.094118crop=1920:816:0:132
当我真的只需要这一点时:
crop=1920:816:0:132
这样我就可以在转码命令中调用它了。
提前致谢。
将
cropfilter
设置为 nothing 后,我建议您对代码进行以下修改:
...
set "cropfilter=%%a"
)
REM Extract the crop filter result
set "cropfilter=!cropfilter:*crop=crop!"
set "cropfilter=!cropfilter: =!"
...
使用
set "var=value"
设置字符串值 - 这可以避免尾随空格引起的问题。不要分配 "
或终端反斜杠或空格。从元素构建路径名 - 与直觉相反,它可能会使过程变得更容易。如果使用语法 set var="value"
,则引号将成为分配值的一部分。
注意:您的线路
set cropfilter=!cropfilter:*crop=!
将删除 之前的所有字符,包括
crop
产生 =1920:816:0:132
AND 代码行包含一个终止空格,因此该空格将包含在值中
set
。
因此 - 替换行将用 crop
替换
之前的所有字符,包括
crop
,并且没有终端空间,因此可能不需要第二行。