[Shell] 纯文本查看 复制代码 @echo off
setlocal enabledelayedexpansion
REM 设置 ffmpeg 和 ffprobe 的路径
set ffmpeg_path="C:\path\to\ffmpeg.exe"
set ffprobe_path="C:\path\to\ffprobe.exe"
REM 创建输出目录
if not exist "video\output\" mkdir "video\output"
REM 遍历 video 文件夹下的所有 mp4 文件
for %%f in (video\*.mp4) do (
set "input_file=%%f"
set "output_file=video\output\%%~nf_output.mp4"
REM 获取视频信息
for /f "tokens=2 delims==" %%a in ('%ffprobe_path% -hide_banner -show_format -show_streams "!input_file!" ^| find "duration="') do set "time=%%a"
for /f "tokens=2 delims==" %%a in ('%ffprobe_path% -hide_banner -show_format -show_streams "!input_file!" ^| find "width="') do set "width=%%a"
for /f "tokens=2 delims==" %%a in ('%ffprobe_path% -hide_banner -show_format -show_streams "!input_file!" ^| find "height="') do set "height=%%a"
REM 计算 gif 和 box 的尺寸
set /a gif_h=!height!/30
set /a gif_w=!gif_h!
set /a box_w=!width!-!gif_w!/2
set /a box_h=!gif_h!
REM 设置 gif 文件路径
set "gif=input.gif"
REM 执行 ffmpeg 命令
%ffmpeg_path% -i "!input_file!" -c:v libx264 -filter_complex "color=EEA9B8@0.2:!box_w!x!box_h![box];movie=!gif!:loop=0,setpts=N/FRAME_RATE/TB,scale=!gif_w!x!gif_h! [mov];[0:v][box]overlay=shortest=1:x=t/!time!*(W-!gif_w!)-(w-!gif_w!/2):y=H-h[cache];[cache][mov]overlay=x=(W-w)*t/!time!:y=H-h" -c:a copy -shortest "!output_file!"
)
echo 处理完成
pause
解释脚本- 设置环境变量:脚本首先设置了 ffmpeg 和 ffprobe 的路径。请根据您的实际安装路径进行修改。
- 创建输出目录:如果 video\output 目录不存在,则创建它。
- 遍历文件:使用 for 循环遍历 video 文件夹下的所有 .mp4 文件。
- 获取视频信息:使用 ffprobe 获取视频的时长、宽度和高度。
- 计算尺寸:根据获取的视频信息计算 gif 和 box 的尺寸。
- 执行 ffmpeg 命令:使用 ffmpeg 处理视频文件,并将结果输出到 video\output 目录。
3. 注意事项- 路径问题:确保 ffmpeg 和 ffprobe 的路径正确,并且 video 文件夹和 input.gif 文件存在。
- 权限问题:确保脚本在运行时有足够的权限访问和修改文件。
- 性能问题:批处理脚本在处理大量文件时可能会比较慢,建议在测试时先处理少量文件。
将上述脚本保存为 .bat 文件,然后在命令提示符中运行它,即可批量处理 video 文件夹下的所有 .mp4 文件。
[Shell] 纯文本查看 复制代码 @echo off
setlocal enabledelayedexpansion
REM 设置 ffmpeg 和 ffprobe 的路径
set ffmpeg_path="C:\path\to\ffmpeg.exe"
set ffprobe_path="C:\path\to\ffprobe.exe"
REM 创建输出目录
if not exist "video\output\" mkdir "video\output"
REM 遍历 video 文件夹下的所有 mp4 文件
for %%f in (video\*.mp4) do (
set "input_file=%%f"
set "output_file=video\output\%%~nf_output.mp4"
REM 获取视频信息
for /f "tokens=2 delims==" %%a in ('%ffprobe_path% -hide_banner -show_format -show_streams "!input_file!" ^| find "duration="') do set "time=%%a"
for /f "tokens=2 delims==" %%a in ('%ffprobe_path% -hide_banner -show_format -show_streams "!input_file!" ^| find "width="') do set "width=%%a"
for /f "tokens=2 delims==" %%a in ('%ffprobe_path% -hide_banner -show_format -show_streams "!input_file!" ^| find "height="') do set "height=%%a"
REM 计算 gif 和 box 的尺寸
set /a gif_h=!height!/30
set /a gif_w=!gif_h!
set /a box_w=!width!-!gif_w!/2
set /a box_h=!gif_h!
REM 设置 gif 文件路径
set "gif=input.gif"
REM 执行 ffmpeg 命令
%ffmpeg_path% -i "!input_file!" -c:v libx264 -filter_complex "color=EEA9B8@0.2:!box_w!x!box_h![box];movie=!gif!:loop=0,setpts=N/FRAME_RATE/TB,scale=!gif_w!x!gif_h! [mov];[0:v][box]overlay=shortest=1:x=t/!time!*(W-!gif_w!)-(w-!gif_w!/2):y=H-h[cache];[cache][mov]overlay=x=(W-w)*t/!time!:y=H-h" -c:a copy -shortest "!output_file!"
)
echo 处理完成
pause
注意事项和改进点- 数学运算:
- 确保所有的数学运算都正确。批处理脚本中的数学运算可能会受到整数除法的影响,导致结果不准确。可以使用浮点数运算库(如 bc)来提高精度,但需要在 Windows 上找到合适的替代方案。
- 变量处理:
- 使用 setlocal enabledelayedexpansion 和 !variable! 来正确处理循环中的变量。
- 路径和文件名:
- 确保 ffmpeg 和 ffprobe 的路径正确,并且 video 文件夹和 input.gif 文件存在。
- 错误处理:
- 添加错误处理机制,以便在出现问题时能够捕获并报告错误。
测试和调试- 单个文件测试:
- 先对单个文件进行测试,确保脚本能够正确处理该文件。
- 日志记录:
- 添加日志记录功能,将关键步骤的输出记录到日志文件中,以便调试和分析。
- 逐步执行:
- 逐步执行脚本,检查每个步骤的输出,确保每个变量和计算结果都符合预期。
示例日志记录
[Shell] 纯文本查看 复制代码 @echo off
setlocal enabledelayedexpansion
REM 设置 ffmpeg 和 ffprobe 的路径
set ffmpeg_path="C:\path\to\ffmpeg.exe"
set ffprobe_path="C:\path\to\ffprobe.exe"
REM 创建输出目录
if not exist "video\output\" mkdir "video\output"
REM 遍历 video 文件夹下的所有 mp4 文件
for %%f in (video\*.mp4) do (
set "input_file=%%f"
set "output_file=video\output\%%~nf_output.mp4"
REM 获取视频信息
for /f "tokens=2 delims==" %%a in ('%ffprobe_path% -hide_banner -show_format -show_streams "!input_file!" ^| find "duration="') do set "time=%%a"
for /f "tokens=2 delims==" %%a in ('%ffprobe_path% -hide_banner -show_format -show_streams "!input_file!" ^| find "width="') do set "width=%%a"
for /f "tokens=2 delims==" %%a in ('%ffprobe_path% -hide_banner -show_format -show_streams "!input_file!" ^| find "height="') do set "height=%%a"
REM 计算 gif 和 box 的尺寸
set /a gif_h=!height!/30
set /a gif_w=!gif_h!
set /a box_w=!width!-!gif_w!/2
set /a box_h=!gif_h!
REM 设置 gif 文件路径
set "gif=input.gif"
REM 记录日志
echo Input File: !input_file! >> log.txt
echo Time: !time! >> log.txt
echo Width: !width! >> log.txt
echo Height: !height! >> log.txt
echo Gif Height: !gif_h! >> log.txt
echo Gif Width: !gif_w! >> log.txt
echo Box Width: !box_w! >> log.txt
echo Box Height: !box_h! >> log.txt
REM 执行 ffmpeg 命令
%ffmpeg_path% -i "!input_file!" -c:v libx264 -filter_complex "color=EEA9B8@0.2:!box_w!x!box_h![box];movie=!gif!:loop=0,setpts=N/FRAME_RATE/TB,scale=!gif_w!x!gif_h! [mov];[0:v][box]overlay=shortest=1:x=t/!time!*(W-!gif_w!)-(w-!gif_w!/2):y=H-h[cache];[cache][mov]overlay=x=(W-w)*t/!time!:y=H-h" -c:a copy -shortest "!output_file!"
)
echo 处理完成
pause
|