前言
原本是想着用Java 来做循环处理的。但想到批处理应该更简洁就网上搜索了下 “批处理for循环”。
也就有了一下的方法处理了。
不过用处不是很大,虽然能提取到关键帧,但和我业务需求还是存在差异的,比如,要提取产品拍摄视频中的高清图像,
虽然,图样比较清晰,但角度不行,最终还是只能用PR来截取。
以下是当时用的代码:
echo off
color 0A
::指定当前文件所在目录
set DIR=%~dp0
echo DIR=%DIR%
:: 参数 /R 表示需要遍历子文件夹,去掉表示不遍历子文件夹
:: %%f 是一个变量,类似于迭代器,但是这个变量只能由一个字母组成,前面带上%%
:: 括号中是通配符,可以指定后缀名,*.*表示所有文件
:: %%~nxI,表示仅将 %I 扩充到一个文件名和扩展名,不包含路径)
:: 第一层循环遍历所有子文件夹下的文件,第二层循环提取文件名(包含扩展名.xxx),
:: 第三层循环分割文件名和扩展名,提取文件名(不包含扩展名)
for /R %%x in (*.mp4) do (
echo %%x
for %%a in ("%%x") do (
echo %%~nxa
for /f "tokens=1,* delims=." %%i in ("%%~nxa") do (
echo %%i
mkdir "%DIR%out\%%i"
ffmpeg -i "%%x" -filter:v select="eq(pict_type\,I)" -vsync 2 -f image2 "%DIR%out\%%i\Core_%%05d.png"
)
)
)
@pause
需要注意的是
ffmpeg -i "%%x" -filter:v select="eq(pict_type\,I)" -vsync 2 -f image2 "%DIR%out\%%i\Core_%%05d.png"
ffmpeg -i "源文件" -filter:v select="eq(pict_type\,I)" -vsync 2 -f image2 "输出文件所在位置"
之所以给源文件和输出文件带上""——双引号(英文),是为了防止文件(文件夹)包含特殊符号或空格。