如何使用 python 来加速视频而不丢帧

How can I use python to speed up a video without dropping frames

我有一个视频,时长 1:24 分钟,fps 为 10,没有任何声音。我需要将视频缩短到 28 秒并为其添加声音,而不丢帧,并明显提高 fps。我尝试使用 MoviePy 来完成此操作。

clip = VideoFileClip(in_loc)
final = clip.fx(vfx.speedx, 3)
final.write_videofile(out_loc, audio=audio_loc)

但是当我查看文件的详细信息时,文件仍然是 10 fps。所以这个方法丢帧了。 然后我试了一下,下面的代码。

clip.write_videofile(out_loc, fps=30, audio=audio_loc)

生成的文件仍然 1:24 分钟长,尽管 fps 属性已增加到 30。
我怎样才能做到这一点?

注意:所有 _loc 变量都是包含相应文件位置的字符串。
我不介意安装其他库。

我想我找到了使用 Clip class 的 set_fps 属性的解决方案。事实上,set_fps function returns 具有修改的 FPS 计数的剪辑副本。将转换应用于此副本时,您最终会得到正确的 FPS 数。

由于您没有提供可重现的示例,我使用了 15 秒和 24 FPS 且没有声音的 stock video(重命名为 dummy_in.mp4)。我最终使用此代码得到了 5 秒的剪辑和 72 FPS:

from moviepy.editor import VideoFileClip
import moviepy.video.fx.all as vfx

in_loc = 'dummy_in.mp4'
out_loc = 'dummy_out.mp4'

# Import video clip
clip = VideoFileClip(in_loc)
print("fps: {}".format(clip.fps))

# Modify the FPS
clip = clip.set_fps(clip.fps * 3)

# Apply speed up
final = clip.fx(vfx.speedx, 3)
print("fps: {}".format(final.fps))

# Save video clip
final.write_videofile(out_loc)

它产生这个输出:

fps: 23.976023976023978
fps: 71.92807192807193
Moviepy - Building video dummy_out.mp4.
Moviepy - Writing video dummy_out.mp4

Moviepy - Done !
Moviepy - video ready dummy_out.mp4