找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 20718|回复: 1

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

[复制链接]
发表于 2019-1-28 23:23:07 | 显示全部楼层 |阅读模式
从某热门视频网站下载成套电视剧,准备剪辑去掉片头和片尾、按剧集名排序命名文件、剪切视频至优盘好给动手能力差的父母在机顶盒上连续播放。
第一稿
  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
  50.        
复制代码
经自我测试,两稿程序均可正常执行。
测试第二稿已是绞尽脑汁了,求助各位,能否进一步优化代码?
诸如“剧集名第??集*.flv"这样的文件集合,怎样编写for语句实现:
1、自动获取剧集名到变量;
2、将??作为序号获取到变量,而不是要手动去输入起止变量a和b。
PS:start /wait防止目标未生成就被干掉源文件,但有恼人的额外弹窗,有没有好办法达到目的而不弹窗。

评分

参与人数 1PB +12 收起 理由
523066680 + 12 代码风格良好

查看全部评分

 楼主| 发表于 2019-1-29 10:54:44 | 显示全部楼层
@523066680 感谢夸奖,但我还是觉得自己写得太臃肿了。自己是批处理小白,不知道怎么优化代码结构。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 22:47 , Processed in 0.014522 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表