简体   繁体   中英

Unable to allocate 47.5 MiB for an array with shape (1080, 1920, 3) and data type float64

Iam try to create a large video(longer than 3h)by CompositeVideoClip using moviepy. The problem is it take too much ram (i have 32gb ram).It takes the whole ram (99%) by create a bunch of ffmpeg-win64-v4.2.2.exe ffmpeg-win64-v4.2.2.exe 它需要整个 ram

它创建了一堆 ffmpeg-win64-v4.2.2.exe ffmpeg-win64-v4.2.2.exe

after it a while it said Unable to allocate 47.5 MiB for an array with shape (1080, 1920, 3) and data type float64. here is my code:

def CombieVideo():
    global curentVideoLengt
    masterVideo = NULL
    for videoUrl in videoFiles:
        print(videoUrl)
        video = VideoFileClip(videoUrl).fx(vfx.fadein,1).fx(vfx.fadeout,1)
        curentVideoLengt += video.duration
        if curentVideoLengt >= (audioLen*60*60):
            break
        if masterVideo== NULL:
            masterVideo= video
        else:
            masterVideo = CompositeVideoClip([masterVideo,video])
            
    if curentVideoLengt < (audioLen*60*60):
        videoUrl=random.choice(videoFiles)
        print(videoUrl)
        video =video(videoUrl).fx(vfx.fadein,1).fx(vfx.fadeout,1)
        curentVideoLengt= curentVideoLengt+video.duration
        masterVideo = CompositeVideoClip([masterVideo,video])
        CombieVideo()
    else:
        masterVideo.audio = CompositeAudioClip(audios)
        masterVideo.write_videofile('./MasterVideo/output_video.avi', fps=30, threads=4, codec="png")
        
CombieVideo()

Your issue isn't running allocating arrays, but rather you're opening too many instances of FFMPEG_VideoReader via VideoFileClip instances. Each of FFMPEG_VideoReader spawns an instance of ffmpeg, which eats up your memory resource.

You can try to close the reader immediately after instantiation:

video = VideoFileClip(videoUrl).fx(vfx.fadein,1).fx(vfx.fadeout,1)
video.close()

# continue as is

No guarantee if this will work, but it should points you in a right direction. This should fix your problem as moviepy documentation of VideoFileClip is suggesting for the immediate closure.

On a side note, do you really want to recurse this function? It's picking one random file then adding more files from the top of the videoFiles list if the random one isn't long enough.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM