[RESOLU] Problème d'encodage de texte

Avatar du membre
Eléphanteau du PHP | 14 Messages

31 mars 2023, 11:09

Bonjour, merci à vous de prendre de votre temps pour lire mon problème

Je vais vous expliquer en détails le problème sur lequel je suis.

Je suis actuellement en stage dans une entreprise de culture numérique et ils ont un projet (sur lequel je suis).
C'est une web app qui permet de filmer 5 vidéos et d'ajouter une description sous chaque vidéo comme un sous-titre.
À la fin, une vidéo est compilée pour faire comme une story.
Sur chaque vidéo que l'on a filmée, la description est ajoutée comme un sous-titre.

Toutes les informations que l'on a écrites comme les descriptions ou le titre de notre projet sont stocké dans un fichier .txt

Le problème est que si l'on écrit par exemple " C'est la première vidéo " en description de la première vidéo, l'apostrophe et supprimer et le "sous-titre" qui apparait sur la vidéo finale sera " Cest ".
Le restant de la phrase est aussi supprimer.

Dans le fichier .txt qui contient toutes les informations, les apostrophes sont remplacer par "'"
J'ai réussi à faire en sorte que les apostrophes soient bien enregistrées comme " ' " dans le fichier .txt

Donc on passe de "C'est la première vidéo" à "C'est la première vidéo".

Mais sur la vidéo de fin, le sous-titre est toujours affiché "Cest".

Le problème vient donc du fichier qui récupère et compile la vidéo.
Se ficher est un fichier php. Or, je ne mis connait pas en php.

Je voulais savoir si quelqu'un parmi vous saurait m’aider et me sortir de cette situation.

Je vous remercie pour l'attention que vous portez à mon problème.

Code : Tout sélectionner

