我有一个4部电影ImageClips的列表,我想把它连接起来,然后导出。我注意到,当我导出连接的视频剪贴纸时,它以60 it/s的速度开始导出,但几秒钟后它很快就下降到了6。我怀疑下降是当它到达第三个剪辑,这是明显长于其他。第一个不到半分钟,而第三个剪辑超过10分钟。前两个剪辑以下列方式生成:
background = Image.open("background.jpg")
new_background = background.resize((screen_width, screen_height))
new_background.save("temp/resized_background.png")
# Maybe I could speed this up by only resizing the background once, but that is irrelevant to this issue
image_clip = ImageClip(f"temp/resized_background.png")
audio_clip = AudioFileClip(f'temp/{random_file_name}.mp3')
video_clip = image_clip.set_audio(audio_clip)
video_clip.duration = audio_clip.duration
video_clip.fps = fps # fps=12
# Memory cleanup
del background
del new_background
del image_clip
del audio_clip
return video_clip
第三个剪辑由以下代码创建:
clips = []
for pic, audioFile in zip(self.images, self.audioFiles):
try:
audio_clip = AudioFileClip(f"temp/{audioFile}.mp3")
image_clip = ImageClip(f"temp/{pic}.png").resize((screen_height, screen_width))
# The images should already be this size, but also irrelevant here
except:
continue
video_clip = image_clip.set_audio(audio_clip)
video_clip.duration = audio_clip.duration
video_clip.fps = self.fps
clips.append(video_clip)
# Memory management
del image_clip
del audio_clip
del video_clip
unsilenced_video = concatenate_videoclips(clips, method="compose")
del clips
self.duration = unsilenced_video.duration
self.fullClip = unsilenced_video
del unsilenced_video
return self
然后,我确保所有这些都按照正确的顺序排列在一个列表中。然后我把它们连在一起
concat_clip = concatenate_videoclips(allClipsInOrder, method="compose")
# Put soft background music over the whole video
background = AudioFileClip("background_music.mp3").volumex(0.1)
full_background = afx.audio_loop(background, duration=concat_clip.duration)
final_audio = CompositeAudioClip([concat_clip.audio, full_background])
self.full_video = concat_clip.set_audio(final_audio)
最后出口:
self.full_video.write_videofile("sample_name.mp4", fps=self.fps, codec='h264_nvenc', verbose=False)
我有一个NVIDIA RTX 3060笔记本电脑GPU,因此编解码器。然而,当我试图导出它时,任务管理器显示我的内存正在被占用(90+%),而我的GPU几乎没有被使用(比如5%)。我还尝试了libx264编解码器,指定了不同数量的线程,而没有指定线程,这给出了几乎相同的结果。我也尝试指定比特率,没有任何运气。我不确定我是否需要安装任何其他可以让我更有效地使用我的GPU的东西,或者我还可以使用另一个设置。
奇怪的是,当我分别输出每一个剪辑时(这意味着没有添加背景音乐,我认为这并不重要,因为它也是从高开始的),它确实保持了合理的出口速度。所有的剪辑应该有相同的大小和fps,所以我不知道问题是什么。我知道降低尺寸会加快速度,禁用记录器也会加快速度,但这仍然意味着连接剪辑和单独剪辑在输出速度上有很大的差异。
有办法让出口更快吗?还是将剪辑分别导出,然后再尝试连接?通过删除变量,我试图清除一些内存,这也有一点帮助,但仍然没有解决这个问题。
FFMPEG with moviepy这个源代码也显示了一些关于CompositeVideoClip的东西,但是我无法让它工作,并且不确定它是否解决了问题,因为我认为这是为了连接,而不是导出。
发布于 2022-10-20 12:42:46
好吧,所以我测试了很多东西,我想是内存阻碍了我。我分别导出了这些剪辑,并看到了像250个it/s这样的数字与h264_nvenc编解码器。如果您没有GPU(或者您的CPU至少更快),我建议您使用它。无论哪种方式,都要确保您的RAM没有被完全抹掉。
输出后,我重新移植了视频剪辑:
allClipsInOrder = [VideoFileClip(vidPath) for vidPath in self.clipFilePaths]
concat_clip = concatenate_videoclips(allClipsInOrder, method="compose")
# Put soft background music over the whole video
background = AudioFileClip("background_music.mp3").volumex(0.1)
full_background = afx.audio_loop(background, duration=concat_clip.duration)
final_audio = CompositeAudioClip([concat_clip.audio, full_background])
self.full_video = concat_clip.set_audio(final_audio)
del concat_clip
del final_audio
del background
del full_background
再加上减少一些质量,一些额外的内存管理和这个,我设法把整个过程从超过一个小时缩短到只有7分钟,所以在这种情况下,视频长度不到50%。最后,我导出了以下两个单独剪辑和完整视频的设置:
clip.write_videofile(f"temp/{random_file_name}.mp4", fps=self.fps, codec='h264_nvenc', verbose=False)
https://stackoverflow.com/questions/74117365
复制相似问题