begin process at 2012 05 27 15:38:04
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichiers / Disque

 > [DEVC++] SPLITTER DE FICHIER .SRT (SOUS-TITRES)

[DEVC++] SPLITTER DE FICHIER .SRT (SOUS-TITRES)


 Information sur la source

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Fichiers / Disque Classé sous :srt, sous, titre, splitter, split Niveau :Débutant Date de création :12/01/2004 Date de mise à jour :06/05/2005 06:38:53 Vu / téléchargé :35 487 / 720

Auteur : alkove

Ecrire un message privé
Site perso
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Si vous avez un fichier .srt pour un divx, mais que celui-ci n'est prévu que pour un CD, alors que vous avez ce dit film en deux parties. Vous pouvez grace a ce petit logiciel séparer le fichier .srt en deux (ou plus) sans tout réecrire.

Pour ce faire, il vous faut tout d'abord (manuellement) couper votre fichier .srt en deux ou plus à l'endroit de votre choix (facile a faire avec le bloc note tout de meme, mon fichier ne fait que corriger les time-stamps, et les numero de sous-titres)!  /!\\ attention la première ligne du fichier doit etre un numero de sous-titre !!
avec les deux fichiers .srt que vous obtenez, normalement la première partie n'a pas besoin de correction, le début des sous-titres est bien synchro avec le début du film. Par contre la deuxème partie ne l'est pas et c'est la qu'agit mon prog.

Syntaxe : srtsplit.exe in.srt [out.srt] [correct_offset_en_milisecondes]

correct_offset permet de décaler le début  du sous-titre de + ou - quelques milisecondes

dans le zip je fourni un fichier .srt
ainsi que l'exe

Source

  • #include <stdlib.h>
  • #include <stdio.h>
  • #include <string.h> // stricmp () ; atoi ()
  • #include <ctype.h> // isdigit ()
  • #include <math.h> // floor ()
  • int correctoff = 0; // offset de correction en milisecondes
  • using namespace std;
  • // la chaine contient-elle un nombre ?
  • int isnum (char *test)
  • {
  • for (int i=0; i < strlen(test); i++)
  • if (!isdigit(test[i]) && (test[i] != '\\r') && (test[i] != '\\n') )
  • return 0; // non retourne 0
  • return 1; // oui retourne 1
  • }
  • // rajoute ou enleve quelque milisecondes
  • // pour caller la deuxième partie des sous-titres
  • // par rapport au début du deuxième cd
  • int correctoffset (int &milis, int &secondes, int &minutes, int &heures)
  • {
  • milis += correctoff;
  • if (milis >= 1000)
  • {
  • milis -= 1000;
  • secondes++;
  • if (secondes >= 60)
  • {
  • secondes -= 60;
  • minutes++;
  • if (minutes >= 60)
  • {
  • minutes -= 60;
  • heures++;
  • }
  • }
  • }
  • return 0;
  • }
  • // corrige les time-stamps (remet a 00:00:00 le premier sous-titre
  • // et décale d'autant les suivants
  • int reTime (char *Data)
  • {
  • static int offsettime = 0;
  • int heures, minutes, secondes, milis;
  • int heures2, minutes2, secondes2, milis2;
  • int tmpensec;
  • sscanf (Data, "%d:%d:%d,%d --> %d:%d:%d,%d",
  • &heures, &minutes, &secondes, &milis,
  • &heures2, &minutes2, &secondes2, &milis2 );
  • // partie 1
  • // met tout en secondes
  • tmpensec = heures * 3600 + minutes * 60 + secondes;
  • if (offsettime == 0)
  • offsettime = tmpensec;
  • // puis décale de 'offsettime' secondes
  • tmpensec -= offsettime;
  • // repasse en format hh:mm:ss
  • heures = (int)floor(tmpensec/3600);
  • tmpensec -= heures*3600;
  • minutes = (int)floor(tmpensec/60);
  • tmpensec -= minutes*60;
  • secondes = tmpensec;
  • // offset rajouter par l'utilisateur par la ligne de commande
  • correctoffset (milis, secondes, minutes, heures);
  • // partie 2
  • tmpensec = heures2 * 3600 + minutes2 * 60 + secondes2;
  • tmpensec -= offsettime;
  • heures2 = (int)floor(tmpensec/3600);
  • tmpensec -= heures2*3600;
  • minutes2 = (int)floor(tmpensec/60);
  • tmpensec -= minutes2*60;
  • secondes2 = tmpensec;
  • correctoffset (milis2, secondes2, minutes2, heures2);
  • // Place la chaine corrigée dans Data
  • sprintf(Data, "%02d:%02d:%02d,%03d --> %02d:%02d:%02d,%03d\\r\\n",
  • heures, minutes, secondes, milis,
  • heures2, minutes2, secondes2, milis2 );
  • return 0;
  • }
  • int main(int argc, char *argv[])
  • {
  • FILE *fich1, *fich2;
  • int numligne, offsetdeb, step = 1;
  • char Buffer[255], fichierout[255];
  • char *Data;
  • switch (argc) // Extrait les arguments de la ligne de commande
  • {
  • case 2:
  • strcpy (fichierout, "out.srt");
  • break;
  • case 3:
  • if (isnum (argv[2]))
  • {
  • correctoff = atoi (argv[2]);
  • strcpy (fichierout, "out.srt");
  • }
  • else
  • strcpy (fichierout, argv[2]);
  • break;
  • case 4:
  • if (isnum (argv[3]) && !isnum (argv[2]))
  • {
  • correctoff = atoi (argv[3]);
  • strcpy (fichierout, argv[2]);
  • break;
  • }
  • case 1:
  • default:
  • printf ("Syntaxe : srtsplit.exe in.srt [out.srt] [correct_offset_en_milisecondes]\\n");
  • system ("PAUSE");
  • return 0;
  • }
  • // Ouvre les fichiers
  • if ((fich1 = fopen(argv[1], "rb")) == NULL) // r : lecture ; b : mode binaire
  • {
  • printf ("Erreur à l'ouverture du fichier %s\\n", argv[1]);
  • system ("PAUSE");
  • return 0;
  • }
  • if ((fich2 = fopen(fichierout, "w+b")) == NULL) // w+ : écrase le fichier si il existe
  • {
  • printf ("Erreur à l'ouverture du fichier %s\\n", fichierout);
  • system ("PAUSE");
  • return 0;
  • }
  • // lit le premier numero de sous-titre, et l'enregistre comme référence
  • Data = fgets (Buffer, 255, fich1);
  • if (isnum (Data))
  • offsetdeb = atoi (Data) - 1;
  • // lit ligne par ligne jusqu'a la fin
  • while (!feof(fich1))
  • {
  • if (stricmp (Data, "\\r\\n"))
  • switch (step) // De quel type de ligne s'agit-il ?
  • {
  • case 1: // numero de ligne
  • if (isnum (Data))
  • {
  • numligne = atoi (Data);
  • // Soustrais le numero de sous-titre
  • // par rapport à la référence
  • // (on pourrait aussi simplement incrementer une variable
  • // ca serait trop facile non ? :) )
  • sprintf(Data, "%d\\r\\n", numligne - offsetdeb);
  • // Enregistre
  • fputs (Data, fich2);
  • step++;
  • }
  • else // si la ligne lu n'est pas un nombre
  • fputs (Data, fich2);
  • break;
  • case 2: // time stamp
  • reTime (Data); // corrige les time-stamp
  • fputs (Data, fich2);
  • step++;
  • break;
  • case 3: // sous-titre
  • fputs (Data, fich2);
  • break;
  • }
  • else // sous-titre ou espace vide
  • {
  • fputs (Data, fich2);
  • step = 1;
  • }
  • Data = fgets (Buffer, 255, fich1); // Lit une ligne
  • } // Fin while()
  • // ferme les fichiers
  • fclose(fich1);
  • fclose(fich2);
  • printf ("Traitement terminé avec succès\\n");
  • system ("PAUSE");
  • return 0;
  • }
  • ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  • // edit 5 mai 2005 :
  • // j'ai fais la meme chose en awk sous linux :
  • /^[0-9]+[\n\r]?$/ { print $0 ; ligne = $1}
  • /^[0-9]+[:]+/ {
  • FS = "[:, ]+"
  • offset = -4
  • debut = 0
  • if (ligne >= debut) {
  • h1=$1; m1 = $2; s1 = $3
  • h2=$6; m2 = $7; s2 = $8
  • s1 += offset
  • s2 += offset
  • if (s1 >= 60) {
  • m1++
  • s1 -= 60
  • }
  • if (m1 >= 60) {
  • h1++
  • m1 -= 60
  • }
  • if (s2 >= 60) {
  • m2++
  • s2 -= 60
  • }
  • if (m2 >= 60) {
  • h2++
  • m2 -= 60
  • }
  • printf("%02i:%02i:%02i,%03i --> %02i:%02i:%02i,%03i\n", $1, m1, s1, $4, $6, m2, s2, $9)
  • } else {
  • print $0
  • }
  • getline
  • while ($0 !~ /^[ \n\r]*$/) {
  • print $0
  • getline
  • }
  • print $0
  • }
  • // c'est plus petit, et tout aussi éfficace
  • // il suffit de modifier les paramètres offset (en secondes) et debut (0 pour modifier a partir de la première ligne)