<?php declare(strict_types = 1); array_shift($argv); // remove script name in $argv[0] $parameters = array_reduce($argv, function($carry, $arg) { $tokens = explode('=', $arg); $carry[$tokens[0]] = $tokens[1]; return $carry; }, []); $projectPath = $parameters['projectPath']; $musicPath = $parameters['musicPath']; $fontPath = getcwd() . "/public/fonts/cobol/Cobol-Bold.ttf"; $logoPath = getcwd() . "/public/images/saintex.jpg"; $carnetLogoPath = getcwd() . "/public/images/CarnetTitre.jpg"; // Adding descriptions for each clip and fade in and fade out filters $clipsToDescribe = glob("$projectPath/*.webm"); $clipFrameRate = (int) shell_exec("cd $projectPath && ffprobe -v error -select_streams v -of default=noprint_wrappers=1:nokey=1 -show_entries stream=r_frame_rate $clipsToDescribe[0]"); $clipFrameRate = $clipFrameRate > 60 ? 30 : $clipFrameRate; for($i = 1; $i <= count($clipsToDescribe); $i++) { $clipIndex = $i - 1; $clipFrames = (int) shell_exec("cd $projectPath && ffprobe -v error -select_streams v:0 -count_packets -show_entries stream=nb_read_packets -of csv=p=0 $clipsToDescribe[$clipIndex]"); $clipDuration = (float) ($clipFrames / $clipFrameRate) - 0.5; file_put_contents("$projectPath/clip${i}_desc.txt", $parameters["clip${i}_desc"]); //file_put_contents("$projectPath/clip${i}_name.txt", $parameters["clip${i}_name"]); shell_exec("cd $projectPath && ffmpeg -i $clipsToDescribe[$clipIndex] -vf 'drawtext=fontfile=$fontPath: textfile=clip${i}_desc.txt: fontcolor=white: fontsize=46: box=1: [email protected]: boxborderw=5: x=(w-text_w)/2: y=(h-text_h-50): fix_bounds=true, fade=t=in:st=0:d=0.3,fade=t=out:st=$clipDuration:d=0.3' -b:v 3000K -b:a 192K clip${i}.webm"); //shell_exec("cd $projectPath && ffmpeg -i $clipsToDescribe[$clipIndex] -vf 'drawtext=fontfile=$fontPath: textfile=clip${i}_name.txt: fontcolor=white: fontsize=46: box=1: [email protected]: boxborderw=5: x=(w-text_w)/2: y=(h-text_h-500): fix_bounds=true, fade=t=in:st=0:d=0.5,fade=t=out:st=$clipDuration:d=0.5' -b:v 3000K -b:a 192K clip${i}.webm"); } array_map('unlink', glob("$projectPath/*desc.txt")); shell_exec("cd $projectPath && ffmpeg -t 2 -f lavfi -i color=c=black:s=1280x720 -r 30 blank.webm"); shell_exec("cd $projectPath && ffmpeg -i blank.webm -i $carnetLogoPath -filter_complex '[0:v][1:v] overlay=(main_w/2)-(overlay_w/2):(main_h/2)-(overlay_h/2)' -pix_fmt yuv420p -c:a copy logo.webm"); $workshop = $parameters["workshop_type"]; $title = $parameters["title"]; shell_exec("cd $projectPath && ffmpeg -f lavfi -i color=size=1280x720:duration=3:rate=30:color=black -vf 'drawtext=text=$workshop:fontfile=$fontPath:fontcolor=white:fontsize=46:x=(w-text_w)/2:y=(h-text_h)/2, drawtext=text=$title:fontfile=$fontPath:fontcolor=white:fontsize=46:x=(w-text_w)/2:y=((h-text_h)/2)+lh+5' opening.webm"); unlink("$projectPath/blank.webm"); $videosFile = "file 'logo.webm'\n"; $videosFile .= "file 'opening.webm'\n";{ file_put_contents("$projectPath/project_desc.txt", $parameters["project_desc"]); shell_exec("cd $projectPath && ffmpeg -f lavfi -i color=size=1280x720:duration=3:rate=30:color=black -vf 'drawtext=fontfile=$fontPath:fontsize=46:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:textfile=project_desc.txt' project_desc.webm"); unlink("$projectPath/project_desc.txt"); $videosFile .= "file 'project_desc.webm'\n"; } if(array_key_exists("participants", $parameters)) { file_put_contents("$projectPath/participants.txt", "Participants :\n" . $parameters["participants"]); shell_exec("cd $projectPath && ffmpeg -f lavfi -i color=size=1280x720:duration=2:rate=30:color=black -vf 'drawtext=fontfile=$fontPath:fontsize=46:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:textfile=participants.txt' participants.webm"); unlink("$projectPath/participants.txt"); } $videos = glob("$projectPath/clip*.webm"); foreach($videos as $video) { if($video != "originalVideos") { $videosFile .= "file ". "'{$video}'\n"; } } if(array_key_exists("participants", $parameters)) { $videosFile .= "file '$projectPath/participants.webm'"; } array_map('unlink', glob("$projectPath/*webm.txt")); file_put_contents("$projectPath/videosFile.txt", $videosFile); if($musicPath == "/_musics/") { echo(shell_exec("cd $projectPath && ffmpeg -f concat -safe 0 -i videosFile.txt -b:v 10000K -crf 20 -b:a 192K output.webm")); } else { echo(shell_exec("cd $projectPath && ffmpeg -f concat -safe 0 -i videosFile.txt -b:v 10000K -crf 20 -b:a 192K assembled.webm && ffmpeg -i assembled.webm -i ../..$musicPath -filter_complex ' [1:0] apad ' -shortest -y -b:v 3000K -b:a 192K output.webm")); }
J'ai effectuer des recherche sur le net et j'ai vu une histoire de htmlentities.
Je pense que cela pourrai régler mon problème mais je ne sais pas comment l'appliquer dans le code.

Je pense que cela doit ce passer sur la ligne

Code : Tout sélectionner

file_put_contents("$projectPath/clip${i}_desc.txt", $parameters["clip${i}_desc"]);
.

Merci à vous. :priere:
Développeur Web et Web mobile junior.
HTML, CSS, JAVASCRIPT, REACT, NODE, EXPRESS.

Avatar du membre
Mammouth du PHP | 1609 Messages

31 mars 2023, 11:28

