Petit nouveau ! |
6 Messages
09 mai 2023, 21:41
Bonsoir,
Merci pour vos retour,
il faut debuger, afficher la console pour voir si les appels ajax sont bien faits à intervalle régulier, si le retour du php est bien celui attendu ...
Je n'ai rien vu de particulier ou en tout cas qui a attiré mon attention, pour savoir si ça fonctionné ou pas, si tu peux m'indiquer de quelle manière je pourrais voir les remontés ajax. Pour moi à première vu il n'y a pas de remonté.
Y a t il une solution afficher le retour de type echo...
Salut, à priori le problème est que php va bloquer sur la ligne $output = exec($cmd); tant que la conversion ne sera pas terminée et le retour du json ne se fera donc qu'une fois à la fin de la conversion.
Sinon on voit le code de conversion mais quel est le code de analyse_media.php ? c'est lui qui serait sensé retourner la progression.
PS : je ne crois pas qu'il y ait en php de véritable moyen d'obtenir la sortie d'une commande et de pousser les informations vers le client au fur et à mesure de l'exécution. Il faut plutôt pousser la sortie de la commande dans un fichier et avoir un script php appelé en ajax régulièrement qui va lire le contenu de ce fichier pour savoir où ça en est.
Le code de conversion est bien sur la page analyse_media.php. Si ça peut simplifier le fonctionnement, je peux unifier ces 2 pages en 1... le formulaire + la conversion (analyse_media.php).
Chat GPT ma donné ce code pour lire le fichier mais pas pour l'écrire... Je vais essayé de faire des recherches la dessus, merci.
Code : Tout sélectionner
<?php
$log_file = 'ffmpeg.log';
function read_log($log_file) {
$lines = file($log_file);
$last_line = end($lines);
$matches = array();
preg_match('/time=([0-9:.]+)/', $last_line, $matches);
if (!empty($matches)) {
$time_parts = explode(':', $matches[1]);
$total_seconds = $time_parts[0] * 3600 + $time_parts[1] * 60 + $time_parts[2];
return array('progress' => round($total_seconds / $total_duration * 100));
}
else {
return array('progress' => 0);
}
}
$total_duration = ...; // Durée totale de la vidéo à convertir
echo json_encode(read_log($log_file));
?>
est ce un début de réponse ??
Voici un 2éme code qu'il m'a donné
Code : Tout sélectionner
$handle = popen("ffmpeg -i ".$movie." -vcodec libx264 -maxrate 8000k -bufsize 1000K -minrate 10k -crf 24 -preset slow -ab 192k ".$movieC." 2>&1", "r");
// Traitez la sortie standard de la commande ffmpeg
while (!feof($handle)) {
$buffer = fgets($handle);
if (preg_match('/frame=\s*(\d+)\s+fps=\s*([\d\.]+)\s+q=\s*([\d\.]+)\s+size=\s*(\d+)\s+time=\s*([\d:\.]+)\s+bitrate=\s*([\d\.]+[kM]?bits\/s)\s+speed=\s*([\d\.]+x)?/', $buffer, $matches)) {
$frame = $matches[1];
$fps = $matches[2];
$q = $matches[3];
$size = $matches[4];
$time = $matches[5];
$bitrate = $matches[6];
$speed = $matches[7];
// Calculez le pourcentage d'avancement et mettez à jour la barre de progression
$percent = round($frame / 1000 * 100, 2);
echo "<script>updateProgressBar(".$percent.");</script>";
}
}
// Fermez le handle de la commande ffmpeg
pclose($handle);
Je n'ai pas compris le fonctionnent de cette commande "popen"
Voici un 3éme code qu'il m'a donné
Code : Tout sélectionner
// Créer une nouvelle requête AJAX
var xhr = new XMLHttpRequest();
// Configurer la requête avec la commande ffmpeg
xhr.open('GET', 'analyse_media.php?movie=' + encodeURIComponent(movie) + '&movieC=' + encodeURIComponent(movieC));
// Envoyer la requête AJAX
xhr.send();
// Mettre à jour la barre de progression en fonction de la sortie de la commande ffmpeg
xhr.addEventListener('progress', function(event) {
if (event.lengthComputable) {
var percentComplete = event.loaded / event.total * 100;
document.getElementById('progress').style.width = percentComplete + '%';
}
});
Là, il m'a perdu
Voici un 4éme code qu'il m'a donné
Code : Tout sélectionner
<script>
function startConversion() {
var fileInput = document.getElementById("fileInput");
var progressBar = document.getElementById("progressBar");
if (fileInput.files.length == 0) {
alert("Veuillez sélectionner un fichier vidéo.");
return;
}
var fileName = fileInput.files[0].name;
var filePath = fileInput.files[0].webkitRelativePath || fileInput.files[0].name;
var fileExt = fileName.split('.').pop();
var destFileName = 'converted_video.' + fileExt;
var cmd = 'ffmpeg -i ' + filePath + ' -vcodec libx264 -maxrate 8000k -bufsize 1000K -minrate 10k -crf 24 -preset slow -ab 192k ' + destFileName + ' 2>&1';
var duration = 0;
var progress = 0;
// Exécuter la commande ffmpeg
var output = exec(cmd);
// Récupérer les informations de progression
var regexDuration = /Duration: (\d{2}):(\d{2}):(\d{2})/;
var regexTime = /time=(\d{2}):(\d{2}):(\d{2})/;
var matchesDuration = output.match(regexDuration);
var matchesTime = output.match(new RegExp(regexTime, 'g'));
if (matchesDuration != null) {
duration = parseInt(matchesDuration[1]) * 3600 + parseInt(matchesDuration[2]) * 60 + parseInt(matchesDuration[3]);
}
if (matchesTime != null) {
var lastTime = matchesTime[matchesTime.length - 1].match(regexTime);
progress = Math.floor(parseInt(lastTime[1]) * 3600 + parseInt(lastTime[2]) * 60 + parseInt(lastTime[3]) / duration * 100);
}
// Mettre à jour la barre de progression
progressBar.value = progress;
// Continuer à exécuter la commande jusqu'à ce qu'elle soit terminée
if (progress < 100) {
setTimeout(startConversion, 1000);
}
}
</script>
Je vous met à disposition ces quelques lignes... de codes, si ça parle mieux à vous qu'à moi, voir donné des idées..
Merci pour votre aide