CompositeVideoClip错误 - Python 3.14 - moviepy 2.2.1

编程语言 2026-07-12

我想运行一个简单的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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章