[批处理]视频去片头片尾

需要:FFmpeg(放到脚本所在目录 或 添加到环境变量)
作用:使用FFmpeg裁剪视频片头片尾(不转码)
适用场景:片头片尾长度固定,但视频长度不固定。
适合人群:PC性能吃鸡者、买不起正版又不用盗版的好人、找不到相应免费软件者…
使用:拖放/发送到 视频文件到该批处理/批处理的快捷方式,
如无意外将在同一目录生成 文件名_cut.文件后缀的剪切后视频。

批处理:

@echo off
rem ===================需手动设置===================
rem 设定片头片尾长度,格式为 HH:mm:ss.fff
set op=00:00:10.250
set ed=00:00:10.250
rem ================================================

rem 将HH:mm:ss.fff时间转换为毫秒
rem %var:~0,2%、%var:~3,2%、%var:~6,2%、%var:~9%分别对于HH、mm、ss、fff
rem (1%var:~x,y%-100)删掉数值前的0,以免被视为8进制数
set /a t_op=((((1%op:~0,2%-100) * 60 + (1%op:~3,2%-100)) * 60 + (1%op:~6,2%-100)) * 1000) + (1%op:~9%-1000)
set /a t_ed=(((1%ed:~0,2%-100) * 60 + (1%ed:~3,2%-100)) * 60 + (1%ed:~6,2%-100)) * 1000 + (1%ed:~9%-1000)

rem 获取视频长度
echo 正在读取视频长度
for /f "tokens=2 delims=, " %%a in ('ffmpeg.exe -i "%~1" 2^>^&1^|findstr /r /c:"^ *Duration:"') do set dur=%%a
if not defined dur goto error

rem 计算截取时间
set /a cut=(((1%dur:~0,2%-100) * 60 + (1%dur:~3,2%-100)) * 60 + (1%dur:~6,2%-100)) * 1000 + (1%dur:~9%0-1000) - t_op - t_ed
set cut=%cut:~0,-3%.%cut:~-3%
rem 截取视频
ffmpeg.exe -accurate_seek -ss %op% -t %cut% -i "%~1" -c copy -avoid_negative_ts 1 "%~dpn1_cut%~x1"
echo,
echo 操作完成,请按任意键退出.
timeout /t -1
exit

:error
echo 读取视频时长失败。
echo,
echo 请检查视频文件名是否含有特殊字符!
echo 请按任意键退出
timeout /t -1
exit

其他事项:

  1. 脚本中的op和ed分别为片头片尾时长(不是时刻),必须严格按照 HH:mm:ss.fff 格式填写,可以为0(00:00:00:000),即仅切片头/片尾。
    片尾时长=片长-片尾起点。精确的片长可以通过ffmpeg -i input.mp4获取(Duration:00:00:00.00)

  2. FFmpeg不转码切割基于关键帧而非精确时刻,所以切割点应该采用关键帧时间点
    关键帧时间取得方法(以PotPlayer为例):

  • F5/右键进入播放器设置
  • 播放→时间跨度→设为最小值1秒 并 勾选下方的 “如存在关键帧数据…"
  • 播放视频→暂停→按设为1秒的前进/后退快捷键定位到片头结束/片尾开始附近
  • 按G键/右键相应菜单项打开定位窗口→窗口显示时间即为当前关键帧时间

没多大意义的其他:
FFmpeg非转码切不准的原因:参见关键帧的存在意义
FFmpeg其他切割模式及参数:参见官方文档
FFmpeg精确切割的办法:转码(慢)
FFmpeg精确切割又不慢的办法:切割→局部转码(仅数帧)→拼接(有待验证,无期)

最后补充一句:
批处理就是个见鬼的落后玩意……

4 Likes

必须先点赞,后使用,另外这连天太懒,没录视频,晚点测试

你写一个支持拖拽文件导入,一件点击运行批处理的软件就不见鬼了,可能性是无限的

求教:
如果文件夹内很多个视频,视频总长时间不等,所有视频片头片尾时间一致,可以批量处理吗?截取中间的部分可以新建一个目录来存放吗? 如“已剪辑”文件夹?

请教一下,很多基于FFmpeg的批处理或者软件,不知道为什么基本都采用关键帧定位的方式。有时只想尽量无损的截取几秒钟的视频,正是因为关键帧定位的原因,无法实现精准切割。比如我常用的losslesscut,就有这个问题。若使用该软件的普通方式切割,又常会出现其他一些意想不到的问题。

我看您的帖子有简要说明局部转码可实现精准且较为快速的切割,引起了兴趣,但查阅了相关资料,发现修改人家的批处理,也是我能力范围之外的事情。

不知道您可不可以按照这篇文章留下的批处理的方式,做一个可以实现局部转码精准切割任何FFmpeg可支持的有声视频文件?那样的话,我只需要在PotPlayer中逐帧定位找到启示和结束的时间点填入,就能实现了。这也是很好的。

关键是,非编接触的少,而我接触到的绝大多数视频软件,无论免费付费,好用难用,基本没有一个可以实现losslesscut这样,无损快速切割或切割合并视频的工具了。

成本问题。
而且这个拖放问题是Windows的陈年老bug。

至于批处理的落后,并不是“做不到”,而是“无法/难以 直接做到”
08+1都不能直接计算出正确结果
浮点数无法直接运算
不直接支持函数
不能直接处理输入参数
仅仅是写上面这个脚本我就遇到了这四个问题,虽然这四个问题可以仅依靠批处理绕远路解决,然后脚本却要长好几倍

这工作量,还不如直接用autohotkey / powershell / python好了:joy:

我的意思是写个批处理运行的通用软件,支持加载各种别人写的批处理,允许直接拖拽添加操作对象文件,这样的鬼还是有用的鬼

+1

可以,上面批处理中片头片尾时间指的就是时长(而不是开始结束时间节点)

可以,给 ffmepg 命令增加一个参数,我记得是 -p 吧,可以设置输出位置。但如果没有对应位置还要涉及新建文件夹等命令。建议自己建好文件夹,然后添加对应参数。

如果你发现一个需求没有简单而免费的实现方式,那就说明这实现这一需求实际上挺难(麻烦)……