1 回答
TA贡献1836条经验 获得超5个赞
故障是因为您可能没有指定时间戳的关键帧。因为非关键帧编码与最近关键帧的差异,它们只显示与前一个关键帧的差异,这就是为什么它们非常有效的内存,但不一致。类似的理论也适用于音频,并且取决于编解码器/格式!
在核心 moviePY 也使用 ffmpeg 工具,这里是 API 参考的官方页面,以及底层细节, https://zulko.github.io/moviepy/_modules/moviepy/video/io/ffmpeg_tools.html
使用 mp4 容器可以在非关键帧处剪切而无需使用编辑列表重新编码(关于编辑列表的问题)。换句话说,如果 3 秒之前最接近的关键帧在 0 秒,那么它将从 0 秒开始复制视频,并使用编辑列表告诉播放器不是在 3 秒而是在 0 秒开始播放,因为它最近的关键帧休息帧被丢弃. 这就是有时音频播放和视频图像挂起但时间线继续运行的原因。
你做了什么,它不会重新编码原始的东西!它只是在最近的关键帧处拆分到您指定的开始/结束时间,并且它们的间隔不相等,因此最终结果的长度不等。
不要这样做: 尽管这是最快和最好的 ffmpeg 方式,但我已经弄明白了,这就是我假设你的方法正在做的事情:
ffmpeg -ss 00:01:00 -i input.mp4 -to 00:02:00 -c copy output.mp4
但下面的东西会剪切并重新编码:
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4
重新编码时,您可能还希望包含其他编解码器选项,然后使用此 ::
ffmpeg -ss 00:03:00 -t 00:00:05 -i test.wmv -acodec libmp3lame -vcodec libx264 1.mp4
但是斯瓦米有什么区别呢?
我们没有使用 -c 复制参数。因此不只是转储原始 I/O 流。但再次重新编码,需要更多的 CPU 工作!
此外,-t 选项指定持续时间,而不是结束时间。上面的命令(第二个代码片段)将从 3 秒开始对 8 秒的视频进行编码。要从 3 秒开始到 8 秒结束,请使用 -t 5(第三个代码片段)。
注意:如果您使用的是当前版本的 ffmpeg(我猜是 2015 年以上),您还可以在上面的命令中将 -t 替换为 -to 以在指定时间结束。
添加回答
举报