我想使用 python moviePy 库将音频文件添加到视频文件中。 但不幸的是,我收到了这个错误。我最初只是尝试获取原始视频文件的持续时间,然后更改音频的大小,但这对我没有帮助。 如何解决这个问题?
data
变量包含一些其他变量的列表,视频名称、起点、终点等。
此代码旨在将一个视频放入另一个视频中。
这是我的代码:
def video_cut(data, movie1):
folder,movie2, lista, end, start = data
movie2 = f'../{movie2}'
clip1 = VideoFileClip(movie1)
durata = clip1.duration - end
clip1 = clip1.subclip(0, durata)
audio = f'../Rus_sound/{movie1}'[:-3] + 'mp3'
clip1 = clip1.set_audio(AudioFileClip(audio).subclip(0, durata))
w = clip1.w
h = clip1.h
fps = clip1.fps
clip2 = VideoFileClip(movie2).resize(height=h, width=w).set_fps(fps)
lista = [start] + [i*durata for i in lista ] + [durata]
stocked = []
for i in range(1, len(lista)):
o = i-1
clip = clip1.subclip(lista[o], lista[i])
stocked.append(clip)
if i != len(lista)-1:
stocked.append(clip2)
clip = concatenate_videoclips(stocked, method='compose')
if os.path.isdir('Nova') == False: #If directory "Nova" is exist -> continue, if not - create
os.mkdir('Nova')
#clip.write_videofile(f'Nova/{movie1}') # Saving file in 'Nova' directory, with initially name
clip.write_videofile(f'Nova/{movie1}'[:-3]+'mp4')
video_cut(data, '01.mkv')
这是我的追溯:
OSError Traceback (most recent call last)
<ipython-input-30-d1f67adfb994> in <module>
----> 1 video_cut(data, '01.mkv')
<ipython-input-28-b707f88639c3> in video_cut(data, movie1)
32 os.mkdir('Nova')
33 #clip.write_videofile(f'Nova/{movie1}') # Saving file in 'Nova' directory, with initially name
---> 34 clip.write_videofile(f'Nova/{movie1}'[:-3]+'mp4')
<decorator-gen-171> in write_videofile(self, filename, fps, codec, bitrate, audio, audio_fps, preset, audio_nbytes, audio_codec, audio_bitrate, audio_bufsize, temp_audiofile, rewrite_audio, remove_temp, write_logfile, verbose, threads, ffmpeg_params, logger)
~/Anaconda3/lib/python3.8/site-packages/moviepy/decorators.py in requires_duration(f, clip, *a, **k)
52 raise ValueError("Attribute 'duration' not set")
53 else:
---> 54 return f(clip, *a, **k)
55
56
<decorator-gen-170> in write_videofile(self, filename, fps, codec, bitrate, audio, audio_fps, preset, audio_nbytes, audio_codec, audio_bitrate, audio_bufsize, temp_audiofile, rewrite_audio, remove_temp, write_logfile, verbose, threads, ffmpeg_params, logger)
~/Anaconda3/lib/python3.8/site-packages/moviepy/decorators.py in use_clip_fps_by_default(f, clip, *a, **k)
133 for (k,v) in k.items()}
134
--> 135 return f(clip, *new_a, **new_kw)
<decorator-gen-169> in write_videofile(self, filename, fps, codec, bitrate, audio, audio_fps, preset, audio_nbytes, audio_codec, audio_bitrate, audio_bufsize, temp_audiofile, rewrite_audio, remove_temp, write_logfile, verbose, threads, ffmpeg_params, logger)
~/Anaconda3/lib/python3.8/site-packages/moviepy/decorators.py in convert_masks_to_RGB(f, clip, *a, **k)
20 if clip.ismask:
21 clip = clip.to_RGB()
---> 22 return f(clip, *a, **k)
23
24 @decorator.decorator
~/Anaconda3/lib/python3.8/site-packages/moviepy/video/VideoClip.py in write_videofile(self, filename, fps, codec, bitrate, audio, audio_fps, preset, audio_nbytes, audio_codec, audio_bitrate, audio_bufsize, temp_audiofile, rewrite_audio, remove_temp, write_logfile, verbose, threads, ffmpeg_params, logger)
291 logger(message="Moviepy - Building video %s." % filename)
292 if make_audio:
--> 293 self.audio.write_audiofile(audiofile, audio_fps,
294 audio_nbytes, audio_bufsize,
295 audio_codec, bitrate=audio_bitrate,
<decorator-gen-161> in write_audiofile(self, filename, fps, nbytes, buffersize, codec, bitrate, ffmpeg_params, write_logfile, verbose, logger)
~/Anaconda3/lib/python3.8/site-packages/moviepy/decorators.py in requires_duration(f, clip, *a, **k)
52 raise ValueError("Attribute 'duration' not set")
53 else:
---> 54 return f(clip, *a, **k)
55
56
~/Anaconda3/lib/python3.8/site-packages/moviepy/audio/AudioClip.py in write_audiofile(self, filename, fps, nbytes, buffersize, codec, bitrate, ffmpeg_params, write_logfile, verbose, logger)
204 "parameter in write_audiofile.")
205
--> 206 return ffmpeg_audiowrite(self, filename, fps, nbytes, buffersize,
207 codec=codec, bitrate=bitrate,
208 write_logfile=write_logfile, verbose=verbose,
<decorator-gen-125> in ffmpeg_audiowrite(clip, filename, fps, nbytes, buffersize, codec, bitrate, write_logfile, verbose, ffmpeg_params, logger)
~/Anaconda3/lib/python3.8/site-packages/moviepy/decorators.py in requires_duration(f, clip, *a, **k)
52 raise ValueError("Attribute 'duration' not set")
53 else:
---> 54 return f(clip, *a, **k)
55
56
~/Anaconda3/lib/python3.8/site-packages/moviepy/audio/io/ffmpeg_audiowriter.py in ffmpeg_audiowrite(clip, filename, fps, nbytes, buffersize, codec, bitrate, write_logfile, verbose, ffmpeg_params, logger)
164 ffmpeg_params=ffmpeg_params)
165
--> 166 for chunk in clip.iter_chunks(chunksize=buffersize,
167 quantize=True,
168 nbytes=nbytes, fps=fps,
~/Anaconda3/lib/python3.8/site-packages/moviepy/audio/AudioClip.py in iter_chunks(self, chunksize, chunk_duration, fps, quantize, nbytes, logger)
83 assert(size <= chunksize)
84 tt = (1.0/fps)*np.arange(pospos[i], pospos[i+1])
---> 85 yield self.to_soundarray(tt, nbytes=nbytes, quantize=quantize,
86 fps=fps, buffersize=chunksize)
87
<decorator-gen-160> in to_soundarray(self, tt, fps, quantize, nbytes, buffersize)
~/Anaconda3/lib/python3.8/site-packages/moviepy/decorators.py in requires_duration(f, clip, *a, **k)
52 raise ValueError("Attribute 'duration' not set")
53 else:
---> 54 return f(clip, *a, **k)
55
56
~/Anaconda3/lib/python3.8/site-packages/moviepy/audio/AudioClip.py in to_soundarray(self, tt, fps, quantize, nbytes, buffersize)
125 #print tt.max() - tt.min(), tt.min(), tt.max()
126
--> 127 snd_array = self.get_frame(tt)
128
129 if quantize:
<decorator-gen-127> in get_frame(self, t)
~/Anaconda3/lib/python3.8/site-packages/moviepy/decorators.py in wrapper(f, *a, **kw)
87 new_kw = {k: fun(v) if k in varnames else v
88 for (k,v) in kw.items()}
---> 89 return f(*new_a, **new_kw)
90 return decorator.decorator(wrapper)
91
~/Anaconda3/lib/python3.8/site-packages/moviepy/Clip.py in get_frame(self, t)
91 return frame
92 else:
---> 93 return self.make_frame(t)
94
95 def fl(self, fun, apply_to=None, keep_duration=True):
~/Anaconda3/lib/python3.8/site-packages/moviepy/audio/AudioClip.py in make_frame(t)
294 played_parts = [c.is_playing(t) for c in self.clips]
295
--> 296 sounds = [c.get_frame(t - c.start)*np.array([part]).T
297 for c, part in zip(self.clips, played_parts)
298 if (part is not False)]
~/Anaconda3/lib/python3.8/site-packages/moviepy/audio/AudioClip.py in <listcomp>(.0)
294 played_parts = [c.is_playing(t) for c in self.clips]
295
--> 296 sounds = [c.get_frame(t - c.start)*np.array([part]).T
297 for c, part in zip(self.clips, played_parts)
298 if (part is not False)]
<decorator-gen-127> in get_frame(self, t)
~/Anaconda3/lib/python3.8/site-packages/moviepy/decorators.py in wrapper(f, *a, **kw)
87 new_kw = {k: fun(v) if k in varnames else v
88 for (k,v) in kw.items()}
---> 89 return f(*new_a, **new_kw)
90 return decorator.decorator(wrapper)
91
~/Anaconda3/lib/python3.8/site-packages/moviepy/Clip.py in get_frame(self, t)
91 return frame
92 else:
---> 93 return self.make_frame(t)
94
95 def fl(self, fun, apply_to=None, keep_duration=True):
~/Anaconda3/lib/python3.8/site-packages/moviepy/Clip.py in <lambda>(t)
134
135 #mf = copy(self.make_frame)
--> 136 newclip = self.set_make_frame(lambda t: fun(self.get_frame, t))
137
138 if not keep_duration:
~/Anaconda3/lib/python3.8/site-packages/moviepy/Clip.py in <lambda>(gf, t)
185 apply_to = []
186
--> 187 return self.fl(lambda gf, t: gf(t_func(t)), apply_to,
188 keep_duration=keep_duration)
189
<decorator-gen-127> in get_frame(self, t)
~/Anaconda3/lib/python3.8/site-packages/moviepy/decorators.py in wrapper(f, *a, **kw)
87 new_kw = {k: fun(v) if k in varnames else v
88 for (k,v) in kw.items()}
---> 89 return f(*new_a, **new_kw)
90 return decorator.decorator(wrapper)
91
~/Anaconda3/lib/python3.8/site-packages/moviepy/Clip.py in get_frame(self, t)
91 return frame
92 else:
---> 93 return self.make_frame(t)
94
95 def fl(self, fun, apply_to=None, keep_duration=True):
~/Anaconda3/lib/python3.8/site-packages/moviepy/Clip.py in <lambda>(t)
134
135 #mf = copy(self.make_frame)
--> 136 newclip = self.set_make_frame(lambda t: fun(self.get_frame, t))
137
138 if not keep_duration:
~/Anaconda3/lib/python3.8/site-packages/moviepy/Clip.py in <lambda>(gf, t)
185 apply_to = []
186
--> 187 return self.fl(lambda gf, t: gf(t_func(t)), apply_to,
188 keep_duration=keep_duration)
189
<decorator-gen-127> in get_frame(self, t)
~/Anaconda3/lib/python3.8/site-packages/moviepy/decorators.py in wrapper(f, *a, **kw)
87 new_kw = {k: fun(v) if k in varnames else v
88 for (k,v) in kw.items()}
---> 89 return f(*new_a, **new_kw)
90 return decorator.decorator(wrapper)
91
~/Anaconda3/lib/python3.8/site-packages/moviepy/Clip.py in get_frame(self, t)
91 return frame
92 else:
---> 93 return self.make_frame(t)
94
95 def fl(self, fun, apply_to=None, keep_duration=True):
~/Anaconda3/lib/python3.8/site-packages/moviepy/audio/io/AudioFileClip.py in <lambda>(t)
75 self.buffersize = self.reader.buffersize
76
---> 77 self.make_frame = lambda t: self.reader.get_frame(t)
78 self.nchannels = self.reader.nchannels
79
~/Anaconda3/lib/python3.8/site-packages/moviepy/audio/io/readers.py in get_frame(self, tt)
168 # Check that the requested time is in the valid range
169 if not in_time.any():
--> 170 raise IOError("Error in file %s, "%(self.filename)+
171 "Accessing time t=%.02f-%.02f seconds, "%(tt[0], tt[-1])+
172 "with clip duration=%d seconds, "%self.duration)
OSError: Error in file ../Rus_sound/01.mp3, Accessing time t=1497.05-1497.09 seconds, with clip duration=1497 seconds,
chunk: 100%|█████████▉| 34556/34565 [01:53<00:00, 254.57it/s, now=None]