首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Moviepy级联视频唇的输出比剪辑本身慢得多

Moviepy级联视频唇的输出比剪辑本身慢得多
EN

Stack Overflow用户
提问于 2022-10-18 20:55:25
回答 1查看 26关注 0票数 0

我有一个4部电影ImageClips的列表,我想把它连接起来,然后导出。我注意到,当我导出连接的视频剪贴纸时,它以60 it/s的速度开始导出,但几秒钟后它很快就下降到了6。我怀疑下降是当它到达第三个剪辑,这是明显长于其他。第一个不到半分钟,而第三个剪辑超过10分钟。前两个剪辑以下列方式生成:

代码语言:javascript
运行
复制
    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

第三个剪辑由以下代码创建:

代码语言:javascript
运行
复制
        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

然后,我确保所有这些都按照正确的顺序排列在一个列表中。然后我把它们连在一起

代码语言:javascript
运行
复制
        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)

最后出口:

代码语言:javascript
运行
复制
 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的东西,但是我无法让它工作,并且不确定它是否解决了问题,因为我认为这是为了连接,而不是导出。

EN

回答 1

Stack Overflow用户

发布于 2022-10-20 12:42:46

好吧,所以我测试了很多东西,我想是内存阻碍了我。我分别导出了这些剪辑,并看到了像250个it/s这样的数字与h264_nvenc编解码器。如果您没有GPU(或者您的CPU至少更快),我建议您使用它。无论哪种方式,都要确保您的RAM没有被完全抹掉。

输出后,我重新移植了视频剪辑:

代码语言:javascript
运行
复制
        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%。最后,我导出了以下两个单独剪辑和完整视频的设置:

代码语言:javascript
运行
复制
clip.write_videofile(f"temp/{random_file_name}.mp4", fps=self.fps, codec='h264_nvenc', verbose=False)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74117365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档