#include <stdlib.h>
#include <stdio.h>
#include <string.h> // stricmp () ; atoi ()
#include <ctype.h>  // isdigit ()
#include <math.h>   // floor ()

int correctoff = 0; // offset de correction en milisecondes

using namespace std;

// la chaine contient-elle un nombre ?
int isnum (char *test)
{
    for (int i=0; i < strlen(test); i++)
        if (!isdigit(test[i]) && (test[i] != '\\r') && (test[i] != '\\n') )
            return 0; // non retourne 0
    return 1; // oui retourne 1
}

// rajoute ou enleve quelque milisecondes
// pour caller la deuxième partie des sous-titres
// par rapport au début du deuxième cd
int correctoffset (int &milis, int &secondes, int &minutes, int &heures)
{
    milis += correctoff;
    if (milis >= 1000)
    {
        milis -= 1000;
        secondes++;
        if (secondes >= 60)
        {
            secondes -= 60;
            minutes++;
            if (minutes >= 60)
            {
                minutes -= 60;
                heures++;
            }
        }
    }
    return 0;
}

// corrige les time-stamps (remet a 00:00:00 le premier sous-titre
// et décale d'autant les suivants
int reTime (char *Data)
{
    static int offsettime = 0;
    int heures, minutes, secondes, milis;
    int heures2, minutes2, secondes2, milis2;
    int tmpensec;

    sscanf (Data, "%d:%d:%d,%d --> %d:%d:%d,%d",
                    &heures, &minutes, &secondes, &milis,
                    &heures2, &minutes2, &secondes2, &milis2 );

    // partie 1
    // met tout en secondes
    tmpensec = heures * 3600 + minutes * 60 + secondes;
    if (offsettime == 0)
        offsettime = tmpensec;

    // puis décale de 'offsettime' secondes
    tmpensec -= offsettime;

    // repasse en format hh:mm:ss
    heures = (int)floor(tmpensec/3600);
    tmpensec -= heures*3600;
    minutes = (int)floor(tmpensec/60);
    tmpensec -= minutes*60;
    secondes = tmpensec;

    // offset rajouter par l'utilisateur par la ligne de commande
    correctoffset (milis, secondes, minutes, heures);

    // partie 2
    tmpensec = heures2 * 3600 + minutes2 * 60 + secondes2;
    tmpensec -= offsettime;

    heures2 = (int)floor(tmpensec/3600);
    tmpensec -= heures2*3600;
    minutes2 = (int)floor(tmpensec/60);
    tmpensec -= minutes2*60;
    secondes2 = tmpensec;

    correctoffset (milis2, secondes2, minutes2, heures2);

    // Place la chaine corrigée dans Data
    sprintf(Data, "%02d:%02d:%02d,%03d --> %02d:%02d:%02d,%03d\\r\\n",
                    heures, minutes, secondes, milis,
                    heures2, minutes2, secondes2, milis2 );

    return 0;
}

int main(int argc, char *argv[])
{
    FILE *fich1, *fich2;
    int numligne, offsetdeb, step = 1;
    char Buffer[255], fichierout[255];
    char *Data;
    
    switch (argc) // Extrait les arguments de la ligne de commande
    {
        case 2:
            strcpy (fichierout, "out.srt");
            break;
        case 3:
            if (isnum (argv[2]))
            {
                correctoff = atoi (argv[2]);
                strcpy (fichierout, "out.srt");
            }
            else
                strcpy (fichierout, argv[2]);
            break;
        case 4:
            if (isnum (argv[3]) && !isnum (argv[2]))
            {
                correctoff = atoi (argv[3]);
                strcpy (fichierout, argv[2]);
                break;
            }
        case 1:
        default:
            printf ("Syntaxe : srtsplit.exe in.srt [out.srt] [correct_offset_en_milisecondes]\\n");
            system ("PAUSE");
            return 0;                
    }
    
    // Ouvre les fichiers
    if ((fich1 = fopen(argv[1], "rb")) == NULL) // r : lecture ; b : mode binaire
    {
        printf ("Erreur à l'ouverture du fichier %s\\n", argv[1]);
        system ("PAUSE");
        return 0;
    }
    
    if ((fich2 = fopen(fichierout, "w+b")) == NULL) // w+ : écrase le fichier si il existe
    {
        printf ("Erreur à l'ouverture du fichier %s\\n", fichierout);
        system ("PAUSE");
        return 0;
    }

    // lit le premier numero de sous-titre, et l'enregistre comme référence
    Data = fgets (Buffer, 255, fich1);
    if (isnum (Data))
        offsetdeb = atoi (Data) - 1;

    // lit ligne par ligne jusqu'a la fin
    while (!feof(fich1))
    {
        if (stricmp (Data, "\\r\\n"))
            switch (step) // De quel type de ligne s'agit-il ?
            {
                case 1: // numero de ligne
                    if (isnum (Data))
                    {
                        numligne = atoi (Data);
                        // Soustrais le numero de sous-titre
                        // par rapport à la référence
                        // (on pourrait aussi simplement incrementer une variable
                        //  ca serait trop facile non ? :) )
                        sprintf(Data, "%d\\r\\n", numligne - offsetdeb);
                        // Enregistre
                        fputs (Data, fich2);
                        step++;
                    }
                    else // si la ligne lu n'est pas un nombre
                        fputs (Data, fich2);
                    break;

                case 2: // time stamp
                    reTime (Data); // corrige les time-stamp
                    fputs (Data, fich2);
                    step++;
                    break;

                case 3: // sous-titre
                    fputs (Data, fich2);
                    break;
            }
        else // sous-titre ou espace vide
        {
            fputs (Data, fich2);
            step = 1;
        }

        Data = fgets (Buffer, 255, fich1); // Lit une ligne
    } // Fin while()
     
    // ferme les fichiers
    fclose(fich1);
    fclose(fich2);

    printf ("Traitement terminé avec succès\\n");
    system ("PAUSE");
    return 0;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// edit 5 mai 2005 :

// j'ai fais la meme chose en awk sous linux :

/^[0-9]+[\n\r]?$/ { print $0 ; ligne = $1}

/^[0-9]+[:]+/ {
	FS = "[:, ]+"
	
	offset = -4
	debut = 0

	if (ligne >= debut) {
		h1=$1; m1 = $2; s1 = $3
		h2=$6; m2 = $7; s2 = $8

		s1 += offset
		s2 += offset

		if (s1 >= 60) {
			m1++
			s1 -= 60
		}
		if (m1 >= 60) {
			h1++
			m1 -= 60
		}

		if (s2 >= 60) {
			m2++
			s2 -= 60
		}
		if (m2 >= 60) {
			h2++
			m2 -= 60
		}

		printf("%02i:%02i:%02i,%03i --> %02i:%02i:%02i,%03i\n", $1, m1, s1, $4, $6, m2, s2, $9)
	} else {
		print $0
	}

	getline
	while ($0 !~ /^[ \n\r]*$/) {
		print $0
		getline
	}
	print $0
}

// c'est plus petit, et tout aussi éfficace
// il suffit de modifier les paramètres offset (en secondes) et debut (0 pour modifier a partir de la première ligne)


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • in.srtTélécharger ce fichier [Réservé aux membres club]29 335 octets
  • main.cppTélécharger ce fichier [Réservé aux membres club]Voir ce fichier6 012 octets
  • main.oTélécharger ce fichier [Réservé aux membres club]12 307 octets
  • Makefile.winTélécharger ce fichier [Réservé aux membres club]740 octets
  • srtsplit.exeTélécharger ce fichier [Réservé aux membres club]106 073 octets
  • Test.devTélécharger ce fichier [Réservé aux membres club]859 octets

Télécharger le zip


 Historique

06 mai 2005 06:33:13 :
06 mai 2005 06:35:46 :
06 mai 2005 06:38:53 :
ajout d'une source awk équivalente

 Sources du même auteur

Source avec Zip EMULATION D'UN SERVEUR SMTP

 Sources de la même categorie

COMPTER LE NOMBRE DE PAGES D'UN FICHIER PDF par Renfield
Source avec Zip Source avec une capture GENERE BMP par lajouad
Source avec Zip Source avec une capture GETIONNAIRE D'UNE BIBLIOTHÉQUE EN C par benzarabel
FONCTION D'ÉDITION DE FICHIER BIT À BIT [C-MULTIPLATEFORME] par lynxtyle
Source avec Zip Source avec une capture UN GESTIONNAIRE DU FICHIER par benzarabel

 Sources en rapport avec celle ci

DLL - SPLIT AVEC MULTIPLE DELIMITEUR par Jbs106
SIMPLE FONCTION TOKENIZE par spidermario
Source avec Zip WIN32CAB .CAB par f_l_a_s_h_b_a_c_k
SPLIT EN C++ AVEC LES CONTENEURS STANDARD par CChargy
Source avec Zip MODIFIER LES SOUS TITRES. [LINUX] par manta7

Commentaires et avis

Commentaire de djl le 12/01/2004 19:41:31

pas mal!
simple et pratique pour synchroniser ses sous titre

Commentaire de alkove le 12/01/2004 20:01:08

à l'origine je l'ai fais par ce que j'en avais besoin ^^

Commentaire de djl le 12/01/2004 20:11:52

kler moi ca m'arrive mais c'es coder comme un porc donc pas moyen de le poster!

sinon ta oublier d'enlever using namespace std; au debut du prog ;)

Commentaire de Kirua le 13/01/2004 07:45:46

ça m'a l'air bien utile en tt cas! :-)

