ffmpeg -ss start_time -to end_time -i input.mp4 output.mp4
FFmpeg "-c copy" 切割视频快速又无损,但是只精确到关键帧;普通切割视频精确到帧但需要整段全部重新编码,既耗时又损失了点画质。
那么有没有办法能只重新编码两头分割点到最近的关键帧而中段直接复制呢?合并视频不太用重新编码,这样既精准又省时又不用全部重新编码,我想这是能手动做到的,那么有没有方便快捷的方法能做到这点呢?我没有搜索到相关的方法,所以在此请教各位程序员大佬,谢谢!
不如说你到底什么视频?这种情况下我一般建议直接从源入手,就是mp4之前更原生的档来剪
顺便问下其他的编码格式比如VP9、AV1也会出现这样的情况吗?
花的情况通常是因为丢了帧,尤其在丢了屏幕大变的关键帧的情况下,就会把后一段的运动套上前一段的画面
退一步说,如果你最后没找到ffmpeg的简单操作,可以曲线救国,读取第一次操作产生的edit list偏移然后手动重编码……
https://gist.github.com/jerrylus ... 24af3f1461cf907f140
但问题是似乎依然没法正常工作,就算找出了最近的关键帧,用 ffmpeg 切的时候依然不精确,导致最后拼起来的片段拼接的地方会有问题
这个列出关键帧时间列表的代码我跑出来的是空的换行符
pts, dts, start time、key帧/I帧区别之类的,外加各种格式的各自的兼容等,乱七八糟的问题非常多,
切完了concat也有一堆事情要注意,不是深耕视频多年不推荐碰
我粗略看了下你的脚本,在ffmpeg_encode_cut是用的先-i后-ss应该问题不大,但是为啥ffmpeg_stream_copy_cut变成了先-ss再-i了。这两种seek方式在ffmpeg里的实现是不太一样的,平时区别不大但是如果要逐帧切割可能会导致问题,推荐统一成先读取再seek的方式试试(另外ffmpeg记得用最新版否则有bug)
很多收费软件也不是白收费的,楼主如果刚需推荐直接购买 TMPGEnc MPEG Smart Renderer
对视频编码只有一些基础了解,stream_copy 那里似乎是因为我本地测试的时候,如果先 -i 再 -ss (output seeking),似乎会导致第一个关键帧提取不到,行为有些诡异。但是反过来(input seeking)行为就符合预期了。但无论如何,拼接起来的时候还是会有问题(存在部分重叠),更别提交界处码率差异导致的画质显著变化了。我本地测试的版本是 4.3.2,似乎已经是一年前的版本了。
可能 op 的确还是直接上商业的解决方案更好一些。
另外还有经典的崩溃问题
怪不得我很久都没用这软件了(我自己都忘记原因了