[RESOLU] Problème d'encodage de texte

ynx
Mammouth du PHP | 586 Messages

03 avr. 2023, 16:45

Le problème ne semble pas venir de l'encodage UTF-8 puisque tu aurais surement constaté une erreur avec les accents dans "C'est la première vidéo".

Le caractère ' à échapper pour utiliser les commandes ffmpeg semble une bonne piste mais l'utilisation d'un textfile permet justement de ne pas avoir à ce soucier de l'échappement des caractères.

Seules les apostrophes sont converties en entités html dans les fichiers txt ? Curieux mais il y a peut-être une bonne raison, dommage de pas avoir plus de doc sur l'utilisation de ton script (je suppose que l'auteur du code n'est plus dans l'entreprise ?).

Le script PHP a déjà fonctionné pour d'autres projets ? Si oui, p-e comparer avec les fichiers des projets fonctionnels.

Avatar du membre
Eléphanteau du PHP | 14 Messages

04 avr. 2023, 09:38

Effectivement seul ' pose problème dans tout cela.
Dans le fichier TXT désormais ' n'est plus sous forme de ' mais c'est bien sauvegarder en tant que '. J'ai modifier le code qui écrit dans le fichier TXT.
Image

Je pense que FFMPEG pose problème mais l'échappement à l'air plutôt compliquer quand c'est du texte qui provient d'un textfile.

Et oui la personne ayant écrit ce script n'est plus la malheureusement et non ce script n'est utiliser que dans ce projet.

Le script PHP fonctionne mais les apostrophes posent problème.
Développeur Web et Web mobile junior.
HTML, CSS, JAVASCRIPT, REACT, NODE, EXPRESS.

Avatar du membre
Mammouth du PHP | 1564 Messages

04 avr. 2023, 12:07

