从某热门视频网站下载成套电视剧,准备剪辑去掉片头和片尾、按剧集名排序命名文件、剪切视频至优盘好给动手能力差的父母在机顶盒上连续播放。
第一稿:- @cls
- @echo off
- title 视频处理
-
- ::设置剧集
- set n=剧集名
- set /p a=起始剧集号:
- set /p b=终止剧集号:
-
- ::设置开始时间
- set d=95.000
-
- ::设置结束时间整数扣除
- set e=150
-
- ::提取时间到文本
- for /l %%i in (%a%,1,%b%) do (
- rename %n%第%%i集*.flv %%i.flv
- .\bin\ffprobe -v quiet -show_entries format=duration -i %%i.flv>%%i-fm.log
- findstr /c:"duration=" %%i-fm.log>%%i-du.log
- )
-
- ::输出时间整数到文本
- for /l %%i in (%a%,1,%b%) do (
- for /f "delims=" %%j in (%%i-du.log) do (
- set "str=%%j"&setlocal enabledelayedexpansion
- echo;!str:~9,4!&endlocal
- )>%%i-整数.log
- )
-
- ::输出时间小数到文本
- for /l %%i in (%a%,1,%b%) do (
- for /f "delims=" %%j in (%%i-du.log) do (
- set "str=%%j"&setlocal enabledelayedexpansion
- echo;!str:~14,3!&endlocal
- )>%%i-小数.log
- )
-
- ::生成视频并清理
- for /l %%i in (%a%,1,%b%) do (
- setlocal enabledelayedexpansion
- set /p f=<%%i-整数.log
- set /a g=f-e
- set /p h=<%%i-小数.log
- if %%i leq 9 (set j=0%%i) else (set j=%%i)
- start /wait .\bin\ffmpeg.exe -v quiet -ss %d% -to !g!.!h! -accurate_seek -i %%i.flv -codec copy -avoid_negative_ts 1 %n%-!j!.mp4
- if exist %n%-!j!.mp4 (
- del %%i*.log /q
- del %%i.flv /q
- del %n%第%%i集*.qsv /q
- )
- endlocal
- )
- pause
-
- ::剪切文件
- echo 剪切文件
- set /p k=目标路径:
- if not exist %k%\%n%\ (md %k%\%n%)
- for /l %%i in (%a%,1,%b%) do (
- setlocal enabledelayedexpansion
- if %%i leq 9 (set l=0%%i) else (set l=%%i)
- start /wait xcopy %n%-!l!.mp4 %k%\%n%\ /q /v
- if exist %k%\%n%\%n%-!l!.mp4 (del %n%-!l!.mp4 /q)
- endlocal
- )
- pause
复制代码 在论坛学习了几天,优化了一下,第二稿:- @cls
- @echo off
- title 视频处理
- color a0
-
- ::设置剧集
- set n=剧集名
- set /p a=起始剧集号:
- set /p b=终止剧集号:
-
- ::设置片头时间
- set s=95.000
-
- ::设置片尾时间
- set ec=150.000
-
- ::提取时间、剪辑视频、清理文件
- for /l %%a in (%a%,1,%b%) do (
- if not exist %n%第%%a集*.flv (echo 无可剪辑视频...&pause>nul&exit) else (
- ren %n%第%%a集*.flv %%a.flv
- .\bin\ffprobe -v quiet -show_entries format=duration -i %%a.flv>%%a.log
- setlocal enabledelayedexpansion
- for /f "eol=[ delims=duration=" %%b in (%%a.log) do (
- set e=%%b
- set e0=!e:~0,-7!
- set e1=!e:~-6,-3!
- set /a ed=!e0!!e1!-%ec:~0,-4%%ec:~-3%
- set /a ed0=!ed!/1000
- set /a ed1=!ed!%%1000
- if %%a leq 9 (set c=0%%a) else (set c=%%a)
- start /wait .\bin\ffmpeg.exe -v quiet -ss %s% -to !ed0!.!ed1! -accurate_seek -i %%a.flv -codec copy -avoid_negative_ts 1 %n%-!c!.mp4
- if exist %n%-!c!.mp4 (
- del %%a.log /q
- del %%a.flv /q
- del %n%第%%a集*.qsv /q
- )
- )
- endlocal
- )
- )
- echo 视频剪辑完毕...&pause>nul
-
- ::剪切文件
- echo 剪切文件
- set /p dir=目标路径:
- if not exist %dir%\%n%\ (md %dir%\%n%)
- for /l %%a in (%a%,1,%b%) do (
- setlocal enabledelayedexpansion
- if %%a leq 9 (set c=0%%a) else (set c=%%a)
- start /wait xcopy %n%-!c!.mp4 %dir%\%n%\ /q /v
- if exist %dir%\%n%\%n%-!c!.mp4 (del %n%-!c!.mp4 /q)
- endlocal
- )
- echo 文件剪切完毕...&pause>nul
-
复制代码 经自我测试,两稿程序均可正常执行。
测试第二稿已是绞尽脑汁了,求助各位,能否进一步优化代码?
诸如“剧集名第??集*.flv"这样的文件集合,怎样编写for语句实现:
1、自动获取剧集名到变量;
2、将??作为序号获取到变量,而不是要手动去输入起止变量a和b。
PS:start /wait防止目标未生成就被干掉源文件,但有恼人的额外弹窗,有没有好办法达到目的而不弹窗。 |