#1 Le 11/02/2016, à 19:24
- k3c
[script Python] décaler des sous-titres
Bonjour
Je récupère des fichiers de sous-titres, mais il arrive qu'ils soient décalés par rapport à la vidéo, à cause de coupures pub ou autre raison.
Le script qui suit s'utilise de la façon suivant
python shiftsubtitle.py 1-7317-0035-001_PC01800_16X9.srt 1058 40
il prend donc
en premier paramètre un fichier de sous-titres
en second paramètre la numéro de la ligne dans le fichier de sous titres
en troisième paramètre le décalage, en dixième de secondes, donc 40 -> avancer de 4 secondes, et -5 reculer d'une demie seconde
Exemple de la structure d'un fichier de sous-titres
1
00:00:19,520 --> 00:00:22,800
Welcome to sheer beauty.
2
00:00:56,920 --> 00:00:58,880
Canape?
No, thank you.
3
00:01:12,240 --> 00:01:13,840
Ladies and gentlemen.
le script affiche l'heure du dernier décalage, ce qui permet lancer la vidéo et aller directement voir si c'est correctement synchronisé
#-*- coding:utf-8 -*-
from datetime import datetime, timedelta
import sys
import codecs
from pprint import pprint
class subtitle(object):
def __init__(self, idsub, start, end, txt):
self.idsub = idsub
self.start = datetime.strptime(start, "%H:%M:%S,%f")
self.end = datetime.strptime(end, "%H:%M:%S,%f")
self.txt = txt
def __repr__(self):
return "%s %s %s %s" % (self.idsub, self.start.time(), self.end.time(),
self.txt)
def shift(self, delta):
self.start += delta
self.end += delta
def shift_time(subtitles, delta):
for s in subtitles:
s.shift(delta)
fn = sys.argv[1]
startid = int(sys.argv[2])
delta = int(sys.argv[3])
second = delta / 10
subsec = delta % 10
delta = timedelta(0, second, subsec * 100000)
print fn, startid, delta
fno = fn + '.srt'
f = codecs.open(fn, 'r', 'utf-8-sig')
subtitles = []
state = 1
for line in f:
line = line[:-2]
if line == u'':
state = 5
if state == 1:
txt = []
idsub = int(line)
elif state == 2:
start, end = line.split(u'-->')
elif state == 5:
subtitles.append(subtitle(idsub, start[:-1], end[1:], txt))
state = 0
else:
txt.append(line)
state += 1
f.close()
shift_time(subtitles, delta)
f = codecs.open(fno, 'w', 'utf-8-sig')
for s in subtitles:
if startid == s.idsub:
print s.start.time()
f.write(u'%s' % s.idsub)
f.write('\r\n')
f.write(s.start.time().strftime('%H:%M:%S,%f')[:-3])
f.write(' --> ')
f.write(s.end.time().strftime('%H:%M:%S,%f')[:-3])
f.write('\r\n')
for t in s.txt:
f.write(t)
f.write('\r\n')
f.write('\r\n')
f.close()
Dernière modification par k3c (Le 11/02/2016, à 19:27)
Debian 12 sur Thinkpad reconditionné
Hors ligne