python-3.x - 为什么我在moviepy中创建电影的实现如此低效?
问题描述
我正在使用moviepy,一个用于创建电影的python模块,创建一张迈克照片的电影,然后是一张艾米丽的照片,每2张照片都有一首不同的歌曲。我通过以下方式实现了这一点:
clips = []
for i in range(n):
audio = AudioFileClip(audiofiles[i]).set_duration(10)
video1 = ImageClip(images_mike[i]).set_duration(5)
video2 = ImageClip(images_emily[i]).set_duration(5)
video = concatenate([video1,video2],method='compose')
movie.set_audio(audio)
clips.append(movie)
video = concatenate(clips,method='compose')
video.write_videofile('my_movie.mp4')
audiofiles,是音频文件名的列表。images_mike 和 images_emily 分别是图像文件名列表。
但是这种方法真的很慢。video.write_videofile('my_movie.mp4') 可能需要一个小时来编译一个 4 分钟的剪辑。此外,当我尝试制作 10 分钟的剪辑时,我遇到了内存分配错误。这个实现有什么问题?这肯定是不对的。
我不知道这是否相关,但我在笔记本电脑上,配备 16gb 内存和 i7 处理器。
解决方案
如果它是write_videofile
慢的,有一个preset
参数告诉 FFMPEG 花费多少时间来尝试优化压缩。默认值为“中”。如果您不在乎视频文件有多大,请尝试使用preset='ultrafast'
. 根据文档,无论您选择哪个选项,质量都不会改变,但文件可以通过更快的设置变得更大。
video.write_videofile('my_movie.mp4', preset='ultrafast')
Choices are: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo.
您还可以使用该threads
参数,该参数默认为None
...尝试将其设置为 2 或 3 看看是否有帮助。
推荐阅读
- java - Glide - 将 GIF 保存到文件
- r - 在 R 中将 fd 转换为 fData
- spring-mvc - 在服务层传递参数的最佳方式
- java - 如何添加文本时钟小部件?
- wpf - 无法在设计器中打开类图
- django - 使用查询集更新 ManyToManyField(),django ORM 可以吗?
- android - 线性布局背景颜色不会以编程方式更改
- powershell - 如何使用 Powershell 脚本清理 csv 文件中的一些数据并将结果另存为新的 csv 文件?
- android - 如何使用 ContentProvider 实现 Intent。ACTION_SEND?
- node.js - 在 NodeJS 上的其他模块上需要一个模块如何在入口点上可用?