在批处理脚本中解析 ffmpeg 的cropDetect 值时遇到问题

问题描述 投票:0回答:1

我正在尝试编写这个脚本,它可以在目录中查找视频文件,自动删除黑条并转码为 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

这样我就可以在转码命令中调用它了。

提前致谢。

batch-file ffmpeg crop
1个回答
0
投票

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
,并且没有终端空间,因此可能不需要第二行。

© www.soinside.com 2019 - 2024. All rights reserved.