Hatena::ブログ(Diary)

徒手空拳日記 Twitter

2010-10-05

Mplayer: 字幕以外のところを飛ばして再生。

http://code.activestate.com/recipes/542195-access-mplayer-slave-mode-from-python/

を使って、 mplayer を slave モードで動かし、python から操作する。

「何秒間再生」がわからなかったので、system の sleep で代用。

MAX_SPACE 秒以下の間隔は無視して連続再生する。

mplayer.py に統合して、クラスのメソッドとして書いた方がいい気はする。

MAX_SPACE=5

from pysrt import SubRipFile, SubRipItem, SubRipTime
import sys,os, mplayer
from copy import deepcopy


# paths
path_to_srt = os.path.abspath(sys.argv[1])
# paths
path_to_video = os.path.abspath(sys.argv[2])

# Open .srt file
subs = SubRipFile.open(path_to_srt, "utf-8")
SubRipFile.fixindex_0(subs) # Fix subs so that the index of each element matches their actual index 

st = subs[0].start
ed = subs[0].end


SECONDS_RATIO = 1000000
MINUTES_RATIO = SECONDS_RATIO * 60
HOURS_RATIO = MINUTES_RATIO * 60

def second(t):
    ordinal = t.hour * HOURS_RATIO \
              + t.minute * MINUTES_RATIO \
              + t.second * SECONDS_RATIO \
              + t.microsecond
    return float(ordinal)/SECONDS_RATIO

s = SubRipTime(0,0,10,500)
tm = s.to_time()
print second(tm)

mp = mplayer.MPlayer()
mp.command('loadfile', path_to_video)
# mp.command('sub_load', path_to_srt)

for i, sub in enumerate(subs[1:]): # Skip the first and last
    if i < len(subs)-1:
#    if i < 20:
        if sub.start - ed > SubRipTime(0,0,MAX_SPACE,0):
            one = SubRipTime(0,0,1,0)
            mp.command('seek %f 2' % second( (st-one).to_time()))
            print second( (ed-st).to_time() )
            os.system('sleep %f' % second( (ed-st+one).to_time() ))
            st = sub.start
            ed = sub.end
        else:
            ed = sub.end
    else:
        ed = sub.end
        mp.command('seek %f 2' % second( (st-one).to_time()))
        print second( (ed-st).to_time() )
        os.system('sleep %f' % second( (ed-st+one).to_time() ))
        

mp.command('quit')
        #print command
        

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/matoge/20101005/1286285679