Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 11/02/2016, à 20: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, à 20:27)


Archlinux sur Xiaomi Air 13

Hors ligne