为什么当我尝试在 moviepy 中向视频添加音频文件时出现错误?

时间:2021-04-09 23:35:04

标签: python moviepy

我想使用 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]

0 个答案:

没有答案