Convertir Subs

Bueno siempre estoy poniendo post de series o personales y esto parece casi un blog rosa xD. Vamos a poner algo interesante esta vez.

Me estoy bajando una serie (Gilmore Girls), y resulta que los subs que hay en español estan realizados para un video de 25fps (video en español vamos), diría que los que los hicieron no fueron muy agiles, pues el video que hay compartido en la mula es claramente los dvd’s en ingles y si quieres subs lo lógico es que sean para el video en ingles, el cual esta a diferente fps, por lo tanto habrá desincronización.

La solución es convertir los tiempos, hay un programa para windows que lo hace, pero como no quiero usar windows, me he hecho un programita simple, pero útil. Es en ANSI C y se compila con un tipico “gcc fichero.c -o NombreEjecutable” luego para usarlo simplemente “NombreEjecutable FICHERO_ENTRADA FICHERO_SALIDA”. Hay un par de Define’s que se pueden variar a necesidad. Yo ya he convertido todos los subtitulos y van ahora a la perfeción :). Aqui pego el código, no creo que alguien lo quiera pero ahi queda xD. Por supuesto permito copiarlo y tal, pero vamos que son cuatro lineas xD.


#include
#include
#include
/********************************************/
#define FPS_IN 25.0 // FPS ENTRADA
#define FPS_OUT 23.978 // FPS SALIDA
/********************************************/
int lookAhead(FILE *F, int n){
// PRE: F=
// POST: lookAhead=d_x AND F=
int c;
for(c=1;c
// POST: end_of_file = (x>n)
return (0xffffffff==lookAhead(F,1));
}
int end_of_line(FILE *F){
// indica si estamos final de linea, valido para formato WIN/UNIX/MAX
int c;
c = lookAhead(F,1);
if (c == 0x0D) c = lookAhead(F, 2);
return (c == 0x0A);
}
void skip_line(FILE *F){
// salta la linea actual, valido para formato WIN/UNIX/MAX
int c;
while (!end_of_line(F))
fgetc(F);
if (end_of_line(F)){
c = fgetc(F);
if (c == 0x0D) c = fgetc(F);
}
}
int esNum(int character){
return (character>=48 && character<=57); } int leeNum(FILE *F, int n){ int veces; int ok=1; for(veces=0; veces ", 5, sizeof(char), Fout);
pilla_tiempo(F, &h, &m, &s, &ms);
convertir(h,m,s,ms, &h2, &m2, &s2, &ms2);
pon_tiempo(Fout, h2, m2, s2, ms2);
new_line(Fout); skip_line(F);
}
void abrirFicheros(FILE *in, FILE *out, char *f1, char *f2){
in=fopen(f1, "r");
out = fopen(f2, "w");
}
int main(int argc, char **argv){
FILE *F, *Fout;
if (argc != 3 && argc != 2){
printf("ERROR:\tUSO %s SUB_ENTRADA.srt SUB_SALIDA.srt\n", argv[0]);
exit(1);
}else
abrirFicheros( F,
Fout,
argv[1],
(argc==3 ? argv[2] : strcat(argv[1], ".srt"))
);
while (!end_of_file(F))
if (linea_OK(F))
Convierte_Linea(F, Fout);
else
clonaLinea(F, Fout);
fclose(F); fclose(Fout);
}

Codigo subs.c

Comments are closed.

Post Navigation