Synchronisateur de sous-titres en c++

Fermé
mathlo - 13 juin 2012 à 21:56
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 14 juin 2012 à 20:36
Bonjour, Bonsoir,
Je rejoins doucement mais surement la grande famille des programmeurs :)
Aujourd'hui, grâce a mes petites bases sur le c++, j'ai décidé de créer un petit programme pour synchroniser les sous-titres avec la bande son d'un film.
En effet, j'ai voulu regarder un episode de l'awesomeee série "game of thrones" mais entre les paroles en anglais et les sous titres en francais. Il y a un décalage de 2 sec, donc tres lourd :/

Alors, je sais tres bien qu'il existe des logiciels pour ca.... MAIS je veux un petit truc fait maison, meme si c'est moins bien.... :)

En plus, j'ai réfléchi un peu à comment ca marche ca a pas l'air si dur...
il suffit de modifier le fichier srt, en le passant d'abord en txt, pour qu'a chaque ligne indiquant le temps on enleve 2 sec....

par exemple :
"00:02:26,282 --> 00:02:29,150
J'ai monté la garde pour lui, la nuit dernière"

apres modification par le programme serait :

"00:02:24,282 --> 00:02:27,150
J'ai monté la garde pour lui, la nuit dernière"

------------------------------------------------------------------------------------------------------

Voila comment je vois les choses, on lit le fichier ligne par ligne, si la ligne commence par un 0, on va modifier le temps, sinon on continue en passant a la ligne suivante.

Alors pas besoin d'une giga-interface de ouf, un programme dans la console suffit... Puis j'ai pas encore le niveau pour faire plus :p
Pareil, pour la premiere version, tout sera deja regle, le nombre de secondes a enlever et le nombre de lignes du fichier sera connu... Ouai parce que beaucoup de fichier se termine par exemple par des lignes d'informations comme :

"9999
00:00:0,500 --> 00:00:2,00
<font color="#ffff00" size=14>www.tvsubtitles.net</font>

9999
00:00:0,500 --> 00:00:2,00
<font color="#ffff00" size=14>www.tvsubtitles.net</font>"

Dans ce cas, il faut pas les modifier....

------------------------------------------------------------------------------------------------------

Viens le moment de l'aide...
J'ai besoinn qu'on m'explique 2-3 choses s'il vous plait :)

D'abord, comment fonctionne cette put*n de getline()... J'y arrive pas... dans le sens comment lui dire lit la ligne 8? une boucle avec un compteur pour qu'il lise les lignes une par une?

ensuite, quand je stocke la ligne, je la stock dans quoi? un string? mais comment acceder a la premiere lettre dans ce cas? ou dans un tableau de chars? mais dans ce cas tableau statique ou a taille variable?

Puis, alors ca c'est ce qui me gene le plus, comme dire modifie ligne 14, le caractere 8?

Voila voila, merci d'avoir pris le temps de lire mon post,
bonne soirée a tous :)





6 réponses

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
14 juin 2012 à 10:38
https://en.cppreference.com/w/cpp/string/basic_string
il y a le descriptif de tout ce que tu peux faire facilement avec string.
il y a getline, operator[] en particulier.

Tu ne peux pas dire à getline d'aller ligne 8, il faut que tu fasse 8 fois getline.
Ensuite le plus simple est de stocker dans un string. Tu accedes à une lettre en particulier avec [] (std::string a="esi"; cout<<a[1]<< " un s";). Le même opérateur pour modifier la valeur.
Mais ça devient compliqué à mon avis. Le plus simple à mon avis est de récupérer des entiers, de les modifier et de les réécrire.
En tête utile :https://en.cppreference.com/w/cpp/io/basic_stringstream
std::string ligne;
std::sstream ss;
int heure,minutes;float secondes,temps;
getline(file,ligne);
ss.str(ligne.substr(0,2));
ss>>heure;
ss.str(ligne.substr(3,2));
ss>>minutes;
ss.str(ligne.substr(6,5));
ss>>secondes;
temps=3600*heure+60*minutes+secondes;
temps+=2.0;//decalage de 2 secondes du temps
heure=temps/3600;
minutes=(temps-heures*3600)/60;
secondes=(temps-heures*3600-minutes*60);
cout<<heures<<':'<<minutes<<':'<<secondes;

je n'ai pas testé, il manque pas mal de morceaux de code, mais c'est en gros l'idée de ce que tu dois faire.
1
Salut, et merci de ta réponse.
Alors alors, j'ai compris ton idée, mais pas encore le niveau technique pour comprendre la mise en application.
est ce que tu pourrais me donner plus de détails notamment par rapport a ces lignes de codes :
"ss.str(ligne.substr(0,2));
ss>>heure;
ss.str(ligne.substr(3,2));
ss>>minutes;
ss.str(ligne.substr(6,5));
ss>>secondes;"

En fait, je ne connais pas .substr et .str... Je pense que a chaque fois ca te permet de recuperer le caractere x de la ligne et de les stocker dans tes variable de temps?
Puis, ne manque-t-il pas une boucle? parce que la ca va faire une seule ligne non?
Enfin, "cout<<heures<<':'<<minutes<<':'<<secondes;" permet de réecrire le temps modifié, mais est ce que ca supprime la ligne dans le fichier?

merci encore pour ton aide :)
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
14 juin 2012 à 15:11
Pour les fonctions str et substr, je t'invite à lire les liens fournis, ils expliquent les fonctions.
sstream est assez spcal, il permet de traiter un string comme un flux (type cout ou fstream), et permet donc de lire écrire différents type de données facilement dans un string).
Bien entendu, ça ne traite qu'une seule ligne et qu'un seul temps sur les deux, il faut faire une boucle et d'autre choses. Traite déjà un fichier avec une ligne, tu étendra après. Le mieux est de découpé en fonction, et de mettre le traitement d'une ligne dans une fonction bien spécifique.
cout écrit sur la sortie standard, c'est tout. Ton fichier ne sera modifié que si tu écris dedans. Pour commencer, je te conseil de créer un autre fichier plutôt que de modifier au fur à mesure celui que tu lis : ça t'évitera des bourde et pas mal de soucis de déplacements dans le fichier.
0
ok :)
derniere petite question, est ce qu'il est possible de garder deux fichiers ouverts en meme temps, un ou je lis, et l'autre ou je réecris? ou bien je dois les rouvrir/fermer a chaque fois?
merci encore :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
14 juin 2012 à 16:00
Non, tu peux voir autant (dans la limite de la machine) de fichiers ouvert que tu veux.
0
Et comment faire dans ce cas? :/
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
14 juin 2012 à 20:36
? faire quoi ?
0