CMD批处理脚本+VBScript脚本+Potplayer 实现文件夹内所有视频的截图任务(指定时间点)

实现自动化视频截图,一般会直接借视频编解码如FFmpeg,动用相关函数来实现,直接从解码源头设计程序。然而我没有接触过FFmpeg,借助cmd批处理,以及vbs,还有现成的播放器potplayer,一样可以实现。

 

【思路】

查找特定文件夹内所有的视频,每个视频使用potplayer打开,使用视频播放器的功能,指定时间点,然后截屏,最后整理截图文件,修改文件名称。

 

【逐步编写】

首先执行.bat(screenshot.bat),让其每个视频对象对应执行一个vbs脚本(sendkeys.vbs),等所有视频处理完毕,最后整理文件名称,执行另一个.bat(rename.bat)

 

screenshot.bat:

要对所有视频执行操作,需要遍历,使用for语句:

for %%v in (*.mp4) do (         :: ...... }

运行potplayer:

start "" "%potplayer_path%" "%%v"

执行.vbs:

cscript //nologo "%vbs_path%" "%screenshot_time%"

调用另一个.bat:

call rename.bat "%output_dir%" "%screenshot_time%"

 

sendkeys.vbs:

读取参数:

screenshot_time = WScript.Arguments(0)

创建WshShell对象:

Dim WshShell Set WshShell = WScript.CreateObject("WScript.Shell")

模拟按键输入,如按下G:

WshShell.SendKeys "g"

 

rename.bat:

获取传入的参数:

set "folderPath=%~1" set "screenshot_time=%~2"

遍历文件夹内所有文件,并做修改文件名的任务:

for %%a in ("%folderPath%*.jpg") do (   for /f "tokens=1 delims=." %%b in ("%%~na") do (     ren "%%a" "%%b_%screenshot_time_formatted%.jpg"   ) )

 

【完整代码】

screenshot.bat:

@echo off title PotPlayer 自动截图脚本  :: 设置变量 set "potplayer_path=C:Program FilespotplayerPotPlayer64PotPlayerMini64.exe" set "output_dir=%~dp0screenshots"  :: 输出目录为脚本所在目录下的 screenshots 文件夹 set "vbs_path=%~dp0sendkeys.vbs" :: vbs脚本地址 set "screenshot_time=00:03:20.0" :: 设置截图时间点  :: 创建输出目录 if not exist "%output_dir%" mkdir "%output_dir%"   :: 美化窗口 echo **************************************** echo =========自动截图脚本==================== echo 警告: 必须切换至英文输入法状态,之后运行 echo 截图输出目录:%output_dir% echo 设定的截取时间点:%screenshot_time% echo ========================================  :: 按任意键继续,为了确保输入法状态 pause   :: 使用 for 循环查找所有 mp4 文件 for %%v in (*.mp4) do (     echo.     echo 正在处理视频:%%v     REM set "video_name=%%~nv"  :: 获取不带扩展名的文件名      :: 构造截图文件名     REM set "screenshot_path=%output_dir%%screenshot_name%"      :: 启动 PotPlayer 并播放视频     echo 启动 PotPlayer...     start "" "%potplayer_path%" "%%v"      :: 延时 4 秒,等待 PotPlayer 启动     echo 延时 4 秒...     timeout /t 4 /nobreak > nul      :: 调用 VBScript 模拟按键     echo 模拟按键操作...     cscript //nologo "%vbs_path%" "%screenshot_time%"      echo.     echo 视频 %%v 处理完成,截图已保存到: %output_dir% )  echo. echo 所有视频处理完毕!  :: 调用 rename.bat,并将 output_dir 作为参数传入 call rename.bat "%output_dir%" "%screenshot_time%"  pause

sendkeys.vbs:

' sendkeys.vbs Option Explicit  ' 获取参数 Dim objArgs, screenshot_time Set objArgs = WScript.Arguments  screenshot_time = WScript.Arguments(0)  ' 创建 WshShell 对象 Dim WshShell Set WshShell = WScript.CreateObject("WScript.Shell")  ' 延时 0.5 秒,确保 PotPlayer 窗口激活 WScript.Sleep 500  ' 模拟按下空格键暂停 WshShell.SendKeys " " WScript.Sleep 500  ' 模拟按下 G 键,显示跳转对话框 WshShell.SendKeys "g" WScript.Sleep 500  ' 输入  时间点 WshShell.SendKeys screenshot_time  WScript.Sleep 500  ' 模拟按下 Enter 键,跳转到指定时间 WshShell.SendKeys "{ENTER}" WScript.Sleep 500  ' 模拟按下 Alt+C WshShell.SendKeys "%c" WScript.Sleep 500  ' 模拟按下 Ctrl+E,截图 WshShell.SendKeys "^e" WScript.Sleep 500  ' 模拟按下 Alt+F4 关闭 PotPlayer WshShell.SendKeys "%{F4}" WScript.Sleep 500  ' 清理对象 Set WshShell = Nothing Set objArgs = Nothing

rename.bat:

@echo off setlocal  :: 获取传入的文件夹路径和时间参数 set "folderPath=%~1" set "screenshot_time=%~2"   :: 检查文件夹路径是否为空 if "%folderPath%"=="" (   echo 错误:未提供文件夹路径!   pause   exit /b 1 )  :: 将时间格式转换为文件名格式【把:和. 两个字符 替换成下划线_】 set "screenshot_time_formatted=%screenshot_time::=_%" set "screenshot_time_formatted=%screenshot_time_formatted:.=_%"   for %%a in ("%folderPath%*.jpg") do (   for /f "tokens=1 delims=." %%b in ("%%~na") do (     ren "%%a" "%%b_%screenshot_time_formatted%.jpg"   ) )  echo 文件重命名完成! endlocal

注意,这三个脚本放在同一目录下。

 

【结果】

CMD批处理脚本+VBScript脚本+Potplayer 实现文件夹内所有视频的截图任务(指定时间点)

CMD批处理脚本+VBScript脚本+Potplayer 实现文件夹内所有视频的截图任务(指定时间点)

【结尾】

比较综合的运用,涉及到传参,cmd和vbs的联合调用。实际上一开始笔者想尝试直接通过命令行控制播放器,无奈不能抓取播放器对象,在一个播放器中执行多个命令,放弃了。虽然调用了三个脚本程序,但最终还是能实现,可歌可泣,花了不少精力的。当然,程序还有很多bug,需要慢慢优化,如,如何避免中文输入法的干扰,再如如何终止模拟键鼠操作,还有原有的截图文件的智能识别和过滤。同时,脚本设计上很多参数可以以传参的形式变成动态读取、导入。

 

cmd和vbs的联合,应该说这篇博文给了一个例子,希望可以给后辈参考。

 

发表评论

评论已关闭。

相关文章