Commentaire de Urgo le 06/04/2004 18:17:27

Stylé, je cherchais justement ça, vu que j'aime bien la VO ;)
Thx 8/10

Commentaire de Kirua le 06/04/2004 18:45:24

c'est quel film sur le screenshot, ça a l'air bien ^^ ... c'est probablement un film connu en plus, raconte, vas-y :-)

Commentaire de alkove le 06/04/2004 20:21:56

lol
c'est Battle Royal II
... j'ai vu mieux ^^

Commentaire de Kirua le 07/04/2004 11:21:22

Aah, on m'en a parlé plein de fois (pas tjs en bien ^^). bon, je vais essayer de le voir. Si vous cherchez un film excellent: AntiTrust, voilà pour mon avis ;-)

Merci pr la réponse, ciao

Commentaire de Urgo le 19/04/2004 12:29:12

héhé, AntiTrust ce fut mon deuxième DivX, je l'avais vu 6 mois avant sa sortie fr, et j'avais adoré

Commentaire de Urgo le 10/05/2004 22:01:35

"+ ou - quelques milisecondes"

Ce serait bien de pouvoir le déplacer de quelques minutes et tout :)
Enfin si t'as pas le temps, je me ferai un plaisir de le faire en vc++ 6 win32

Commentaire de alkove le 12/05/2004 01:38:55

Vas y, si tu as le courage... Moi j'ai pas trop le temps ^^

Commentaire de Simic94 le 20/09/2008 16:30:11

est il normal qu'il manque le fichier exe dans le zip car le je vois pas bien comment utiliser le programme

Commentaire de alkove le 02/10/2008 14:07:22

Tout à fait, il faut le compiler soit même, mais ça ne devrait pas poser de problème particulier. Je peux te conseiller un compilateur gratuit : bloodshed dev cpp

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Cacher la barre de titre [ par Xentor ] Comment faire pour cacher la barre de titre ?J'essaie de faire une démo en OpenGL, j'arrive à maximiser, mettre ma fenêtre devant les autres, etc... M police? [ par colargol ] salut,je developpe avec Turbo c++ (version 4.5). j'aimerai savoir si je peux modifier la taille d'une chaine de caractere. j'ai developpé une applicat C++B6 : Deplacer une form sans la barre du titre [ par fabiin ] Salutj'utilise C++builder 6,j'ai une form sans barre de titreet je voudrai la déplacer en cliquant n'import ou ailleur,g pensé utiliser le même code k Split en C++ builder ? [ par belkin ] Bonjour,Je cherche l'équivalent du split (VB) sous c++ builder ?MerciFrederic splitter [ par psychomath ] j'ai créé 2 splitters.j'aimerai savoir comment écrire dans une seul vue car lorsque je veux afficher un fichier, il apparait dans les deux vues.Commen barre de titre + barre des tâches [ par curator68 ] Help Me!!!!:)J'ai besoin de savoir comment enlever la Titlebar sur une form SDI. Et comment la maximizer et cacher la barre des tâches. Je crois que c Split ou pas Split... [ par crocejf2000 ] Salut,Dans mon appli MFC je split la fenetre fille dans OnCreateClient avec CSplitterWnd et j'aurai voulu controler si je la split ou pas : BOOL CChil Pb Dialog et icone barre des titre [ par Viper31 ] salut je voulais connaitre le moyen le plus simple pour mettre un icone dans la barre des titres d'une boite de dialog ! J'ai deja regardé dans le man Titre d'une colonne CListBox [ par garslouche ] Bonjour,je voudrais changer le titre d'une colonne d'une CListBox.Pour cela je fais un GetColumn, je modifie la colonne, et je fais un SetColumn. En t Au sujet de splitter [ par vcbelk ] Salut j'ai trois questions pou un programme de visual c++comment ajouter à une form view un tree control et un riche edit comment séparai ces deux con


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,310 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales