मैंने इस मुद्दे के बारे में कुछ दिनों की खोज की है लेकिन कोई समाधान नहीं आया है। मेरे पास एक बड़ी लिपि है (मैं बड़ी संख्या में वीडियो को संयोजित करने की कोशिश कर रहा हूं, ~ 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
लूप के लिए आप जिस संदर्भ को अभी बनाया है उसे हटा दें। आप वहां कुछ भी बंद नहीं कर रहे हैं। 'videos_and_subtitles = [] 'सूची में संदर्भ हटा देता है। हो सकता है कि आपकी सूची में ~ 50 संदर्भ और 'preprocessedVideos' की सामग्री भी बहुत अधिक हो। – tynn
आपका क्या मतलब है कि मैं कुछ भी बंद नहीं कर रहा हूं? मैं प्रत्येक 50 वीडियो (या जब मैं अंतिम वीडियो पर जाता हूं) में videos_and_subtitles में प्रत्येक तत्व को हटा देता हूं। PreprocessedVideos में 1-3 से अधिक तत्व नहीं होते हैं (यह वह वीडियो है जो 50 वीडियो संकलित करने के बाद उत्पन्न हुआ था, इसलिए यदि मेरे पास 150 वीडियो हैं, तो मेरे पास 3 compositevideoclips होंगे) – Waclock
कंपोजिटविडियोक्लिप का उपयोग करने के बाद, मैं इसे हटाता हूं और बना देता हूं नए वीडियो का एक नया संदर्भ (50 वीडियो से बना)। – Waclock