CompositeVideoClip错误 - Python 3.14 - moviepy 2.2.1
我想运行一个简单的moviepy(版本2.2.1)示例,在其中把视频切成片段以便逐个编辑,但单纯切成片段再重新拼接时遇到了一些问题:
import moviepy as mp
clip = mp.VideoFileClip('test4.mp4')
fps = clip.fps
c0 = 2
c1 = 4
clip1 = clip.subclipped(0, c0)
clip2 = clip.subclipped(c0, c1)
clip3 = clip.subclipped(c1, clip.end)
clip = mp.CompositeVideoClip([clip1, clip2, clip3])
clip1.close()
clip2.close()
clip3.close()
clip.write_videofile('test_out.mp4', threads=8)
clip.close()
结果是一长串的回溯信息:
MoviePy - Building video test_out.mp4.
MoviePy - Writing audio in test_outTEMP_MPY_wvf_snd.mp3
chunk: 0%| | 0/409 [00:00<?, ?it/s, now=None]Traceback (most recent call last):
File "test.py", line 24, in <module>
clip.write_videofile('test_out.mp4', threads=8)
~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "PYTHON_PATH\Python314\Lib\site-packages\decorator.py", line 235, in fun
return caller(func, *(extras + args), **kw)
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\decorators.py", line 53, in requires_duration
return func(clip, *args, **kwargs)
File "PYTHON_PATH\Python314\Lib\site-packages\decorator.py", line 235, in fun
return caller(func, *(extras + args), **kw)
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\decorators.py", line 153, in wrapper
return func(clip, *new_args, **new_kwargs)
File "PYTHON_PATH\Python314\Lib\site-packages\decorator.py", line 235, in fun
return caller(func, *(extras + args), **kw)
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\decorators.py", line 24, in convert_masks_to_RGB
return func(clip, *args, **kwargs)
File "PYTHON_PATH\Python314\Lib\site-packages\decorator.py", line 235, in fun
return caller(func, *(extras + args), **kw)
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\decorators.py", line 102, in wrapper
return func(*new_args, **new_kwargs)
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\video\VideoClip.py", line 379, in write_videofile
self.audio.write_audiofile(
~~~~~~~~~~~~~~~~~~~~~~~~~~^
audiofile,
^^^^^^^^^^
...<6 lines>...
logger=logger,
^^^^^^^^^^^^^^
)
^
File "PYTHON_PATH\Python314\Lib\site-packages\decorator.py", line 235, in fun
return caller(func, *(extras + args), **kw)
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\decorators.py", line 53, in requires_duration
return func(clip, *args, **kwargs)
File "PYTHON_PATH\Python314\Lib\site-packages\decorator.py", line 235, in fun
return caller(func, *(extras + args), **kw)
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\decorators.py", line 102, in wrapper
return func(*new_args, **new_kwargs)
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\audio\AudioClip.py", line 258, in write_audiofile
return ffmpeg_audiowrite(
self,
...<8 lines>...
logger=logger,
)
File "PYTHON_PATH\Python314\Lib\site-packages\decorator.py", line 235, in fun
return caller(func, *(extras + args), **kw)
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\decorators.py", line 53, in requires_duration
return func(clip, *args, **kwargs)
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\audio\io\ffmpeg_audiowriter.py", line 220, in ffmpeg_audiowrite
for chunk in clip.iter_chunks(
~~~~~~~~~~~~~~~~^
chunksize=buffersize, quantize=True, nbytes=nbytes, fps=fps, logger=logger
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
):
^
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\audio\AudioClip.py", line 112, in iter_chunks
yield self.to_soundarray(
~~~~~~~~~~~~~~~~~~^
timings, nbytes=nbytes, quantize=quantize, fps=fps, buffersize=chunksize
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "PYTHON_PATH\Python314\Lib\site-packages\decorator.py", line 235, in fun
return caller(func, *(extras + args), **kw)
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\decorators.py", line 53, in requires_duration
return func(clip, *args, **kwargs)
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\audio\AudioClip.py", line 160, in to_soundarray
snd_array = self.get_frame(tt)
File "PYTHON_PATH\Python314\Lib\site-packages\decorator.py", line 235, in fun
return caller(func, *(extras + args), **kw)
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\decorators.py", line 102, in wrapper
return func(*new_args, **new_kwargs)
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\Clip.py", line 87, in get_frame
return self.frame_function(t)
~~~~~~~~~~~~~~~~~~~^^^
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\audio\AudioClip.py", line 410, in frame_function
clip.get_frame(t - clip.start) * np.array([part]).T
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
File "PYTHON_PATH\Python314\Lib\site-packages\decorator.py", line 235, in fun
return caller(func, *(extras + args), **kw)
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\decorators.py", line 102, in wrapper
return func(*new_args, **new_kwargs)
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\Clip.py", line 87, in get_frame
return self.frame_function(t)
~~~~~~~~~~~~~~~~~~~^^^
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\Clip.py", line 130, in <lambda>
new_clip = self.with_updated_frame_function(lambda t: func(self.get_frame, t))
~~~~^^^^^^^^^^^^^^^^^^^
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\Clip.py", line 186, in <lambda>
lambda get_frame, t: get_frame(time_func(t)),
~~~~~~~~~^^^^^^^^^^^^^^
File "PYTHON_PATH\Python314\Lib\site-packages\decorator.py", line 235, in fun
return caller(func, *(extras + args), **kw)
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\decorators.py", line 102, in wrapper
return func(*new_args, **new_kwargs)
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\Clip.py", line 87, in get_frame
return self.frame_function(t)
~~~~~~~~~~~~~~~~~~~^^^
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\audio\io\AudioFileClip.py", line 78, in <lambda>
self.frame_function = lambda t: self.reader.get_frame(t)
~~~~~~~~~~~~~~~~~~~~~^^^
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\audio\io\readers.py", line 235, in get_frame
self.buffer_around(fr_max)
~~~~~~~~~~~~~~~~~~^^^^^^^^
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\audio\io\readers.py", line 281, in buffer_around
array = self.read_chunk(chunksize)
File "PYTHON_PATH\Python314\Lib\site-packages\moviepy\audio\io\readers.py", line 155, in read_chunk
s = self.proc.stdout.read(self.nchannels * chunksize * self.nbytes)
^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'stdout'
有没有人知道可能的原因是什么?当我移除subclip/CompositeVideoClip部分时,我能够读取一个片段并将其写出。
解决方案
感谢 @furas——在调用write_videofile之后关闭子片段解决了这个问题。
调整后的代码:
import moviepy as mp
clip = mp.VideoFileClip('test4.mp4')
fps = clip.fps
c0 = 2
c1 = 4
clip1 = clip.subclipped(0, c0)
clip2 = clip.subclipped(c0, c1)
clip3 = clip.subclipped(c1, clip.end)
clip = mp.CompositeVideoClip([clip1, clip2, clip3])
clip.write_videofile('test_out.mp4', threads=8)
clip1.close()
clip2.close()
clip3.close()
clip.close()
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。