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
TECHDAYS PARIS 2012 : COMMENT SHAREPOINT A SAUVé MES TECHDAYSTECHDAYS PARIS 2012 : COMMENT SHAREPOINT A SAUVé MES TECHDAYS par ROMELARD Fabrice
Speakers : Lionel Limozin et Alain Marty La session commence par une découverte de SharePoint à travers la mise en place d'un environnement SharePoint pour la gestion des Sessions animées par BeWise. Le besoin est très ba...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice PERSPECTIVE 3.0 POUR SILVERLIGHT 5.0PERSPECTIVE 3.0 POUR SILVERLIGHT 5.0 par odewit
Je viens de publier la version 3.0 de Perspective pour Silverlight, qui regroupe un portage sous Silverlight 5.0 des fonctionnalités de Perspective 2.0, le framework 3D de haut-niveau introduit récemment et de nouveaux exemples de code. En voici la li...
Cliquez pour lire la suite de l'article par odewit TECHDAYS PARIS 2012 : TOP 10 DES BEST PRACTICES POUR SQL SERVERTECHDAYS PARIS 2012 : TOP 10 DES BEST PRACTICES POUR SQL SERVER par ROMELARD Fabrice
Speaker : Nadia Ben El Kadi Configuration machine La session commence par la toute première question à se poser lors de la mise en place d'environnement SQL Server, la configuration des machines : Type de mac...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : KINECT + OFFICE 365 UN BON GESTE POUR VOTRE SITECHDAYS PARIS 2012 : KINECT + OFFICE 365 UN BON GESTE POUR VOTRE SI par ROMELARD Fabrice
Speakers : Fabrice Barbin, Samuel Blanchard, Julien Lo Presti Titre Prometteur et attractif invitant à voir comment lier le composant ludique Kinect dans le cadre d'une structure IT classique, notamment au travers de la plat...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : PLEINIèRE DU PREMIER JOURTECHDAYS PARIS 2012 : PLEINIèRE DU PREMIER JOUR par ROMELARD Fabrice
KeyNotes du premier jour pour les développeurs. La session est principalement axée sur une des principales directions prise par Microsoft à travers tous ses nouveaux produits : Cloud privé ou public (Solution Azure) ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
C++ C++ par yesoun1
Cliquez pour lire la suite par yesoun1 OPNETOPNET par hth21
Cliquez pour lire la suite par hth21 RE : ARBRE BINAIRERE : ARBRE BINAIRE par pacotheking
Cliquez pour lire la suite par pacotheking
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|