Accueil > > > [DEVC++] SPLITTER DE FICHIER .SRT (SOUS-TITRES)
[DEVC++] SPLITTER DE FICHIER .SRT (SOUS-TITRES)
Information sur la source
Description
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)
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
Sources de la même categorie
Commentaires et avis
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
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
MATRICE TEMPLATEMATRICE TEMPLATE par hjr2610
Cliquez pour lire la suite par hjr2610 RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|