Salut, tu peux toujours tenter le htmlentities mais je doute que ça règle le problème, c'est surement plus une question d'encodage des caractères (UTF-8, ISO-8859-1, etc). D'ailleurs htmlentities pour fonctionner correctement doit avoir le bon encodage de spécifié.
https://www.php.net/manual/en/function.htmlentities.php

Il faudrait en fait savoir quel encodage est nécessaire à ffmpeg pour lui fournir un fichier dans l'encodage correspondant.
Développeur web depuis + de 20 ans

Avatar du membre
Eléphanteau du PHP | 14 Messages

31 mars 2023, 11:41

Je ne sais pas si cela peut aider mais la vidéo qui en ressort est au format .webm
Développeur Web et Web mobile junior.
HTML, CSS, JAVASCRIPT, REACT, NODE, EXPRESS.

Avatar du membre
Mammouth du PHP | 1609 Messages

31 mars 2023, 11:51

De ce que je viens de voir ici http://underpop.online.fr/f/ffmpeg/help/drawtext.htm.gz à textfile : The text must be a sequence of UTF-8 encoded characters.

Il faut donc que le fichier soit encodé en UTF-8. Il faut bien s'assurer en ouvrant le fichier avec un encodage utf-8 que les caractères spéciaux sont bien affichés. Si c'est le cas et que les caractères ne sont toujours pas visibles, cela pourrait venir du fichier ttf qui ne contiendrait pas les caractères spéciaux.

Le problème pour pouvoir bien encoder le fichier en utf-8 est de savoir quel est l'encodage d'origine du texte. Tu peux faire un utf8_encode mais c'est à condition que l'encodage d'origine soit bien de l'ISO-8859-1.

Sinon faut se diriger vers les fonctions mb_convert_encoding ou iconv qui permettent de définir encodages d'entrée et de sortie, mais faudra déterminer quel est l'encodage d'origine.

https://www.php.net/manual/fr/function.utf8-encode.php
https://www.php.net/manual/en/function. ... coding.php
https://www.php.net/manual/fr/function.iconv.php
Développeur web depuis + de 20 ans

Avatar du membre
Eléphanteau du PHP | 14 Messages

03 avr. 2023, 09:44

