我正在使用MoviePY加入50s或更多的1,2,3分钟视频,但这给了我20个小时,即使我有64 GB的ram,i7和GTX 670,虽然不是最合理的范围。无论如何,我可以加快这个过程吗?
padding = 10 # padding option
video_clips = [VideoFileClip(video_dir + video) for video in os.listdir(video_dir)]
video_fx_list = [video_clips[0]]
idx = video_clips[0].duration - padding
for video in video_clips[1:]:
video_fx_list.append(video.set_start(idx).crossfadein(padding))
idx += video.duration - padding
final_video = CompositeVideoClip(video_fx_list)
final_video.write_videofile(video_dir + 'myoutfile.mp4', fps=24)
我不需要这些剪辑具有的原始音频,将其删除可以加快处理速度吗?不知道如何通过/
删除音频答案 0 :(得分:1)
Python在视频编辑方面效率不高。
如果您使用的是MoviePY,请查看 https://zulko.github.io/moviepy/ref/ffmpeg.html (也许使用更稳定的github dev版本)
您有一些函数可以直接调用ffmpeg: https://github.com/Zulko/moviepy/blob/master/moviepy/video/io/ffmpeg_tools.py 因此,对于像您这样的简单任务,效率非常高
答案 1 :(得分:1)
我在ffmpeg解析器-vcodec h264_nvenc
中使用cuda加速。
它适用于Win10和ffmpeg 4.2.3版NVIDA GPU。
(您应该为您的GPU找到 specified-ffmpeg-parser 。)
会加快5〜10倍。
而且我已经使用cuda实现了[剪辑,concat视频,concat与crossfade,添加bgm] ...
'''
here is concat videos with cuda accelerate.
so you can subclip the video fragment and clip them, then concat with others.
'''
import os
def save_flist(files):
f_data = 'file \'' + '\'\nfile \''.join(files) + '\''
print(f_data)
f_list = 'list.txt'
with open(f_list, 'w', encoding='gbk') as f:
f.write(f_data)
return f_list
video_path = r'E:\py\mkv\\'
os.chdir(video_path)
output_path = 'output.mkv'
files = ['1.mkv', '2.mkv', '3.mkv', '4.mkv']
print(files) # your video_names.
f_list = save_flist(files)
call = f'ffmpeg -f concat -safe 0 -i {f_list} -c copy {output_path} -y' # only supporte the same video_format, copy and not recode.
call = f'ffmpeg -f concat -safe 0 -i {f_list} -vcodec h264_nvenc {output_path} -y' # cuda accelerate.
print(call)
os.system(call)
os.remove(f_list)
答案 2 :(得分:0)
您可以在threads
中指定数量write_videofile
。通过使用计算机的所有内核,这将大大加快导出速度。
final_video.write_videofile(video_dir + 'myoutfile.mp4', threads = 8, fps=24)
注意事项:
resize
将所有视频以较低的分辨率(例如720p)减小fps
也有很大的不同,但是24 fps已经很好地优化了
Moviepy仅使用CPU渲染视频。考虑升级CPU或在云服务(例如AWS,Google CLoud,Azure ..)上运行程序,以获得更好的性能
答案 3 :(得分:0)
要获得最佳加速,您需要使用 ffmpeg-tools
中的 moviepy
。下面是一个例子:
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)
而且我还建议它在 standalone process
中运行(主进程/线程除外)。您可以使用 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)])