为了获得最佳加速效果,您需要使用moviepy中的ffmpeg-tools。下面是一个示例:
from moviepy.video.io.ffmpeg_tools import ffmpeg_merge_video_audio
# printing logs can be a bottleneck sometimes, so we put ffmpeg_ouput=False
# and logger = None
# you can change video codec(vcodec) or audio codec (acodec) as per your need
ffmpeg_merge_video_audio(video_path,
audio_path,
output_path,
vcodec='copy',
acodec='copy',
ffmpeg_output=False,
logger=None)
我建议你将其运行在一个独立的进程中(而非主进程/线程)。你可以使用Python中的multiprocessing模块轻松实现。
但即使你想坚持使用final_video.write_videofile(),我建议你传递verbose=False和logger=None以获得更快的I/O速度。并且使用threads=as you want。如下所示:
final_video.write_videofile(video_dir + 'myoutfile.mp4',
fps=24,
verbose=False,
logger=None,
threads=32)
我其实不确定为什么这个操作如此缓慢,因为在底层,write_videofile() 实际上是使用 ffmpeg 的。例如:
# from the source of moviepy (ffmpeg_writer.py - line 80 onwards)
cmd = [
get_setting("FFMPEG_BINARY"),
'-y',
'-loglevel', 'error' if logfile == sp.PIPE else 'info',
'-f', 'rawvideo',
'-vcodec', 'rawvideo',
'-s', '%dx%d' % (size[0], size[1]),
'-pix_fmt', 'rgba' if withmask else 'rgb24',
'-r', '%.02f' % fps,
'-an', '-i', '-'
]
.... more codes
if threads is not None:
cmd.extend(["-threads", str(threads)])