使用MoviePy或FFmpeg

时间:2019-02-05 00:54:58

标签: python ffmpeg concatenation trim moviepy

我有大约10,000个短视频,我试图从中制作更长的视频。

我已经使用MoviePy创建了这些视频,但是在尝试将它们重新连接在一起时会不断出现内存错误。

在我的代码中,我有一个外部循环遍历字母表中的每个字母,并获取以该字母开头的文件。

从返回的视频剪辑中,我获得了长度,并剥离了视频的最后3.5秒(outro_clip_duration),然后将其添加到Python列表clips中。

我遇到的困难是,我想拿出这份修整后的视频列表,并从中制作一个长视频。

我拥有所有文件,我只需要修剪它们,将它们连接起来,然后将它们导出为一个文件即可。

我已经尝试了许多次不同的MoviePy尝试,并不断出现MemoryErrors,所以我放弃了并尝试了here的ffmpeg解决方案,但还是没有解决。

我的代码主要部分的最新版本在这里:

clips = []
outro_clip = mpy.VideoFileClip('Logo_Intro_w_Stinger_Large.mp4')
outro_clip_duration = outro_clip.duration
for def_image in vid_list_long:
    video_item = mpy.VideoFileClip('F:/sm_My_Video/sm_%s.mp4' % def_image)
    video_item_duration = video_item.duration
    clips.append(ffmpeg_extract_subclip(video_item,0,(video_item_duration - outro_clip_duration), targetname = def_image))

# #Append the outro_clip to the end 
clips.append(mpy.VideoFileClip('Logo_Intro_w_Stinger_Large.mp4',target_resolution = (h,w),audio=True))
slided_clips = [CompositeVideoClip([clip.fx( transfx.crossfadein, transition_seconds)]) for clip in clips]
#added 'method = compose' NEED TO TEST - supposedly removes the weird glitches.
c = concatenate_videoclips(slided_clips, method = 'compose')
c.write_videofile('F:/Extended_Play/%s_Extended_Play_vid.mp4' % letter,fps=23.98)

我的PC是Windows 10,我有32 GB的内存运行Anaconda和Python 3。

3 个答案:

答案 0 :(得分:0)

如果这是内存问题,也许您可​​以尝试为字母表中的每个字母制作一个级联的视频,然后在一个单独的脚本中尝试级联这些视频?我知道许多视频格式的顶部都包含标头,这些标头可能会占用很多空间,因此,如果您将它们分步组合,则可以将这些标头中的更少加载到内存中。也许(纯粹是推测,因为我并不真正知道)您尝试制作的视频的文件格式受到限制,而您正在超出该限制,所以您无法完全以该特定格式实现您想要的?如果这些建议不起作用,也许您可​​以尝试一次将一个视频串联一个字母(在您已经按字母将它们串联之后),然后看它在哪里中断了?作为最后的选择,您总是可以降低分辨率,或者以2或3个视频而不是1个视频的形式发布到YouTube(或您正在做的事情)。与10,000个视频相比,这仍然是一个巨大的进步!

答案 1 :(得分:0)

在使用完剪辑后,应尝试通过在for循环的末尾添加close_clip(video_item)来关闭剪辑,类似

for def_image in vid_list_long:
    video_item = mpy.VideoFileClip('F:/sm_My_Video/sm_%s.mp4' % def_image)
    video_item_duration = video_item.duration
    clips.append(ffmpeg_extract_subclip(video_item,0,(video_item_duration - outro_clip_duration), targetname = def_image))
    close_clip(video_item)

close_clip()看起来像

def close_clip(clip):
  try:
    clip.reader.close()
    if clip.audio != None:
      clip.audio.reader.close_proc()
      del clip.audio
    del clip
  except Exception as e:
    print("Error in close_clip() ", e)

答案 2 :(得分:0)

def concatenate():
stringa = "ffmpeg -i \"concat:"
elenco_video = glob.glob("*.mp4")
elenco_file_temp = []
for f in elenco_video:
    file = "temp" + str(elenco_video.index(f) + 1) + ".ts"
    os.system("ffmpeg -i " + f + " -c copy -bsf:v h264_mp4toannexb -f mpegts " + file)
    elenco_file_temp.append(file)
print(elenco_file_temp)
for f in elenco_file_temp:
    stringa += f
    if elenco_file_temp.index(f) != len(elenco_file_temp)-1:
        stringa += "|"
    else:
        stringa += "\" -c copy  -bsf:a aac_adtstoasc output.mp4"
print(stringa)
os.system(stringa)

# call the method
concatenate()