miércoles, 27 de noviembre de 2013

Sincronizar subtitulos .srt (script en perl)

Me ha pasado que quiero ver Películas/Series con subtitulos y que no encuentras el subtitulo exacto para tu archivo de vídeo,  pero en cambio encuentras otro subtitulo de la misma serie pero no coinciden los tiempos del video con los subtitulos.

Para solucionar este problema podemos usar un script desarrollado en PERL, que encontré en el blog Matt's Musings con el cual podemos adelantar ó atrasar los tiempos de los subtitulos muy fácilmente.

Ejemplo de uso:
cat The.Bridge.US.S01E05.srt | /home/villatux/sync_subtitles.pl -t +12s > newsubs3.srt

donde  "+12s"  significa que se vá a adelantar 12 segundos,  si quieres atrasar tus subtitulos debes poner el tiempo que desees con signo negativo.

Les paso el código del script: 

#!/usr/bin/perl

use strict;
use Getopt::Long;
my %scales =  ( 'h' => 3600000,
                'm' => 60000,
                's' => 1000,
                'u' => 0,
              );

my ($opt_t);
GetOptions ( "t=s" => \$opt_t, "time"      => \$opt_t,
           );

if ( $opt_t )
{
  my $sign  = substr($opt_t,0,1);
  my $scale = substr($opt_t,length($opt_t)-1, 1);
  my $time  = int(substr($opt_t,1,length($opt_t)-2));

  if ( $sign !~ /[+-]/ || $scale !~ /[hmsu]/ )
  {
    die "Time should be [+-]";
  }

  if ( $scales{$scale} )
  {
    $time = $time * $scales{$scale};
  }

  if ( $sign =~ /-/ )
  {
    $time *= -1;
  }

  while ()
  {
    # 00:01:09,040 --> 00:01:11,713
    if ( /(\d\d):(\d\d):(\d\d),(\d+)\s+-->\s+(\d\d):(\d\d):(\d\d),(\d+)/ )
    {
      my ($sh,$sm,$ss,$su,$eh,$em,$es,$eu) = ($1,$2,$3,$4,$5,$6,$7,$8,$9);

      my $s = ($su + ($ss * $scales{'s'}) + ($sm * $scales{'m'}) + ($sh * $scales{'h'})) + $time;
      my $e = ($eu + ($es * $scales{'s'}) + ($em * $scales{'m'}) + ($eh * $scales{'h'})) + $time;

      my $rt = 0;
      $sh    = int($s/$scales{'h'});
      $rt   += ($sh * $scales{'h'});

      $sm    = int(($s - $rt) / $scales{'m'});
      $rt   += ($sm * $scales{'m'});

      $ss    = int(($s - $rt) / $scales{'s'});
      $rt   += ($ss * $scales{'s'});

      $su    = ($s - $rt);

      $rt    = 0;
      $eh    = int($e/$scales{'h'});
      $rt   += ($eh * $scales{'h'});

      $em    = int(($e - $rt) / $scales{'m'});
      $rt   += ($em * $scales{'m'});

      $es    = int(($e - $rt) / $scales{'s'});
      $rt   += ($es * $scales{'s'});

      $eu    = ($e - $rt);

      printf "%02d:%02d:%02d,%03d --> %02d:%02d:%02d,%03d\n", $sh,$sm,$ss,$su,$eh,$em,$es,$eu;
    }
    else
    {
      print $_;
    }
  }
}
else
{
  print "You need to specify time offset\n";
}
#FIN DEL SCRIPT


Espero les sirva de algo :p

2 comentarios:

Spooky dijo...

g o h en VLC :-P

Anónimo dijo...

Nice nice, si esta mucho muy util, saudos mi tux.

Lukaz