OSError: [WinError 6] 句柄无效 Python 3.10 Windows moviepy
我正在尝试使用MoviePy制作一个视频剪辑,但遇到了一个错误 OSError: [WinError 6]
我使用的是Windows 11,Python 3.10.11。我正在尝试复制的方法是这个:(完整的github链接在这里)
def clip(
content: str,
video_file: str,
outfile: str,
image_file: str = '',
offset: int = 0,
duration: int = 0):
"""
Generate the Complete Clip
content: str - Full content text
video_file: str - Background video
outfile: str - Filename of output
image_file: str - Banner to display
offset: int - Offset starting point of background video (default: 0)
duration: int - Limit the video (default: audio length)
"""
audio_comp, text_comp = generate_audio_text(split_text(content))
audio_comp_list = []
for audio_file in track(audio_comp, description='Stitching Audio...'):
audio_comp_list.append(AudioFileClip(audio_file))
audio_comp_stitch = concatenate_audioclips(audio_comp_list)
audio_comp_stitch.write_audiofile('temp_audio.mp3', fps=44100)
audio_duration = audio_comp_stitch.duration
if duration == 0:
duration = audio_duration
audio_comp_stitch.close()
vid_clip = VideoFileClip(video_file).subclip(offset, offset + duration)
vid_clip = vid_clip.resize((1980, 1280))
vid_clip = vid_clip.crop(x_center=1980 / 2, y_center=1280 / 2, width=720, height=1280)
if image_file != '':
image_clip = ImageClip(image_file).set_duration(duration).set_position(("center", 'center')).resize(0.8) # Adjust if the Banner is too small
vid_clip = CompositeVideoClip([vid_clip, image_clip])
vid_clip = CompositeVideoClip([vid_clip, concatenate_videoclips(text_comp).set_position(('center', 860))])
vid_clip = vid_clip.set_audio(AudioFileClip('temp_audio.mp3').subclip(0, duration))
vid_clip.write_videofile(outfile, audio_codec='aac')
vid_clip.close()
我的代码非常简单,长这样:
clip1 = TextClip(
txt="test",
font="Komika", # Change Font if not found
fontsize=32,
color="white",
align="center",
method="caption",
size=(660, None),
stroke_width=2,
stroke_color="black",
)
clip2 = TextClip(
txt="webos",
font="Komika", # Change Font if not found
fontsize=32,
color="white",
align="center",
method="caption",
size=(660, None),
stroke_width=2,
stroke_color="black",
)
conc = concatenate_videoclips([clip1, clip2]).set_position(("center", 860))
问题出现在连接视频的那一行代码上。
错误信息是:
PS C:\Users\ernes\OneDrive\Desktop\Bots\autocap\autocap_with_mp3> python .\autocap_with_mp3.py text.txt
Traceback (most recent call last):
File "C:\Users\ernes\OneDrive\Desktop\Bots\autocap\autocap_with_mp3\autocap_with_mp3.py", line 218, in <module>
main()
File "C:\Users\ernes\OneDrive\Desktop\Bots\autocap\autocap_with_mp3\autocap_with_mp3.py", line 207, in main
generate_video(
File "C:\Users\ernes\OneDrive\Desktop\Bots\autocap\autocap_with_mp3\autocap_with_mp3.py", line 165, in generate_video
conc = concatenate_videoclips([clip1, clip2]).set_position(("center", 860))
File "C:\Users\ernes\AppData\Local\Programs\Python\Python310\lib\site-packages\moviepy\video\compositing\concatenate.py", line 71, in concatenate_videoclips
tt = np.cumsum([0] + [c.duration for c in clips])
File "C:\Users\ernes\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\core\fromnumeric.py", line 2586, in cumsum
return _wrapfunc(a, 'cumsum', axis=axis, dtype=dtype, out=out)
File "C:\Users\ernes\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\core\fromnumeric.py", line 56, in _wrapfunc
return _wrapit(obj, method, *args, **kwds)
File "C:\Users\ernes\AppData\Local\Programs\Python\Python310\lib\site-packages\numpy\core\fromnumeric.py", line 45, in _wrapit
result = getattr(asarray(obj), method)(*args, **kwds)
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
Exception ignored in: <function FFMPEG_AudioReader.__del__ at 0x000001E727215120>
Traceback (most recent call last):
File "C:\Users\ernes\AppData\Local\Programs\Python\Python310\lib\site-packages\moviepy\audio\io\readers.py", line 254, in __del__
self.close_proc()
File "C:\Users\ernes\AppData\Local\Programs\Python\Python310\lib\site-packages\moviepy\audio\io\readers.py", line 149, in close_proc
self.proc.terminate()
File "C:\Users\ernes\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1589, in terminate
_winapi.TerminateProcess(self._handle, 1)
OSError: [WinError 6] The handle is invalid
PS C:\Users\ernes\OneDrive\Desktop\Bots\autocap\autocap_with_mp3>
我尝试关闭了代码中使用的 vid_clip
变量和音频剪辑,但似乎没有什么效果。
我想在不使用多线程的情况下解决这个问题,因为我看到了一些涉及多线程的解决方案,但我觉得在我的情况下并不需要这样做。
1 个回答
0
我代码的主要问题是,TextClips
必须严格定义一个持续时间。也就是说,要么通过 set_duration()
来设置,要么同时设置开始和结束时间。
我遇到的问题是,在调用 set_start
之后,没有使用 set_end
来设置结束时间。