この例に従って、ムービークリップに字幕を追加する方法を試してみました:
from moviepy.video.tools.subtitles import SubtitlesClip
from moviepy.video.io.VideoFileClip import VideoFileClip
subs = [((0, 3), 'sub1'),
((3, 7), 'sub2'),
((9, 11), 'sub3'),
((11, 16), 'sub4')]
subtitles = SubtitlesClip(subs)
clip = VideoFileClip(video_fname)
video = movedit.CompositeVideoClip([clip, subtitles])
video.to_videofile(output_video_name)
しかし、出力されたムービーには字幕がありませんでした。私は何か間違ったことをしていますか?ところで、subtitles.pyは python 3 では動作しません。このコード行は
subtitles = [(map(cvsecs, tt),txt) for tt, txt in subtitles]
に変更する必要があります
subtitles = [(list(map(cvsecs, tt),txt)) for tt, txt in subtitles]
編集
最終的に、難しい方法で字幕を作成しました。
from moviepy import editor
import os.path as op
def annotate(clip, txt, txt_color='red', fontsize=50, font='Xolonium-Bold'):
""" Writes a text at the bottom of the clip. """
txtclip = editor.TextClip(txt, fontsize=fontsize, font=font, color=txt_color)
cvc = editor.CompositeVideoClip([clip, txtclip.set_pos(('center', 'bottom'))])
return cvc.set_duration(clip.duration)
video = editor.VideoFileClip(op.join(movie_fol, movie_name))
subs = [((0, 4), 'subs1'),
((4, 9), 'subs2'),
((9, 12), 'subs3'),
((12, 16), 'subs4')]
annotated_clips = [annotate(video.subclip(from_t, to_t), txt) for (from_t, to_t), txt in subs]
final_clip = editor.concatenate_videoclips(annotated_clips)
final_clip.write_videofile(op.join(movie_fol, out_movie_name))
完璧ではありません。字幕なしで時間範囲をサポートするなど、まだ改善の余地がありますが、問題は解決しました。