程序 FFmpeg 准确切割视频问题,请大神指教?

2021-11-30 09:58:49 +08:00
 qin20

如题,我在项目开发过程中,使用 FFmpeg 来批量处理视频,但是发现 FFmpeg 剪切的视频并不能按照传参的开始时间和结束时间去切割视频,原因是关键帧的问题,比如我需要切割 5 到 7 秒的视频片段

ffmpeg -i a.mp4 -ss 00:00:05 -to 00:00:07 -c copy -o out.mp4

FFmpeg 会自动寻找5秒和7秒附近的关键帧,并从关键帧的位置去切割,导致视频最终的时间可能是00:00:04 ~ 00:00:06这种,导致切出来的视频有时候声音被切了一半

我知道在切割的时候使用重新编码可以准确切割,但是重新编码遇到几个 G 的视频文件时,切割两秒的视频,就需要处理好几分钟,在批量切割的需求下(几百个视频片段),完全达不到性能要求

我想知道这几个问题:

  1. 有没有一款软件可以替代 FFmpeg 实现准确切割的功能
  2. 如果使用 FFmpeg ,能不能拿到 FFmpeg 它实际切割的关键帧的时间,这样方便我快速重新编码调整切割的误差
9550 次点击
所在节点    FFmpeg
67 条回复
cxbig
2021-11-30 21:11:42 +08:00
如果不考虑用其他 GUI 软件,只用 ffmpeg
可以考虑把参数精确到毫秒,然后开头和结尾只剪出 5 秒左右用来确认关键帧和音频位置,再算总长度做完整的剪切。
tcp
2021-12-01 00:41:15 +08:00
一般这种需求直接 ffmpeg 解出 yuv ,算出需要的帧数,直接二进制截出来,然后 ffmpeg -vcodec libx264 压一遍,很快的。解决本质问题,比上面这些折腾都省事。
qin20
2021-12-01 02:07:30 +08:00
@tcp 我试试能不能局部解压,整个视频解压的话,体积大,时间也久
qin20
2021-12-01 02:09:12 +08:00
@mxalbert1996 不是不行,是很慢。。。几个 g 的视频相当于每次切都重新编码
qin20
2021-12-01 02:20:09 +08:00
@mxalbert1996 这么说吧,input seeking 快但是切割时间不准确,output seeking 准确但是耗时久,两种我都试了,都有各种问题
tcp
2021-12-01 08:23:10 +08:00
@qin20 根据帧率和时间计算要解码的帧数,ffmpeg 解码时会打印帧数,到了就 ctrl-c 停掉即可。
rosu
2021-12-01 12:20:35 +08:00
可以参考我在下面帖子里的回答。先看 ffmepg 的文档吧。

https://www.v2ex.com/t/808095

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/818943

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX