2016-01-28 6 views
7

मैंने इस मुद्दे के बारे में कुछ दिनों की खोज की है लेकिन कोई समाधान नहीं आया है। मेरे पास एक बड़ी लिपि है (मैं बड़ी संख्या में वीडियो को संयोजित करने की कोशिश कर रहा हूं, ~ 100-500), यही कारण है कि मुझे "बहुत सारी फाइलें खुली" त्रुटि मिल रही थीं। अन्य मुद्दों के Zulko की प्रतिक्रियाएं पढ़ना, मैंने देखा है कि इसे इस तरह मैन्युअल रूप से प्रत्येक VideoFileClip उदाहरण नष्ट करने के लिए जरूरी हो गया था:मूवीपी वीडियोफाइलक्लिप उदाहरण में कोई विशेषता 'पाठक'

del clip.reader 
del clip 

मुद्दा मैं का सामना करना पड़ रहा हूँ मैं एक साधारण hello_world ऐसा करने की कोशिश कर रहा है, लेकिन प्राप्त करता है त्रुटि VideoFileClip instance has no attribute 'reader' कोड यह रहा:

from moviepy.editor import * 
rel_path = "main.py" 
file_path="hello_world.mp4" 
newVideo = VideoFileClip(file_path) 
del newVideo.reader 
del newVideo 

मैं एल कैप्टन (ओएस एक्स) का उपयोग कर रहा हूँ, MoviePy, Numpy, ImageMagick को अद्यतन किया है, और सभी संकुल मैं के रूप में आवश्यक देखा है, लेकिन मैं अभी भी इस हो रही है त्रुटि। समस्या यह है कि मेरा कंप्यूटर कभी-कभी ठंड लग रहा है क्योंकि यह बहुत मेमोरी का उपयोग कर रहा है। मैं वर्तमान में 25 वीडियो के टुकड़ों को जोड़ रहा हूं, और सभी 25 "खुली फाइलों" को हटाने की कोशिश कर रहा हूं, अगले 25, और आगे के साथ मिलकर। इसके बाद मैं लंबे वीडियो को जोड़ दूंगा।

कृपया ध्यान दें कि लाइन डेल newVideo.reader बिना मैं अभी भी त्रुटि बहुत अधिक फ़ाइलें

खोलते हैं मैं वास्तविक स्क्रिप्ट चलाने का प्रयास करें, मैं करने के निम्न त्रुटि अगर मैं न जोड़ें newVideo.reader

मिल
Traceback (most recent call last): 
    File "/Users/johnpeebles/mispistachos/vines/video/reader.py", line 135, in compile_videos 
    newVideo = VideoFileClip(videoPath).resize(height=finalHeight,width=finalWidth).set_position('center').set_start(currentDuration) 
    File "/Library/Python/2.7/site-packages/moviepy/video/io/VideoFileClip.py", line 55, in __init__ 
    reader = FFMPEG_VideoReader(filename, pix_fmt=pix_fmt) 
    File "/Library/Python/2.7/site-packages/moviepy/video/io/ffmpeg_reader.py", line 32, in __init__ 
    infos = ffmpeg_parse_infos(filename, print_infos, check_duration) 
    File "/Library/Python/2.7/site-packages/moviepy/video/io/ffmpeg_reader.py", line 237, in ffmpeg_parse_infos 
    proc = sp.Popen(cmd, **popen_params) 
    File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 710, in __init__ 
    errread, errwrite) 
    File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1223, in _execute_child 
    errpipe_read, errpipe_write = self.pipe_cloexec() 
    File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1175, in pipe_cloexec 
    r, w = os.pipe() 
OSError: [Errno 24] Too many open files 
Error compiling videos 
Exception AttributeError: "VideoFileClip instance has no attribute 'reader'" in <bound method VideoFileClip.__del__ of <moviepy.video.io.VideoFileClip.VideoFileClip instance at 0x136e46908>> ignore 

जैसा कि टाइन द्वारा अनुरोध किया गया है, मैं "असली कोड" पोस्ट कर रहा हूं। मैं यहां क्या कर रहा हूं, जैसा कि मैंने ऊपर बताया है, 25 वीडियो के हिस्सों में वीडियो संकलित करें, फिर इन सभी पूर्व संकलित वीडियो को एक बड़े वीडियो में संकलित करें। मैं त्रुटि Too Many Files Open अभी हो रही है (अगर मैं डेल clip.reader न जोड़ें)

for videoObject in data["videos"]: 
     counter+=1 
     #Download video and thumbnail 
     downloader=urllib.URLopener() 
     videoId = videoObject[API_VIDEO_ID] 
     videoUrl = str(videoObject[API_VIDEO_URL]) 
     videoPath =os.path.join(file_dir, "tmp",str(videoObject[API_VIDEO_ID].replace("/",""))+'_video.mp4') 
     thumbPath =os.path.join(file_dir, "tmp",str(videoObject[API_VIDEO_ID].replace("/",""))+'_thumb.jpg') 
     currentVideoDimension = videoObject[API_VIDEO_DIMENSIONS] 
     currentVideoWidth = currentVideoDimension[0] 
     currentVideoHeight = currentVideoDimension[1] 

     thumbUrl = str(videoObject[API_THUMB_URL]) 
     finalWidth = w*1.0 
     finalHeight = h*1.0 
     videoProportion = (float(currentVideoWidth)/float(currentVideoHeight)) 
     if currentVideoWidth >= currentVideoHeight: 
      finalHeight = finalWidth/videoProportion 
     else: 
      finalWidth = finalHeight*videoProportion 


     try: 
      download(videoUrl, videoPath) 
      download(thumbUrl, thumbPath) 
     except Exception as e: 
      print("Exception: "+str(e)) 
      print("Video ID: "+str(videoId)) 
      traceback.print_exc() 
      continue 
     #Create new video and update video duration's offset 
     newVideo = VideoFileClip(videoPath).resize(height=finalHeight,width=finalWidth).set_position('center').set_start(currentDuration) 
     #If it's not squared we append a video first 
     if videoProportion != float(1): 
      backgroundClip = ColorClip(size=((w,h)), col=colors.hex_to_rgb("#000")).set_position("center").set_start(currentDuration).set_duration(newVideo.duration) 
      videos_and_subtitles.append(backgroundClip) 
     #Append new video to videos 

     videos_and_subtitles.append(newVideo) 
     #Append subtitle to Subtitles 
#   newSubtitleText = max_text(videoObject[API_NAME],videoObject[API_AUTHOR])+" \n\n"+videoObject[API_AUTHOR] 
     videoName = clean(videoObject[API_NAME]) 
     videoAuthor = clean(videoObject[API_AUTHOR]) 
     newSubtitleText = clean(max_text(videoName,videoAuthor)+" \n\n"+videoObject[API_AUTHOR]) 
     newSubtitle = (TextClip(newSubtitleText,fontsize=70,color='white',font='Helvetica-Narrow',align='center',method='caption',size=titleDimensions).set_start(currentDuration).set_position((videoOffset+w,0)).set_duration(newVideo.duration)) 
     videos_and_subtitles.append(newSubtitle) 




     currentDuration+=newVideo.duration 

     #Preprocess videos 
     if counter%50==0 or len(data["videos"])==(counter): 
      if closure_video_path != None and closure_video_path != "" and len(data["videos"])==(counter): 
       newVideo = VideoFileClip(closure_video_path).resize(height=finalHeight,width=finalWidth).set_position((videoOffset,titleOffset)).set_start(currentDuration) 
       videos_and_subtitles.append(newVideo) 
       currentDuration+=closure_video_duration 

      currentFilename=os.path.join(file_dir, "tmp",str(videoNumber)+fileName) 
      result = CompositeVideoClip(videos_and_subtitles,size=movieDimensions,bg_color=colors.hex_to_rgb(background_color)).set_duration(currentDuration).write_videofile(filename=currentFilename,preset='ultrafast',fps=24) 

      del result 

      preprocessedVideos.append(VideoFileClip(currentFilename)) 

      #Close files 
      #close_files(videos_and_subtitles) 
      for clip in videos_and_subtitles: 
       try: 
        if not (isinstance(clip,ImageClip) or isinstance(clip,TextClip)): 
         del clip 
        else: 
         del clip 
       except Exception,e: 
        print "Exception: "+str(e) 
      #End Close files       


      videos_and_subtitles = [] 
      videos_and_subtitles.append(left_holder) 
      currentDuration = 0 
      videoNumber+=1 
      if (videoObject==data["videos"][-1]): 
       break 
     print("Next video") 


    print("Compiling video") 

    filepath = os.path.join(file_dir, "tmp",fileName) 
    result = concatenate_videoclips(preprocessedVideos).write_videofile(filename=filepath, preset='ultrafast') 
    #result = CompositeVideoClip(videos_and_subtitles,size=movieDimensions,bg_color=(0,164,119)).set_duration(currentDuration).write_videofile(filename=directory+"/"+fileName,preset='ultrafast') 
    print("Video Compiled") 
    now = datetime.datetime.now() 
    print("Finished at: "+str(now)) 
    return filepath 
except Exception as e: 
    print("Exception: "+str(e)) 
    print("Video ID: "+str(videoId)) 
    traceback.print_exc() 
    rollbar.report_exc_info() 
    return None 
+0

लूप के लिए आप जिस संदर्भ को अभी बनाया है उसे हटा दें। आप वहां कुछ भी बंद नहीं कर रहे हैं। 'videos_and_subtitles = [] 'सूची में संदर्भ हटा देता है। हो सकता है कि आपकी सूची में ~ 50 संदर्भ और 'preprocessedVideos' की सामग्री भी बहुत अधिक हो। – tynn

+0

आपका क्या मतलब है कि मैं कुछ भी बंद नहीं कर रहा हूं? मैं प्रत्येक 50 वीडियो (या जब मैं अंतिम वीडियो पर जाता हूं) में videos_and_subtitles में प्रत्येक तत्व को हटा देता हूं। PreprocessedVideos में 1-3 से अधिक तत्व नहीं होते हैं (यह वह वीडियो है जो 50 वीडियो संकलित करने के बाद उत्पन्न हुआ था, इसलिए यदि मेरे पास 150 वीडियो हैं, तो मेरे पास 3 compositevideoclips होंगे) – Waclock

+0

कंपोजिटविडियोक्लिप का उपयोग करने के बाद, मैं इसे हटाता हूं और बना देता हूं नए वीडियो का एक नया संदर्भ (50 वीडियो से बना)। – Waclock

उत्तर

2

Zulko खुद writes:

MoviePy के अगले संस्करणों में सिर्फ del clip पर्याप्त होगा।

यह संस्करण 0.2.2 रिलीज़ होने से पहले था। तो ऐसा लगता है कि आपको del clip.reader करने की आवश्यकता नहीं है।

अधिक सटीक होने के लिए आपको यह नहीं करना चाहिए! VideoFileClip आप के लिए एक नाशक यह कर परिभाषित करता है:

def __del__(self): 
    """ Close/delete the internal reader. """ 
    del self.reader 

लेकिन जब से तुम यह पहले से ही हटा देने के बाद आप प्राप्त AttributeError:

VideoFileClip उदाहरण कोई विशेषता 'पाठक'

में है <bound method VideoFileClip.__del__ of <...VideoFileClip instance at 0x13..>>

+0

हैलो टाइन, आपकी प्रतिक्रिया के लिए धन्यवाद। आप सही हैं, मैं यह उल्लेख करना भूल गया कि अगर मैं केवल "डेल क्लिप" डालता हूं, तो मुझे 'बहुत अधिक फ़ाइलें खोलें' त्रुटि मिलती है, इसलिए यह कोई अच्छा नहीं है:/ – Waclock

+0

@Waclock आपको 'क्लिप' के सभी संदर्भों को हटाने की आवश्यकता है अपने आप। क्या आपने 'clip.reader = none' करने की कोशिश की है? इसके दुष्प्रभाव के बिना इसे हटाने के समान प्रभाव होना चाहिए। – tynn

+0

मैं इसे आज़मा दूंगा। मेरा मानना ​​है कि मेरे पास है, मैं एक सरणी बनाता हूं और प्रत्येक क्लिप ऑब्जेक्ट को दबाता हूं, फिर ऑब्जेक्ट के माध्यम से पुनरावृत्ति करता हूं और क्लिप के प्रत्येक इंस्टेंस को हटा देता हूं। – Waclock

0

मैंने अपना प्रश्न हल कर लिया है, जिसे विस्तार सेपर वर्णित किया गया है।

एक बार जब आप ImageMagick स्थापित कर लेंगे, तो यह विंडोज़ को छोड़कर मूवीपी द्वारा स्वचालित रूप से पहचाना जाएगा! मूवीपी को हाथ से स्थापित करने से पहले, विंडोज उपयोगकर्ताओं को ImageMagick बाइनरी के पथ प्रदान करने के लिए moviepy/config_defaults.py संपादित करने की आवश्यकता है, जिसे कन्वर्ट कहा जाता है। यह इस तरह दिखना चाहिए: IMAGEMAGICK_BINARY = "C:\\Program Files\\ImageMagick_VERSION\\convert.exe"

संबंधित मुद्दे