2010-10-15
スピードラーニング
スピードラーニングっぽいクリップ集を作るスクリプト。必要なのは、
英語字幕はセリフを選択するとともに、タイミングを同期するため。DVD などから取り出してもとから同期している場合は、一つでいい。基本的に英語のタイミングに合わせて日本語が吹き替えられている事が多いので、再生時間に関しては問題なし。日本語動画用英語字幕と、英語字幕は、タイミングはずれていてもいいが、字幕の内容は同じにしとく。
後は、ffmpeg を使って、可変フレームレートの場合は、固定に直し、(こうしないと、すごく切り出しに時間がかかる。この辺についてはよくわからない)、字幕情報をもとに日本語英語のセットを切り出していく。
動画はあんまり必要ないかもしれない。一度見てれば思い出せるし、音声だけの方が携帯用にいい(ipad はいまのところまともに動画が再生出来ない)。
わざわざ second という関数をつくって、time オブジェクトを秒数に直しているのは、そのまま使うとずれが出るから。おそらくフォーマットの関係だと思うけど、こっちの方がロバストに動く。
ほんとは DVD の字幕を直接ひっぱって来たいと思って探したら、transcode というのがあるらしい。次はこれを使ってみよう。
from pysrt import SubRipFile, SubRipItem, SubRipTime import os, sys path_to_srt = os.path.abspath(sys.argv[1]) path_to_video = os.path.abspath(sys.argv[2]) path_to_srt2 = os.path.abspath(sys.argv[3]) path_to_video2 = os.path.abspath(sys.argv[4]) path_to_dir = os.path.split(path_to_srt)[0] subs = SubRipFile.open(path_to_srt) subs2 = SubRipFile.open(path_to_srt2) def second(t): t = t.to_time() SECONDS_RATIO = 1000000 MINUTES_RATIO = SECONDS_RATIO * 60 HOURS_RATIO = MINUTES_RATIO * 60 ordinal = t.hour * HOURS_RATIO \ + t.minute * MINUTES_RATIO \ + t.second * SECONDS_RATIO \ + t.microsecond return float(ordinal)/SECONDS_RATIO # Pre-Encoding tmpfile = os.path.join(path_to_dir, "tmp.avi") tmpfile2 = os.path.join(path_to_dir, "tmp2.avi") os.system("ffmpeg -y -r 30 -i %(video)s %(name)s.mp4" % {'video':path_to_video, 'name':tmpfile}) os.system("ffmpeg -y -r 30 -i %(video)s %(name)s.mp4" % {'video':path_to_video2, 'name':tmpfile2}) for i, sub in enumerate(subs): st = second(sub.start) dur = second(sub.end-sub.start)+0.5 name = '%03d_' % i + os.path.splitext(os.path.split(path_to_srt)[1])[0] os.system("ffmpeg -y -ss %(st)f -t %(dur)f -i %(video)s %(name)s.mp4" % {'video':tmpfile, 'st':st, 'dur':dur, 'name':name}) os.system("mplayer %s.avi" % name) sub2 = subs2[i] st2 = second(sub2.start) dur2 = second(sub2.end-sub2.start) name2 = '%03d_' % i + os.path.splitext(os.path.split(path_to_srt2)[1])[0] os.system("ffmpeg -y -ss %(st2)f -t %(dur2)f -i %(video)s %(name2)s.avi" % {'video':tmpfile2, 'st2':st2, 'dur2':dur2, 'name2':name2}) os.system("mplayer %s.avi" % name2)
トラックバック - http://d.hatena.ne.jp/matoge/20101015/1287127716