使用MoviePy添加字幕预览视频时出现AttributeError错误求助
解决MoviePy添加字幕预览时的
AttributeError: 'CompositeAudioClip' object has no attribute 'fps'错误 问题描述
使用MoviePy为视频添加字幕并预览时,触发以下错误:
AttributeError: 'CompositeAudioClip' object has no attribute 'fps'
完整报错栈如下:
Exception in thread Thread-10 (preview): Traceback (most recent call last): File "C:\Users\kian\AppData\Local\Programs\Python\Python311\Lib\threading.py", line 1038, in _bootstrap_inner self.run() File "C:\Users\kian\AppData\Local\Programs\Python\Python311\Lib\threading.py", line 975, in run self._target(*self._args, **self._kwargs) File "<decorator-gen-118>", line 2, in preview File "C:\Users\kian\AppData\Local\Programs\Python\Python311\Lib\site-packages\moviepy\decorators.py", line 54, in requires_duration return f(clip, *a, **k) ^^^^^^^^^^^^^^^^ File "C:\Users\kian\AppData\Local\Programs\Python\Python311\Lib\site-packages\moviepy\audio\io\preview.py", line 49, in preview sndarray = clip.to_soundarray(tt, nbytes=nbytes, quantize=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "<decorator-gen-62>", line 2, in to_soundarray File "C:\Users\kian\AppData\Local\Programs\Python\Python311\Lib\site-packages\moviepy\decorators.py", line 54, in requires_duration return f(clip, *a, **k) ^^^^^^^^^^^^^^^^ File "C:\Users\kian\AppData\Local\Programs\Python\Python311\Lib\site-packages\moviepy\audio\AudioClip.py", line 107, in to_soundarray fps = self.fps ^^^^^^^^ AttributeError: 'CompositeAudioClip' object has no attribute 'fps'
单独预览原视频正常,但合成字幕的复合视频无法预览,仅能保存后用第三方播放器打开。
问题原因
当使用CompositeVideoClip合成原视频与字幕时,生成的复合音频对象CompositeAudioClip未自动继承原视频的音频帧率(fps)属性,而预览函数处理音频时需要读取该属性,从而触发报错。
解决方案
方案1:预览时直接传入原视频的帧率
修改预览代码行,直接使用原视频的帧率参数,避免访问复合视频的fps属性:
composite_clip.preview(fps=video_clip.fps)
完整修改后的代码
from moviepy.editor import * from moviepy.video.tools.subtitles import SubtitlesClip # 加载视频片段 video_clip = VideoFileClip("H:/movie/A.Quiet place/1.mkv") # 定义字幕文本生成器 def txt_gen(txt): return TextClip(txt, font='Times new roman - bold', fontsize=36, color='white') # 设置字幕时间与内容 sub_start_time = 0.2 sub_end_time = 5 sub_text = "This is the subtitle text" subs = [((sub_start_time, sub_end_time), sub_text)] # 创建字幕剪辑 subtitles = SubtitlesClip(subs, txt_gen) subtitles = subtitles.set_pos(('center', 'bottom')) # 合成视频与字幕 composite_clip = CompositeVideoClip([video_clip, subtitles]) # 使用原视频帧率预览复合视频 composite_clip.preview(fps=video_clip.fps) # 关闭预览窗口 composite_clip.close()
方案2:显式设置复合音频的帧率
在创建复合视频后,手动为其音频部分设置帧率:
composite_clip.audio.fps = video_clip.audio.fps
之后再调用composite_clip.preview()即可正常预览。
补充说明
复合视频保存为文件时无需额外处理,write_videofile()方法会自动识别并使用原视频的音频参数,仅预览场景需要手动指定帧率。
内容的提问来源于stack exchange,提问作者Kian Farooghi
相关产品推荐
相关产品推荐

