实现自动化视频截图,一般会直接借视频编解码如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 Files\potplayer\PotPlayer64\PotPlayerMini64.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和vbs的联合调用。实际上一开始笔者想尝试直接通过命令行控制播放器,无奈不能抓取播放器对象,在一个播放器中执行多个命令,放弃了。虽然调用了三个脚本程序,但最终还是能实现,可歌可泣,花了不少精力的。当然,程序还有很多bug,需要慢慢优化,如,如何避免中文输入法的干扰,再如如何终止模拟键鼠操作,还有原有的截图文件的智能识别和过滤。同时,脚本设计上很多参数可以以传参的形式变成动态读取、导入。

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

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

  1. 19.3.20 cmd操作:1.dir查看当前文件夹内的文件;2.alt+space+c关闭cmd窗口

    cmd操作记录: 1.dir:查看当前文件夹内的所有文件: 2.alt+space+c:关闭打开的cmd窗口:

  2. 写个批处理脚本来帮忙干活--遍历文件夹&字符串处理

    这次打算写几篇关于脚本方面的博客,主要是记录一下 Gradle 脚本和批处理脚本的一些写法,方便后续查阅. 前言 平常开发过程中,一些较为重复的手工性工作,如果能让脚本来帮忙处理,自然是最好的,刚好之 ...

  3. apache环境下禁止某文件夹内运行PHP脚本、禁止访问文件或目录执行权限的设置方法

    apache环境下禁止某文件夹内运行PHP脚本.禁止访问文件或目录执行权限的设置方法   首先我们来看两段对上传目录设置无权限的列子,配置如下: <Directory "要去掉PHP执 ...

  4. 批量生成文件夹内所有文件md5

    说明:md5批量生成批处理脚本,无需安装任何软件,直接调用系统文件进行生成,简单基于windows命令编写了一个批量生成md5值的脚本. 使用说明:新建文本文档,命名为get_md5.bat,直接将代 ...

  5. 用Python来实现列举某个文件夹内所有的文件列表

    用Python来实现列举某个文件夹内所有的文件列表.吾八哥我动手写代码之前分析了下,遍历一个文件夹,肯定是需要用到os模块了,查阅模块帮助信息,可知os.listdir()方法可以列举某个文件夹内的所 ...

  6. ftp下载目录下所有文件及文件夹内(递归)

    ftp下载目录下所有文件及文件夹内(递归)   /// <summary> /// ftp文件上传.下载操作类 /// </summary> public class FTPH ...

  7. MediaPlayer 播放assets 文件夹下面的视频报错

    Android MediaPlayer 播放assets 文件夹下面的视频报错 报下面的错: java.io.FileNotFoundException: This file can not be o ...

  8. Linux如何修改文件/文件夹内所有文件的权限

    一.修改文件权限 修改文件权限前,需要了解一下权限中的”rwx”与数字的对应关系,其中r=4,w=2,x=1. 例如:”drwxr-xr-x”,第一个”d”是代表文件夹,这里不用考虑,后面九个字符,每 ...

  9. Linux批量替换文本,文件夹内所有文本内容

    1.替换文件夹内所有文件匹配的字符串 sed -i "s/旧内容/新内容/g" `grep 旧内容 -rl 文件夹路径` 例如将/var/www/test文件夹下的所有文件内容中的 ...

  10. 安装bootcamp时提示“找不到$winpedriver$文件夹,请验证该文件夹是否和bootcamp处于同一文件夹内?”

    问题:我苹果系统是10.8.3的 装的win7 64位的! 这个bootcamp是我在别人那里拷贝的,我装的时候就这样了,但是别人装是好好的,还有我在MAC系统下载bootcamp的时候我的U盘格式是 ...

随机推荐

  1. 走向更强的 Literal 的时代

    正如 声明式编程的没落 - Inshua - 博客园 分析,声明式编程由于不符合软件工程需要,实际上正在淘汰,但与此同时,它的特征被过程式编程吸收为了Literal,中文翻译字面量. 什么是 Lite ...

  2. django静态文件、form表单和request对象

    目录 一.静态文件 1.静态文件概念 2.资源访问 3.静态文件资源访问 二.静态文件相关配置 1.接口前缀 2.接口前缀动态匹配 三.form表单 action属性 method属性 四.reque ...

  3. Unable to find Mach task port for process-id : (os/kern) failure (0x5). (please check gdb is codesi

    (gdb) runStarting program: /Users/lurongming/test/cpptest/mainUnable to find Mach task port for proc ...

  4. linux服务器清理指定日期所有垃圾日志文件

    阿里云服务器推荐购买99元 硬盘再大,也架不住日志文件多. 1.找到并清除30天前的所有日志文件. find / -name "*.log" -mtime +30 -exec rm ...

  5. Solution -「POI 2013」LAB-Maze

    \(\mathscr{Description}\)   Link.   构造一个边平行与坐标轴, 顶点是整点, 相邻边互相垂直, 且逆时针遍历顶点时转向 (向左或向右) 符合给定字符串的不自交多边形. ...

  6. 「V 曲闲谈」《hello&bye,days》——记这周

      这周破事儿浓度真的,情绪渗透压巨大失调.   完全没有曲析啊喂,顶多当个阅读时 BGM.() 两度失眠   "砰--"   朦胧之中看见斜上方的室友起身.   "砰- ...

  7. 《CUDA编程:基础与实践》读书笔记(3):同步、协作组、原子函数

    1. 单指令多线程模式 从硬件上看,一个GPU被分为若干个SM.线程块在执行时将被分配到还没完全占满的SM中,一个线程块不会被分配到不同的SM中,一个SM可以有一个或多个线程块.不同线程块之间可以并发 ...

  8. ABP 系列总结

    2019年第一次接触 ABP 框架,那时候还是比较笨重的旧版本的,后来升级到 vNext 版本,我也基于 ABP 模块化的设计方式开发了一些模块用于日常工作.这个系列主要为了系统地记录一下日常工作与学 ...

  9. springboot+springsecurity项目

    https://blog.csdn.net/qq_36748248/article/details/120932954 https://blog.csdn.net/weixin_41207479/ar ...

  10. Shenzi pg walkthrough Intermediate window

    nmap └─# nmap -p- -A -sS -T5 192.168.218.55 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-16 ...