python / video - 删除帧而不重新编码

时间:2017-02-18 10:30:32

标签: python video ffmpeg moviepy

我知道这可能是一个微不足道的问题,但到目前为止,我对我尝试的各种解决方案没有运气,我相信必须有一种方便的方法来实现这一目标。

如何在不切片,合并和重新编码的情况下从视频文件中删除帧/毫秒? 我发现的所有解决方案都涉及将各种时间导出为各种格式,我希望没有必要这样做。

使用ffmpeg / avconv,必须将临时流转换为.ts,然后连接,最后以原始格式重新编码。

Python库MoviePy似乎完全符合我的需要,但是:

  • cutout函数返回一个无法导出的文件,因为write_videofile函数尝试并且无法获取已删除的帧
  • 如果我将原始文件切片为各种剪辑,然后将其与concatenate_videoclips合并,则导出不会失败,但会占用视频长度的两倍。结果视频具有更快的帧速率,只有及时放置连接视频的提示点,并且以正常速度播放音频。值得注意的是,尽管输出文件的持续时间缩短了5-7%,但其输出文件大约增加了15%。

还有其他我不了解的图书馆吗? 我想要的是一个抽象层,可以轻松访问最常见的视频格式,使我能够弹出不需要的帧并更新文件头,而无需深入研究每种格式的细节。

2 个答案:

答案 0 :(得分:0)

为什么不使用

#import os
start = '00:00:08.345' # HH:MM:SS[.xxx] format
duration = '00:00:10'

os.system('ffmpeg -i path/to/input.mp4 -vcodec copy -acodec copy -ss ' + start + ' -t ' + end + ' path/to/file.mp4')`

这应该接受input.mp4并从8.345秒开始缩短10秒而不重新编码文件。你可能想要使用很多FFMPEG python包装器,但这是我能想到的最简单的方法。

答案 1 :(得分:0)

由于现代视频编码标准使用帧间预测,因此不存在不重新编码而移除帧的一般解决方案。 (删除参考图片会中断帧间预测,因此只能删除非参考图片。)