Accueil > > > MODIFIER LES SOUS TITRES. [LINUX]
MODIFIER LES SOUS TITRES. [LINUX]
Information sur la source
Description
Le but est tout simple, il s'agit de décaler les fichiers de sous titres (.srt) en les décalant de tant de secondes ou de millisecondes. J'ai codé ça parce que ça m'arrive souvent d'avoir un fichier décalé d'une demie seconde et c'est assez rageant :) C'est sur que c'est parfois assez long et que le code pourrait etre optimisé mais bon ça suffit.. Un fichier srt est de cette forme : Numéro des sous titres xx:xx:xx,xxx --> xx:xx:xx,xxx Sous titres Ce programme cherche les expressions de temps (00:02:31,699) et les modifie
Source
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <ctype.h>
-
- #define M 1000
-
- int verifcmd(int argc, char *argv[]) //Vérification de la ligne de commande
- {
- FILE* F;
- int i, s;
-
- if( (F=fopen(argv[1],"r")) != NULL) //Test du fichier
- {
- s=strlen(argv[2]);
- for(i=0;i<s;i++) //Test du nombre de seconde. argv[2] doit composé de chiffres avec peut etre le signe '-' en premier caractere
- {
- if( !isdigit(argv[2][i]) )
- {
- if(i==0 && argv[2][i]=='-')
- ;
- else
- {
- printf("Le nombre de secondes est errone.\n");
- return 0;
- }
- }
- }
- if(argc==4) //On teste le nombre de millisecondes s'il ce parametre existe
- {
- s=strlen(argv[3]);
- for(i=0;i<s;i++)
- {
- if( !isdigit(argv[3][i]) )
- {
- if(i==0 && argv[3][i]=='-')
- ;
- else
- {
- printf("Le nombre de millisecondes est errone.\n");
- return 0;
- }
- }
- }
- }
- }
- else
- {
- printf("Le fichier est introuvable.\n");
- return 0;
- }
- return 1;
- }
-
- char decalage(FILE* F, int n) //Effectue un placement précis dans une variable FILE *, n étant le nombre de caractere
- {
- FILE *FN=F;
- char c;
- int i=0;
-
- if(n==0)
- return 0;
-
- for(i=0;i<n;i++)
- fscanf(FN,"%c", &c);
- return c;
- }
-
- int ligne(FILE *F1, int n) //Test si la l'expression qui suit est de la forme xx:xx:xx,xxx pour pouvoir la modifier
- {
- if(decalage(F1,3)==':' && decalage(F1,3)==':' && decalage(F1,3) == ',')
- {
- rewind(F1);
- decalage(F1,n);
- return 1;
- }
- rewind(F1);
- decalage(F1,n);
- return 0;
- };
-
- int dix(int x)
- {
- int i=0, n=1;
- for(i=0;i<x;i++)
- n*=10;
-
- return n;
- }
-
-
- int ctoi(char* t, int n) //Transforme un char* en entier
- {
- int i, x=0;
-
- for(i=0;i<n;i++)
- x=x+dix(i)*(t[i]-48);
-
- return x;
- }
-
- void itoc(int x, char* t) //Transforme un in en char*
- {
- int temp;
-
- temp=x/100;
- t[0]=temp+48;
- x=x-temp*100;
- temp=x/10;
- t[1]=temp+48;
- x=x-temp*10;
- t[2]=x+48;
-
- return;
- }
-
- void temps(char* expression, int sec, int mil) //Fonction qui ajoute ou supprime du temps
- {
- int m, p1, p2, p3; //Dans un fichier sous titres, un temps est de la forme p3:p2:p1,m
- char t[3];
-
- int temp,temp2;
-
- t[0]=expression[11];
- t[1]=expression[10];
- t[2]=expression[9];
- m=ctoi(t,3);
-
- t[0]=expression[7];
- t[1]=expression[6];
- p1=ctoi(t,2);
-
- t[0]=expression[4];
- t[1]=expression[3];
- p2=ctoi(t,2);
-
- t[0]=expression[1];
- t[1]=expression[0];
- p3=ctoi(t,2);
-
- //Algorithme
-
- temp=m+p1*M+p2*M*60+p3*M*3600+mil+sec*M; //temp étant le temps total exprimé en millisecondes
-
- if(temp<=0)
- temp=0;
-
- p3=temp/(M*3600); //Ensuite on convertit ce temps dans les variables p3, p2, p1 et m
- temp2=p3*M*3600;
- temp-=temp2;
-
- p2=temp/(M*60);
- temp2=p2*M*60;
- temp-=temp2;
-
- p1=temp/M;
- temp2=p1*M;
- temp-=temp2;
-
- m=temp;
-
- //Fin de l'Algorithme
-
- itoc(m,t); expression[9]=t[0]; expression[10]=t[1]; expression[11]=t[2];
- itoc(p1,t); expression[6]=t[1]; expression[7]=t[2];
- itoc(p2,t); expression[3]=t[1]; expression[4]=t[2];
- itoc(p3,t); expression[0]=t[1]; expression[1]=t[2];
-
- return;
- }
-
- void srt(int argc, char *argv[]) //Fonction principale qui va lire un fichier caractere par caractere
- {
- FILE *F1, *F2;
- int sec, mil;
- int i, n=1; //n étant le compteur de F1
- int cst=1, st;
-
- char c;
- char expression[12];
-
- sec=atoi(argv[2]);
- if(argc==4)
- mil=atoi(argv[3]);
- else
- mil=0;
-
- if(sec==0 && mil==0)
- return;
-
- if( (F1=fopen(argv[1],"r")) == NULL)
- {
- printf("Le fichier est introuvable.\n");
- return;
- }
- if( (F2=fopen("temporaire","w")) == NULL)
- {
- printf("Erreur lors de la creation du fichier temporaire.\n");
- return;
- }
-
- while(fscanf(F1,"%c", &c)!=EOF) //Traitement caractere par caractere
- {
-
- if(c=='\n'&&ligne(F1, n))
- {
- fprintf(F2,"\n"); n++;
- //Premiere partie
-
- for(i=0;i<12;i++)
- {
- fscanf(F1,"%c", &c);
- expression[i]=c;
- }n+=12;
-
- temps(expression,sec, mil);
-
- for(i=0;i<12;i++)
- fprintf(F2,"%c",expression[i]);
-
- //Seconde partie
- for(i=0;i<5;i++)
- {
- fscanf(F1,"%c", &c);
- fprintf(F2,"%c",c);
- } n+=5;
-
- for(i=0;i<12;i++)
- {
- fscanf(F1,"%c", &c);
- expression[i]=c;
- }n+=12;
-
- temps(expression,sec, mil);
-
- for(i=0;i<12;i++)
- fprintf(F2,"%c",expression[i]);
-
- }
- else
- {
- n++;
- fprintf(F2,"%c",c);
- }
-
- }
-
- return;
- }
- void help() //Fonction d'aide
- {
- printf("srt fichier secondes (millisecondes)\n\n");
- printf("exemples : \n");
- printf("$ srt sous-titres.srt 5 : Avance les sous titres de 5 secondes.\n");
- printf("$ srt sous-titres.srt -1 -500 : Recule les sous titres d'une seconde et demi.\n");
-
- return;
- }
-
- int main(int argc, char *argv[])
- {
- char* nom; //Nom du fichier en ajoutant "old_" devant
- int i;
-
- if(argc>1)
- {
- nom=malloc( strlen(argv[1]) +4*sizeof(char) );
-
- for(i=0;i<strlen(argv[1]);i++)
- nom[i+4]=argv[1][i];
- nom[0]='o';
- nom[1]='l';
- nom[2]='d';
- nom[3]='_';
- }
-
- if(argc==1)
- printf("Veuillez specifier une option. srt -help pour plus d'informations.\n");
- else if(argc==2)
- {
- if(strcmp(argv[1],"-help") == 0)
- {
- help();
- }
- }
- else if(argc==3 || argc==4)
- {
- if(verifcmd(argc, argv)) //On vérifie la ligne de commande
- {
- srt(argc, argv); //Fonction de traitement
- }
- }
-
- rename(argv[1],nom);
- rename("temporaire", argv[1]);
-
- return 0;
- }
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define M 1000
int verifcmd(int argc, char *argv[]) //Vérification de la ligne de commande
{
FILE* F;
int i, s;
if( (F=fopen(argv[1],"r")) != NULL) //Test du fichier
{
s=strlen(argv[2]);
for(i=0;i<s;i++) //Test du nombre de seconde. argv[2] doit composé de chiffres avec peut etre le signe '-' en premier caractere
{
if( !isdigit(argv[2][i]) )
{
if(i==0 && argv[2][i]=='-')
;
else
{
printf("Le nombre de secondes est errone.\n");
return 0;
}
}
}
if(argc==4) //On teste le nombre de millisecondes s'il ce parametre existe
{
s=strlen(argv[3]);
for(i=0;i<s;i++)
{
if( !isdigit(argv[3][i]) )
{
if(i==0 && argv[3][i]=='-')
;
else
{
printf("Le nombre de millisecondes est errone.\n");
return 0;
}
}
}
}
}
else
{
printf("Le fichier est introuvable.\n");
return 0;
}
return 1;
}
char decalage(FILE* F, int n) //Effectue un placement précis dans une variable FILE *, n étant le nombre de caractere
{
FILE *FN=F;
char c;
int i=0;
if(n==0)
return 0;
for(i=0;i<n;i++)
fscanf(FN,"%c", &c);
return c;
}
int ligne(FILE *F1, int n) //Test si la l'expression qui suit est de la forme xx:xx:xx,xxx pour pouvoir la modifier
{
if(decalage(F1,3)==':' && decalage(F1,3)==':' && decalage(F1,3) == ',')
{
rewind(F1);
decalage(F1,n);
return 1;
}
rewind(F1);
decalage(F1,n);
return 0;
};
int dix(int x)
{
int i=0, n=1;
for(i=0;i<x;i++)
n*=10;
return n;
}
int ctoi(char* t, int n) //Transforme un char* en entier
{
int i, x=0;
for(i=0;i<n;i++)
x=x+dix(i)*(t[i]-48);
return x;
}
void itoc(int x, char* t) //Transforme un in en char*
{
int temp;
temp=x/100;
t[0]=temp+48;
x=x-temp*100;
temp=x/10;
t[1]=temp+48;
x=x-temp*10;
t[2]=x+48;
return;
}
void temps(char* expression, int sec, int mil) //Fonction qui ajoute ou supprime du temps
{
int m, p1, p2, p3; //Dans un fichier sous titres, un temps est de la forme p3:p2:p1,m
char t[3];
int temp,temp2;
t[0]=expression[11];
t[1]=expression[10];
t[2]=expression[9];
m=ctoi(t,3);
t[0]=expression[7];
t[1]=expression[6];
p1=ctoi(t,2);
t[0]=expression[4];
t[1]=expression[3];
p2=ctoi(t,2);
t[0]=expression[1];
t[1]=expression[0];
p3=ctoi(t,2);
//Algorithme
temp=m+p1*M+p2*M*60+p3*M*3600+mil+sec*M; //temp étant le temps total exprimé en millisecondes
if(temp<=0)
temp=0;
p3=temp/(M*3600); //Ensuite on convertit ce temps dans les variables p3, p2, p1 et m
temp2=p3*M*3600;
temp-=temp2;
p2=temp/(M*60);
temp2=p2*M*60;
temp-=temp2;
p1=temp/M;
temp2=p1*M;
temp-=temp2;
m=temp;
//Fin de l'Algorithme
itoc(m,t); expression[9]=t[0]; expression[10]=t[1]; expression[11]=t[2];
itoc(p1,t); expression[6]=t[1]; expression[7]=t[2];
itoc(p2,t); expression[3]=t[1]; expression[4]=t[2];
itoc(p3,t); expression[0]=t[1]; expression[1]=t[2];
return;
}
void srt(int argc, char *argv[]) //Fonction principale qui va lire un fichier caractere par caractere
{
FILE *F1, *F2;
int sec, mil;
int i, n=1; //n étant le compteur de F1
int cst=1, st;
char c;
char expression[12];
sec=atoi(argv[2]);
if(argc==4)
mil=atoi(argv[3]);
else
mil=0;
if(sec==0 && mil==0)
return;
if( (F1=fopen(argv[1],"r")) == NULL)
{
printf("Le fichier est introuvable.\n");
return;
}
if( (F2=fopen("temporaire","w")) == NULL)
{
printf("Erreur lors de la creation du fichier temporaire.\n");
return;
}
while(fscanf(F1,"%c", &c)!=EOF) //Traitement caractere par caractere
{
if(c=='\n'&&ligne(F1, n))
{
fprintf(F2,"\n"); n++;
//Premiere partie
for(i=0;i<12;i++)
{
fscanf(F1,"%c", &c);
expression[i]=c;
}n+=12;
temps(expression,sec, mil);
for(i=0;i<12;i++)
fprintf(F2,"%c",expression[i]);
//Seconde partie
for(i=0;i<5;i++)
{
fscanf(F1,"%c", &c);
fprintf(F2,"%c",c);
} n+=5;
for(i=0;i<12;i++)
{
fscanf(F1,"%c", &c);
expression[i]=c;
}n+=12;
temps(expression,sec, mil);
for(i=0;i<12;i++)
fprintf(F2,"%c",expression[i]);
}
else
{
n++;
fprintf(F2,"%c",c);
}
}
return;
}
void help() //Fonction d'aide
{
printf("srt fichier secondes (millisecondes)\n\n");
printf("exemples : \n");
printf("$ srt sous-titres.srt 5 : Avance les sous titres de 5 secondes.\n");
printf("$ srt sous-titres.srt -1 -500 : Recule les sous titres d'une seconde et demi.\n");
return;
}
int main(int argc, char *argv[])
{
char* nom; //Nom du fichier en ajoutant "old_" devant
int i;
if(argc>1)
{
nom=malloc( strlen(argv[1]) +4*sizeof(char) );
for(i=0;i<strlen(argv[1]);i++)
nom[i+4]=argv[1][i];
nom[0]='o';
nom[1]='l';
nom[2]='d';
nom[3]='_';
}
if(argc==1)
printf("Veuillez specifier une option. srt -help pour plus d'informations.\n");
else if(argc==2)
{
if(strcmp(argv[1],"-help") == 0)
{
help();
}
}
else if(argc==3 || argc==4)
{
if(verifcmd(argc, argv)) //On vérifie la ligne de commande
{
srt(argc, argv); //Fonction de traitement
}
}
rename(argv[1],nom);
rename("temporaire", argv[1]);
return 0;
}
Conclusion
Ecrivez moi si vous avez des remarques, des suggestions a faire pour améliorer le programme ou pour ajouter de nouvelles fonctions.
Historique
- 09 juin 2007 10:38:05 :
- J'ai fait une petite mise a jour avec un peu de commentaires et 2 ou 3 trucs simplifiés.
- 09 juin 2007 10:39:18 :
- J'ai fait une petite mise a jour avec un peu de commentaires et 2 ou 3 trucs simplifiés.
- 09 juin 2007 10:40:03 :
- J'ai fait une petite mise a jour avec un peu de commentaires et 2 ou 3 trucs simplifiés.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Cool le site c super ! [ par mmuller57 ]
Alors là, je dis bravo ! C'est un site ultra-supra-giga cool ! Je débute en C++ et c'est cool de voir que y'a de l'entraide entre développeur ! Voilà,
Truc super simple mais je n'y connais rien... ;-) [ par JEROMAX ]
SalutJe suis en train de faire un petit prog dans un autre langage que ce cher C++J'aurai besoin de savoir comment on fait pour concaténer 2 chaine de
Super débutant [ par Sphaxs ]
Donc si quelqu'un pouvait m'expliquer (dans les grandes lignes (pour ne pas trop lui faire perdre de temps)) comment utilisé ce language, ca me rendra
Super débutant [ par Sphaxs ]
Salut tout le monde,Ca fait 1 an que je programme en Vb, mais certains de mes programmes ont une facheuse tendance à être LENTS, c'est pourquoi je vou
SUPER IMPORTANT / EST CE POSSIBLE [ par bily ]
Vegeta :-)salut a tous, je vourdai savoir comment faire en programmation la lecture de l'adresse physique de la carte reseau, lorsqu'on tape "ipconfig
SUPER IMPORTANT / EST CE POSSIBLE [ par bily ]
Vegeta :-)salut a tous, je vourdai savoir comment faire en programmation la lecture de l'adresse physique de la carte reseau, lorsqu'on tape "ipconfig
Trivial Poursut en C++ (bonne version) [ par miko51 ]
Voila , salut tout le monde je suis un débutant en programmation je suis dans une ecole d ingenieur en informatique et c est super honteux je n arrive
Changer le texte dans la barre des titres (Win32 API) [ par Viper31 ]
Salut tout le monde !!J aimerai savoir si quelqu'un sait comment changer le texte dans la barre des titres (caption) sachant que ma fenetre est une bo
SONDAGE !!! RSVP !!! [ par Guidelor ]
Bonjour Ca serait cool si le plus de monde possibles pouvait répondre à ma petite question !!!Existe-t-il un fichier.log sur votre ordinateur qui affi
super urgent :probleme de creation d'un nombre indefini de boutons [ par chriscrepin1 ]
je dois crée un nombre indefini de bouton dans un dialog j'ai reussi mais je n'arrive pas a gerer les evenement dessus j'ai defini un evenement pour l
|
Derniers Blogs
ETENDRE LE TEAM WEB ACCESS DE TFS 2012 - STEP 0ETENDRE LE TEAM WEB ACCESS DE TFS 2012 - STEP 0 par Philess
L'extensibilité du Team Web Access
Le Web Access (site d'équipe) de Team Foundation Server a été complètement réécrit dans la version 2012 avec pas moins de 400.000 lignes de JavaScript. Ce nouveau modèle a été pensé pour offrir de grandes...
Cliquez pour lire la suite de l'article par Philess SIMULER FACILEMENT L'ENVOI DE MAILSIMULER FACILEMENT L'ENVOI DE MAIL par JeremyJeanson
il m'a été demandé, à plusieurs reprises, comment je faisais pour simuler l'envoi de mail lors de mes démos de Workflow Foundation. Ma solution est plutôt simple : j'utilise la configuration par défaut du SmtpClient et j'oriente les mails vers un dossier ...
Cliquez pour lire la suite de l'article par JeremyJeanson VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES !VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES ! par Patrick Guimonet
Si ce n'est déjà fait (comme plus de 600 personnes déjà), il est encore temps de voter pour le concours TOP 10 des influenceurs SharePoint francophones ! Il est organisé par harmon.ie et accessible ici : http://harmon.ie/top-...
Cliquez pour lire la suite de l'article par Patrick Guimonet [CONF'SHAREPOINT] DERNIER RAPPEL ! :-)[CONF'SHAREPOINT] DERNIER RAPPEL ! :-) par Patrick Guimonet
La Conf'SharePoint en chiffres c'est : 3 jours de SharePoint ! 4 parcours et 60 sessions 17 partenaires représentant toutes les fac...
Cliquez pour lire la suite de l'article par Patrick Guimonet
Forum
MéMORY EN C++MéMORY EN C++ par C6Dj
Cliquez pour lire la suite par C6Dj
Logiciels
Easy-Planning (4.5.0.11)EASY-PLANNING (4.5.0.11)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté a... Cliquez pour télécharger Easy-Planning CVEasy (3.1.0.51)CVEASY (3.1.0.51)PHMSD-CVEasy est un logiciel d'aide à la rédaction de CV d'une simplicité déconcertante.
PHMSD-C... Cliquez pour télécharger CVEasy LettresFaciles 2011 (8.6.0.31)LETTRESFACILES 2011 (8.6.0.31)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011 sDEVIS-FACTURES vlPRO (8.4.2.62)SDEVIS-FACTURES VLPRO (8.4.2.62)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO Devis-Factures PHMSD (2.1.0.11)DEVIS-FACTURES PHMSD (2.1.0.11)Configuration minimale
Nécessite Windows™ 2000, XP, Windows 7, 8, Vista (Service Pack à... Cliquez pour télécharger Devis-Factures PHMSD
|