[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 求教视频文件剪辑的批处理

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

评分人数

@523066680 感谢夸奖,但我还是觉得自己写得太臃肿了。自己是批处理小白,不知道怎么优化代码结构。

TOP

返回列表