Problema con programacion, subtitulos o con lo que sea.

Pues el caso es que estoy intentando ver una serie y tengo:
Unos subtitulos en castellano de verdad pero mal sincronizados.
Unos subtitulos que duele verlos bien sincronizados.

Entonces se me ocurre coger los tiempos de uno y los textos de otro. Lo malo es que hacerlo a mano es interminable asi que sabiendo que los dos archivos siguen la misma estructura:

Numero de entrada
Tiempo
Linea de texto
Linea de texto o en blanco
Si antes no era linea en blanco linea en blanco.

Bueno pues me ha sido imposible, debido en parte al manejo de los cursores y a que cada vez que pilla caracteres ascii superior a 128 me mete un borron.
A alguien se le ocurre como hacerlo en c o en java o en cualquier otro lenguaje xd.
No entiendo muy bien que es lo que dices. Pero de lo poco que si parece que quieres sincronizar un subtitulo, ahi tienes dos opcioens: Subtitle WorkShop o AEGISub.

Subtitle Workshop: CTRL+B y revisar el tiempo inicial y tiempo final. O usar CTRL+D para meter un Delay + [adelantar] o uno - [atrasar].

AEGiSub: CTRL+I donde es una combinacion de los dos anteriores.
La cosa es que hacerlo a mano es muy largo y se puede evitar con un programa muy simple. La cosa es que si se puede no se hacer que c funcione con utf8 y no se java suficiente como para hacerlo.
Lo mejor para eso en mi opinión es Python + Regex o Bash + sed/grep/awk si estás en Linux. Ahora bien, si tienes que aprender cualquiera de ellos casi que vas a tardar lo mismo.
¿hacer un programa para la simpleza que quieres hacer?...

Pues buena suerte.
TRASTARO escribió:¿hacer un programa para la simpleza que quieres hacer?...

Pues buena suerte.


Sobre todo si me toca gente como tu que no sabe lo que es un programa. Ni interfaz grafica, ni botones, un programa llano en java, repito, yo mismo lo he hecho en C pero no va por temas de la codificacion.

Sobre lo de phyton y tal, no voy a aprender un lenguaje, mas, se c, estoy a medias con java, tambien se bash y shellscript y no hay tu tia xD
Mmm, la cosa sería encontrar las referencias adecuadas para situar los textos y los tiempos con un 100% de precisión.

Si me dejas el Pseudocodigo, te lo hago en C++.
Por fin algo productivo, gracias.

Seria algo como:
Abre fichero1, fichero2 y fichero3.
Fichero1 con tiempos correctos.
Fichero2 con texto correcto.
Fichero3 en blanco.

Lee fichero1, primera linea. Si la primera posicion es un numero mete ls linea entera en fichero3 y avanza cursor en fichero1 y fichero2.
Si no es un numero coge la linea de fichero2 y metela en fichero3 y avanza cursor de fichero1 y fichero2, sigue en fichero2 hasta que la linea sea igual a blanco(incluida esta). Repite el paso hasta eof de fichero2.
cipoteloth escribió:Por fin algo productivo, gracias.

Seria algo como:
Abre fichero1, fichero2 y fichero3.
Fichero1 con tiempos correctos.
Fichero2 con texto correcto.
Fichero3 en blanco.

Lee fichero1, primera linea. Si la primera posicion es un numero mete ls linea entera en fichero3 y avanza cursor en fichero1 y fichero2.
Si no es un numero coge la linea de fichero2 y metela en fichero3 y avanza cursor de fichero1 y fichero2, sigue en fichero2 hasta que la linea sea igual a blanco(incluida esta). Repite el paso hasta eof de fichero2.


Eso no es complicado de hacer, pero sólo funcionará si las dos traducciones tienen las mismas líneas traducidas. Es decir, si una de ellas ha decidido cortar una línea larga de diálogo en 2 partes ya se te ha fastidiado la sincronización a partir de ahí.

PD: En java también tienes manejo de ficheros de forma sencilla y un paquete con regex, y seguro que te da menos problemas con UTF-8 y similares.

PD2: el "por fin algo productivo" sobra bastante.
Mmm, la segunda parte no la he entendido del todo. En principio sería algo así:

void TraspasarTiempos(ifstream Textos, ifstream Tiempos,char* Nombre)
{
    unsigned short Salto = 0;
    char* Lector = new char;
    Escritura.open(Nombre);

    while(!Textos.eof())
    {
        Tiempos.read(Lector,1);
       
        if (*Lector >= '0' && *Lector <= '9')
        {
            Salto = Tiempos.tellg();
            Salto += ObtenerLinea(Tiempos,Escritura,*Lector);
        }
        else
        {
            Salto = Textos.tellg();
            Salto *= ObtenerLinea(Textos,Escritura,*Lector);
        }
        Texto.seekg(Salto);
        Tiempo.seekg(Salto);
    }
}

unsigned short ObtenerLinea(ifstream Lectura,ofstream Escritura,char Valor Inicial)
{
    string Buffer;
    unsigned short Contador = 0;
    char* Lector = new char;
    *Lector = ValorInicial;

    if (!Lectura || !Escritura)
        throw;

    do
    {
                Buffer += *Lector;
                Tiempos.read(Lector,1);
                Contador++;
    } while (*Lector != '\n' || Textos.eof());
    Escritura.write(Buffer.c_str(),Buffer.size());

    delete Lector;
   
    return Contador;
}


No pillo lo de las lineas en blanco. ¿Por que tener en cuenta eso? Podemos seguir repitiendo el agoritmo sin tenerlas en cuenta.
Me acabo de dar cuenta de que aunque coinciden en lineas unos subtitulos tienen mas entradas que otros... Gracias por la ayuda, si consigo solucionar eso te comento.
10 respuestas