Mon fichier .txt est bien encoder en UTF-8.
Ce que je ne comprend pas c'est que dans ce fichier (où ce trouve toutes les informations des différentes vidéos) les sous-titres sont sauvegarder comme ceci : (C&#x27,est une vidéo), donc j'ai changer mon code pour que ce soit sauvegarder normalement comme ceci : (C'est une vidéo).

Que ce soit dans les deux formats, dans ma vidéo générer le sous titre sera toujours : (Cest).

J'ai aussi regarder mais le fichier ttf contient bien les caractères avec accent ainsi que l'apostrophe.
Développeur Web et Web mobile junior.
HTML, CSS, JAVASCRIPT, REACT, NODE, EXPRESS.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

03 avr. 2023, 10:28

L'encodage des apostrophes simples en &#x27; c'est un encodage HTML en hexa :
https://www.codetable.net/hex/27

PHP dispose de la fonction html_entity_decode() pour décoder ces caractères :
https://php.net/html_entity_decode
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Mammouth du PHP | 1564 Messages

03 avr. 2023, 10:33

Essayer sans la police d'écriture pour mettre de côté cette possibilité.

Avatar du membre
Eléphanteau du PHP | 14 Messages

03 avr. 2023, 11:45

Je tiens vraiment à m'excuser car je suis vraiment novice avec php et je ne comprend pas tout.
Je ne sais pas comment utiliser html_entity_decode.
Je comprend comment il fonctionne mais je ne sais pas comment l'inclure dans mon code car je n'ai pas de texte à proprement dit.
Je récupère le texte qui est stocker dans un fichier .txt qui n'est pas stocker dans le même dossier que le code du projet.
je sais c'est étrange mais c'est comme cela que le projet est fait.
Il n'y à seulement que cette histoire d'apostrophe qui me pose problème.
Développeur Web et Web mobile junior.
HTML, CSS, JAVASCRIPT, REACT, NODE, EXPRESS.

Avatar du membre
Mammouth du PHP | 1564 Messages

03 avr. 2023, 13:24

Pour essayer sans ttf (je promet rien) :
declare(strict_types = 1);
array_shift($argv); // remove script name in $argv[0]
$parameters = array_reduce($argv, function($carry, $arg) {
$tokens = explode('=', $arg);
$carry[$tokens[0]] = $tokens[1];
return $carry;
}, []);
$projectPath = $parameters['projectPath'];
$musicPath = $parameters['musicPath'];
$fontPath = getcwd() . "/public/fonts/cobol/Cobol-Bold.ttf";
$logoPath = getcwd() . "/public/images/saintex.jpg";
$carnetLogoPath = getcwd() . "/public/images/CarnetTitre.jpg";
// Adding descriptions for each clip and fade in and fade out filters
$clipsToDescribe = glob("$projectPath/*.webm");
$clipFrameRate = (int) shell_exec("cd $projectPath && ffprobe -v error -select_streams v -of default=noprint_wrappers=1:nokey=1 -show_entries stream=r_frame_rate $clipsToDescribe[0]");
$clipFrameRate = $clipFrameRate > 60 ? 30 : $clipFrameRate;
for($i = 1; $i <= count($clipsToDescribe); $i++) {
$clipIndex = $i - 1;
$clipFrames = (int) shell_exec("cd $projectPath && ffprobe -v error -select_streams v:0 -count_packets -show_entries stream=nb_read_packets -of csv=p=0 $clipsToDescribe[$clipIndex]");
$clipDuration = (float) ($clipFrames / $clipFrameRate) - 0.5;
file_put_contents("$projectPath/clip${i}_desc.txt", $parameters["clip${i}_desc"]);
//file_put_contents("$projectPath/clip${i}_name.txt", $parameters["clip${i}_name"]);
shell_exec("cd $projectPath && ffmpeg -i $clipsToDescribe[$clipIndex] -vf 'drawtext=textfile=clip${i}_desc.txt: fontcolor=white: fontsize=46: box=1: [email protected]: boxborderw=5: x=(w-text_w)/2: y=(h-text_h-50): fix_bounds=true, fade=t=in:st=0:d=0.3,fade=t=out:st=$clipDuration:d=0.3' -b:v 3000K -b:a 192K clip${i}.webm");
//shell_exec("cd $projectPath && ffmpeg -i $clipsToDescribe[$clipIndex] -vf 'drawtext=fontfile=$fontPath: textfile=clip${i}_name.txt: fontcolor=white: fontsize=46: box=1: [email protected]: boxborderw=5: x=(w-text_w)/2: y=(h-text_h-500): fix_bounds=true, fade=t=in:st=0:d=0.5,fade=t=out:st=$clipDuration:d=0.5' -b:v 3000K -b:a 192K clip${i}.webm");
}
array_map('unlink', glob("$projectPath/*desc.txt"));
shell_exec("cd $projectPath && ffmpeg -t 2 -f lavfi -i color=c=black:s=1280x720 -r 30 blank.webm");
shell_exec("cd $projectPath && ffmpeg -i blank.webm -i $carnetLogoPath -filter_complex '[0:v][1:v] overlay=(main_w/2)-(overlay_w/2):(main_h/2)-(overlay_h/2)' -pix_fmt yuv420p -c:a copy logo.webm");
$workshop = $parameters["workshop_type"];
$title = $parameters["title"];
shell_exec("cd $projectPath && ffmpeg -f lavfi -i color=size=1280x720:duration=3:rate=30:color=black -vf 'drawtext=text=$workshop:fontcolor=white:fontsize=46:x=(w-text_w)/2:y=(h-text_h)/2, drawtext=text=$title:fontcolor=white:fontsize=46:x=(w-text_w)/2:y=((h-text_h)/2)+lh+5' opening.webm");
unlink("$projectPath/blank.webm");
$videosFile = "file 'logo.webm'\n";
$videosFile .= "file 'opening.webm'\n";{
file_put_contents("$projectPath/project_desc.txt", $parameters["project_desc"]);
shell_exec("cd $projectPath && ffmpeg -f lavfi -i color=size=1280x720:duration=3:rate=30:color=black -vf 'drawtext=fontsize=46:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:textfile=project_desc.txt' project_desc.webm");
unlink("$projectPath/project_desc.txt");
$videosFile .= "file 'project_desc.webm'\n";
}
if(array_key_exists("participants", $parameters)) {
file_put_contents("$projectPath/participants.txt", "Participants :\n" . $parameters["participants"]);
shell_exec("cd $projectPath && ffmpeg -f lavfi -i color=size=1280x720:duration=2:rate=30:color=black -vf 'drawtext=fontsize=46:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:textfile=participants.txt' participants.webm");
unlink("$projectPath/participants.txt");
}
$videos = glob("$projectPath/clip*.webm");
foreach($videos as $video) {
if($video != "originalVideos") {
$videosFile .= "file ". "'{$video}'\n";
}
}
if(array_key_exists("participants", $parameters)) {
$videosFile .= "file '$projectPath/participants.webm'";
}
array_map('unlink', glob("$projectPath/*webm.txt"));
file_put_contents("$projectPath/videosFile.txt", $videosFile);
if($musicPath == "/_musics/") {
echo(shell_exec("cd $projectPath && ffmpeg -f concat -safe 0 -i videosFile.txt -b:v 10000K -crf 20 -b:a 192K output.webm"));
} else {
echo(shell_exec("cd $projectPath && ffmpeg -f concat -safe 0 -i videosFile.txt -b:v 10000K -crf 20 -b:a 192K assembled.webm && ffmpeg -i assembled.webm -i ../..$musicPath -filter_complex ' [1:0] apad ' -shortest -y -b:v 3000K -b:a 192K output.webm"));
} 

Avatar du membre
Eléphanteau du PHP | 14 Messages

03 avr. 2023, 14:18

Je viens d'essayer ton code et cela n'a rien changé.
La police à bien était enlevé, mais les apostrophes sont toujours absente.

Je ne sais pas si cela peut aider, mais en tout il y a 5 vidéos avec chacune un sous-titre.

Sur la première "C'est la première vidéo", sur la deuxième "C'est la deuxième vidéo"... Et ainsi de suite.

Étant donné que les apostrophes sont remplacé par " ' ", sur la première vidéo apparait " Cest ", sur la deuxième il n'y a pas de sous titre, sur la troisième " Cest"... Et ainsi de suite.

Comme il y a un " ; " à la fin de " &#x27; ", je pense que ça casse tout.
Développeur Web et Web mobile junior.
HTML, CSS, JAVASCRIPT, REACT, NODE, EXPRESS.

Avatar du membre
Mammouth du PHP | 1564 Messages

03 avr. 2023, 14:35

Lors de l'insertion du texte dans le .txt, ne pas le traduire en entités HTML/hexadécimal, le garder tel qu'il est.

Avatar du membre
Eléphanteau du PHP | 14 Messages

03 avr. 2023, 15:11

J'ai changer mon code, désormais il sauvegarde bien les sous-titres avec les apostrophes dans le fichier .txt ( C'est la première vidéo ).
Mais une fois la vidéo complétement générer, c'est toujours pareil, c'est afficher ( Cest ).
Développeur Web et Web mobile junior.
HTML, CSS, JAVASCRIPT, REACT, NODE, EXPRESS.

Avatar du membre
Mammouth du PHP | 1564 Messages

03 avr. 2023, 15:20

Avant l'insertion dans le txt mettre mettre antislash devant les apostrophes : \'

Je tente de savoir, je connais pas ffmpeg, peut être qu'il aime pas les ' et les enlève

Faire une recherche internet avec "simple quote ffmpeg" pour voir si on en parle ailleurs ;)

Avatar du membre
Eléphanteau du PHP | 14 Messages

03 avr. 2023, 15:56

J'ai trouver cela sur le net http://underpop.online.fr/f/ffmpeg/help ... ing.htm.gz mais je ne comprend pas trop comment appliquer cela.
Développeur Web et Web mobile junior.
HTML, CSS, JAVASCRIPT, REACT, NODE, EXPRESS.

Avatar du membre
Mammouth du PHP | 1564 Messages

03 avr. 2023, 16:11

Ils parlent de l'échappement dans la ligne de commande, rien à voir avec votre méthode qui est d’utiliser un fichier pour le texte.