You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:批处理脚本中无法正确解析FFmpeg cropdetect输出值

解决FFmpeg cropdetect输出提取问题

问题分析

你的批处理脚本当前会捕获包含crop=的整行日志,但实际需要的是crop=后的参数值用于crop滤镜。原字符串处理逻辑会得到带前置等号的内容,导致滤镜参数错误。

修改后的完整脚本

以下是修复后的批处理代码,重点优化了crop参数的提取逻辑:

@echo off
setlocal enabledelayedexpansion

REM 遍历当前目录下的所有目标视频文件
for %%F in (*.mp4, *.avi, *.mkv, *.ts) do (
    echo Processing "%%F"
    set "cropfilter="
    set "line="

    REM 调用FFmpeg检测黑边,捕获最后一行包含crop=的日志(最后一行结果最稳定)
    for /f "tokens=*" %%a in ('ffmpeg -i "%%F" -vf "cropdetect" -f null - 2^>^&1 ^| find /i "crop="') do (
        set "line=%%a"
    )

    REM 提取crop参数值
    if defined line (
        set "cropfilter=!line:*crop=!"
        rem 移除开头的等号
        set "cropfilter=!cropfilter:~1!"
        rem 移除可能存在的空格
        set "cropfilter=!cropfilter: =!"
    )

    REM 执行带裁剪的转码
    if not "!cropfilter!"=="" (
        echo Detected crop filter: crop=!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_%%~nF.mkv"
    ) else (
        echo No cropping needed for "%%F".
    )
)

echo Processing complete.
pause

关键修改说明

  1. 保留最后一行检测结果:通过循环覆盖line变量,确保最终使用的是视频后期的稳定黑边检测值(最准确)
  2. 精准提取参数:
    • 用!line:*crop=!剔除crop=之前的所有日志内容,得到=1920:816:0:132格式的字符串
    • 用!cropfilter:~1!移除开头的等号,得到纯参数值1920:816:0:132
    • 移除字符串内可能存在的空格,避免滤镜参数解析错误
  3. 避免文件覆盖:将输出文件名改为encoded_%%~nF.mkv,每个源文件对应独立的输出文件

内容的提问来源于stack exchange,提问作者user487787

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 04:55:04