Essayer avec cet apostrophe : ’ (penchée, pas droite ')

Avatar du membre
Eléphanteau du PHP | 14 Messages

04 avr. 2023, 14:38

Je viens d'essayer avec l'apostrophe penchée et effectivement ça fonctionne. =D>
Image

Je ne sais pas si c'est possible de faire quelque chose qui fait que si il rencontre ce caractère ' il remplace par ’ :?:
Développeur Web et Web mobile junior.
HTML, CSS, JAVASCRIPT, REACT, NODE, EXPRESS.

Avatar du membre
Mammouth du PHP | 1564 Messages

04 avr. 2023, 15:11

Au moment d'ajouter le texte dans le txt, il te faut passer le texte à la fonction str_replace() de PHP :
$texte = str_replace("'", "’", $_POST['texte']);
file_put_content("fichier.txt", $texte);

Avatar du membre
Eléphanteau du PHP | 14 Messages

04 avr. 2023, 15:27

Je comprend le principe mais je n'arrive pas à voir où et comment doit-je inclure cela dans mon code.

Code : Tout sélectionner

$clipDuration = (float) ($clipFrames / $clipFrameRate) - 0.5; file_put_contents("$projectPath/clip${i}_desc.txt", $parameters["clip${i}_desc"]); 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");
Je viens d'essayer de l'incorporer de cette façon

Code : Tout sélectionner

// 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; $clipDescription = $parameters["clip${i}_desc"]; // Use str_replace() function to replace ' with ’ $clipDescription = str_replace("'", "’", $clipDescription); file_put_contents("$projectPath/clip${i}_desc.txt", $clipDescription); 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");
mais cela me renvoie une erreur au moment de générer la vidéo et le processus ce coupe.

Code : Tout sélectionner

{ Error: Command failed: php ./public/src/generate.php projectPath='/home/rohan/Documents/dodoc2/_projects/nouveau-test' musicPath='/_musics/classic.mp3' clip1_name='' clip2_name='' clip3_name='' clip4_name='' clip5_name='' clip1_desc='C'est un nouveau test ' clip2_desc='C'est le deuxième test' clip3_desc='C'est le troisième test' clip4_desc='C'est le quatrième ' clip5_desc='C'est le dernier' project_desc='' workshop_type='Un nouveau test' title='Nouveau test' participants='Molinillo Rohan ' PHP Warning: Undefined array key 1 in /home/rohan/carnet-numerique/public/src/generate.php on line 6 PHP Warning: Undefined array key 1 in /home/rohan/carnet-numerique/public/src/generate.php on line 6 PHP Warning: Undefined array key 1 in /home/rohan/carnet-numerique/public/src/generate.php on line 6 PHP Warning: Undefined array key 1 in /home/rohan/carnet-numerique/public/src/generate.php on line 6 PHP Warning: Undefined array key 1 in /home/rohan/carnet-numerique/public/src/generate.php on line 6 PHP Warning: Undefined array key 1 in /home/rohan/carnet-numerique/public/src/generate.php on line 6 PHP Warning: Undefined array key 1 in /home/rohan/carnet-numerique/public/src/generate.php on line 6 PHP Warning: Undefined array key 1 in /home/rohan/carnet-numerique/public/src/generate.php on line 6 ffmpeg version 5.1.1-1ubuntu2.1 Copyright (c) 2000-2022 the FFmpeg developers built with gcc 12 (Ubuntu 12.2.0-3ubuntu1) configuration: --prefix=/usr --extra-version=1ubuntu2.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librist --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --disable-sndio --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-libplacebo --enable-shared libavutil 57. 28.100 / 57. 28.100 libavcodec 59. 37.100 / 59. 37.100 libavformat 59. 27.100 / 59. 27.100 libavdevice 59. 7.100 / 59. 7.100 libavfilter 8. 44.100 / 8. 44.100 libswscale 6. 7.100 / 6. 7.100 libswresample 4. 7.100 / 4. 7.100 libpostproc 56. 6.100 / 56. 6.100 Input #0, matroska,webm, from '/home/rohan/Documents/dodoc2/_projects/nouveau-test/video-20230404-155131-80i.webm': Metadata: encoder : QTmuxingAppLibWebM-0.0.1 Duration: N/A, start: -0.001000, bitrate: N/A Stream #0:0(eng): Video: vp8, yuv420p(progressive), 1280x720, SAR 1:1 DAR 16:9, 1k tbr, 1k tbn (default) Stream #0:1(eng): Audio: opus, 48000 Hz, stereo, fltp (default) Stream mapping: Stream #0:0 -> #0:0 (vp8 (native) -> vp9 (libvpx-vp9)) Stream #0:1 -> #0:1 (opus (native) -> opus (libopus)) Press [q] to stop, [?] for help [libvpx-vp9 @ 0x55c0b046cc40] v1.12.0 Output #0, webm, to 'clip1.webm': Metadata: encoder : Lavf59.27.100 Stream #0:0(eng): Video: vp9, yuv420p(tv, bt470bg/unknown/unknown, progressive), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 3000 kb/s, 1k fps, 1k tbn (default) Metadata: encoder : Lavc59.37.100 libvpx-vp9 Side data: cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A Stream #0:1(eng): Audio: opus, 48000 Hz, stereo, flt, 192 kb/s (default) Metadata: encoder : Lavc59.37.100 libopus frame= 197 fps= 10 q=18.0 Lsize= 2268kB time=00:00:06.50 bitrate=2857.7kbits/s speed=0.339x video:2094kB audio:169kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.189658% PHP Warning: Undefined array key "clip2_desc" in /home/rohan/carnet-numerique/public/src/generate.php on line 22 PHP Fatal error: Uncaught TypeError: str_replace(): Argument #3 ($subject) must be of type array|string, null given in /home/rohan/carnet-numerique/public/src/generate.php:24 Stack trace: #0 /home/rohan/carnet-numerique/public/src/generate.php(24): str_replace() #1 {main} thrown in /home/rohan/carnet-numerique/public/src/generate.php on line 24 /bin/sh: 2: Syntax error: Unterminated quoted string at ChildProcess.exithandler (child_process.js:275:12) at emitTwo (events.js:126:13) at ChildProcess.emit (events.js:214:7) at maybeClose (internal/child_process.js:925:16) at Process.ChildProcess._handle.onexit (internal/child_process.js:209:5) killed: false, code: 2, signal: null, cmd: 'php ./public/src/generate.php projectPath=\'/home/rohan/Documents/dodoc2/_projects/nouveau-test\' musicPath=\'/_musics/classic.mp3\' clip1_name=\'\' clip2_name=\'\' clip3_name=\'\' clip4_name=\'\' clip5_name=\'\' clip1_desc=\'C\'est un nouveau test \' clip2_desc=\'C\'est le deuxième test\' clip3_desc=\'C\'est le troisième test\' clip4_desc=\'C\'est le quatrième \' clip5_desc=\'C\'est le dernier\' project_desc=\'\' workshop_type=\'Un nouveau test\' title=\'Nouveau test\' participants=\'Molinillo Rohan\n\'' }
Développeur Web et Web mobile junior.
HTML, CSS, JAVASCRIPT, REACT, NODE, EXPRESS.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

04 avr. 2023, 16:11

Il faut que tu échappes tes apostrophes, donc les remplacer par \'
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Eléphanteau du PHP | 14 Messages

04 avr. 2023, 16:36

Il faut que tu échappes tes apostrophes, donc les remplacer par \'
Même si je fais en sorte que les apostrophes soit écrite en échapper dans mon fichier TXT, le script PHP ne le prend pas en compte et les sous-titres afficher sur la vidéo sont toujours cassé. :?
Développeur Web et Web mobile junior.
HTML, CSS, JAVASCRIPT, REACT, NODE, EXPRESS.

Avatar du membre
Mammouth du PHP | 1609 Messages

04 avr. 2023, 16:54

Il ne faut pas échapper les ' qui encadre la chaine, seulement les ' à l'intérieur de la chaine et uniquement parce que tu utilises le même caractère.
clip1_desc='C\'est un nouveau test'
Ceci devrait fonctionner :
clip1_desc="C'est un nouveau test"
Développeur web depuis + de 20 ans

Avatar du membre
Mammouth du PHP | 1564 Messages

04 avr. 2023, 17:07

Tu as bien un formulaire pour taper les subtitles de tes vidéos ?

=> Dans cette fameuse page où tu renseigne tes subtitles => avant d'insérer dans dans le txt, tu passe ton texte avec la fonction str_replace.

Tu n'aura pas besoin de les échapper dans ce code là. D'ailleurs ce que tu tente dans ce code n'a aucun effet car la commande prend ce qui est DANS le txt.

Avatar du membre
Mammouth du PHP | 1609 Messages

04 avr. 2023, 17:13

@two3d, le fichier descriptif est remplit avec la donnée provenant de la commande.
$parameters = array_reduce($argv, function($carry, $arg) {
    $tokens = explode('=', $arg);
    $carry[$tokens[0]] = $tokens[1];
    return $carry;
}, []);
//...
file_put_contents("$projectPath/clip${i}_desc.txt", $parameters["clip${i}_desc"]);
Développeur web depuis + de 20 ans

Avatar du membre
Mammouth du PHP | 1564 Messages

04 avr. 2023, 19:45

OK, ce qui est bizarre c'est que les apostrophes ne sembles pas être remplacées, on peut le voir dans l'erreur :

Error: Command failed: php ./public/src/generate.php projectPath='/home/rohan/Documents/dodoc2/_projects/nouveau-test' musicPath='/_musics/classic.mp3' clip1_name='' clip2_name='' clip3_name='' clip4_name='' clip5_name='' clip1_desc='C'est un nouveau test ' clip2_desc='C'est le deuxième test' clip3_desc='C'est le troisième te...

Faire un test pour être sur qu'il remplace bien ce qu'on veut, faire ceci :
$clipDescription = $parameters["clip${i}_desc"];
// Use str_replace() function to replace ' with ’
$clipDescription = str_replace("est", "ok", $clipDescription);
Si l'erreur marque :

Error: Command failed: php ./public/src/generate.php projectPath='/home/rohan/Documents/dodoc2/_projects/nouveau-test' musicPath='/_musics/classic.mp3' clip1_name='' clip2_name='' clip3_name='' clip4_name='' clip5_name='' clip1_desc='C'ok un nouveau test ' clip2_desc...

Il remplace bien, sinon on verra d'autres pistes.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

04 avr. 2023, 19:45

Même si je fais en sorte que les apostrophes soit écrite en échapper dans mon fichier TXT, le script PHP ne le prend pas en compte et les sous-titres afficher sur la vidéo sont toujours cassé. :?
Fais déjà marcher ton appel FFMPEG sans passer par PHP.
Une fois que ça marchera sur un exemple, tu le rendras dynamique avec PHP
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Eléphanteau du PHP | 14 Messages

06 avr. 2023, 11:33

@two3d
Voilà, après modification, voici l'erreur que ça me retourne.

Code : Tout sélectionner

{ Error: Command failed: php ./public/src/generate.php projectPath='/home/rohan/Documents/dodoc2/_projects/test-2' musicPath='/_musics/canals.mp3' clip1_name='' clip2_name='' clip3_name='' clip4_name='' clip5_name='' clip1_desc='C'est la première' clip2_desc='C'est la deuxième' clip3_desc='C'est la troisième' clip4_desc='C'est l'avant dernière' clip5_desc='C'est la dernière' project_desc='' workshop_type='Atelier Robotique' title='Test 2' participants='Molinillo Rohan ' PHP Warning: Undefined array key 1 in /home/rohan/carnet-numerique/public/src/generate.php on line 6 PHP Warning: Undefined array key 1 in /home/rohan/carnet-numerique/public/src/generate.php on line 6 ffmpeg version 5.1.1-1ubuntu2.1 Copyright (c) 2000-2022 the FFmpeg developers built with gcc 12 (Ubuntu 12.2.0-3ubuntu1) configuration: --prefix=/usr --extra-version=1ubuntu2.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librist --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --disable-sndio --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-libplacebo --enable-shared libavutil 57. 28.100 / 57. 28.100 libavcodec 59. 37.100 / 59. 37.100 libavformat 59. 27.100 / 59. 27.100 libavdevice 59. 7.100 / 59. 7.100 libavfilter 8. 44.100 / 8. 44.100 libswscale 6. 7.100 / 6. 7.100 libswresample 4. 7.100 / 4. 7.100 libpostproc 56. 6.100 / 56. 6.100 Input #0, matroska,webm, from '/home/rohan/Documents/dodoc2/_projects/test-2/video-20230406-112907-sxn.webm': Metadata: encoder : QTmuxingAppLibWebM-0.0.1 Duration: N/A, start: -0.001000, bitrate: N/A Stream #0:0(eng): Video: vp8, yuv420p(progressive), 1280x720, SAR 1:1 DAR 16:9, 10 tbr, 1k tbn (default) Stream #0:1(eng): Audio: opus, 48000 Hz, stereo, fltp (default) Stream mapping: Stream #0:0 -> #0:0 (vp8 (native) -> vp9 (libvpx-vp9)) Stream #0:1 -> #0:1 (opus (native) -> opus (libopus)) Press [q] to stop, [?] for help [libvpx-vp9 @ 0x555b9789cdc0] v1.12.0 Output #0, webm, to 'clip1.webm': Metadata: encoder : Lavf59.27.100 Stream #0:0(eng): Video: vp9, yuv420p(tv, bt470bg/unknown/unknown, progressive), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 3000 kb/s, 10 fps, 1k tbn (default) Metadata: encoder : Lavc59.37.100 libvpx-vp9 Side data: cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A Stream #0:1(eng): Audio: opus, 48000 Hz, stereo, flt, 192 kb/s (default) Metadata: encoder : Lavc59.37.100 libopus frame= 93 fps=9.9 q=2.0 Lsize= 2051kB time=00:00:09.24 bitrate=1818.4kbits/s speed=0.981x video:1798kB audio:249kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.222542% PHP Warning: Undefined array key "clip2_desc" in /home/rohan/carnet-numerique/public/src/generate.php on line 22 PHP Fatal error: Uncaught TypeError: str_replace(): Argument #3 ($subject) must be of type array|string, null given in /home/rohan/carnet-numerique/public/src/generate.php:23 Stack trace: #0 /home/rohan/carnet-numerique/public/src/generate.php(23): str_replace() #1 {main} thrown in /home/rohan/carnet-numerique/public/src/generate.php on line 23 at ChildProcess.exithandler (child_process.js:275:12) at emitTwo (events.js:126:13) at ChildProcess.emit (events.js:214:7) at maybeClose (internal/child_process.js:925:16) at Process.ChildProcess._handle.onexit (internal/child_process.js:209:5) killed: false, code: 255, signal: null, cmd: 'php ./public/src/generate.php projectPath=\'/home/rohan/Documents/dodoc2/_projects/test-2\' musicPath=\'/_musics/canals.mp3\' clip1_name=\'\' clip2_name=\'\' clip3_name=\'\' clip4_name=\'\' clip5_name=\'\' clip1_desc=\'C\'est la première\' clip2_desc=\'C\'est la deuxième\' clip3_desc=\'C\'est la troisième\' clip4_desc=\'C\'est l\'avant dernière\' clip5_desc=\'C\'est la dernière\' project_desc=\'\' workshop_type=\'Atelier Robotique\' title=\'Test 2\' participants=\'Molinillo Rohan\n\'' }
Développeur Web et Web mobile junior.
HTML, CSS, JAVASCRIPT, REACT, NODE, EXPRESS.

ynx
Mammouth du PHP | 586 Messages

06 avr. 2023, 12:59

Pas convaincu que le problème vienne de ce script php.
Quel est le processus qui exécute la commande php ./public/src/generate.php ? Tu as un autre script/app qui lance la génération des vidéos ?