web-dev-qa-db-fra.com

Barre de progression FFMPEG - Pourcentage de codage en PHP

J'ai écrit un système entier dans PHP et bash sur le serveur pour convertir et diffuser des vidéos dans HTML5 sur mon VPS. La conversion est effectuée par FFMPEG en arrière-plan et le contenu est sorti block.txt .

Après avoir examiné les messages suivants:

CAN FFMPEG montre une barre de progression?

et

Barre de progression de codage vidéo FFMPEG

parmi d'autres, je ne trouve pas d'exemple de travail.

J'ai besoin de saisir les progrès actuellement codés comme un pourcentage.

Le premier message que j'ai lié ci-dessus donne:

$log = @file_get_contents('block.txt');

preg_match("/Duration:([^,]+)/", $log, $matches);
list($hours,$minutes,$seconds,$mili) = split(":",$matches[1]);
$seconds = (($hours * 3600) + ($minutes * 60) + $seconds);
$seconds = round($seconds);

$page = join("",file("$txt"));
$kw = explode("time=", $page);
$last = array_pop($kw);
$values = explode(' ', $last);
$curTime = round($values[0]);
$percent_extracted = round((($curTime * 100)/($seconds)));

echo $percent_extracted;

La variable $-cent ou une variable effaçée écho zéro et, en tant que mathématiques, n'est pas mon point fort, je ne sais vraiment pas comment progresser ici.

Voici une ligne de la sortie FFMPEG à partir de block.txt (si elle est utile)

time = 00: 19: 25.16 Bittrate = 823.0kbits/s Cadre = 27963 FPS = 7 Q = 0.0 Taille = 117085KB Temps = 00: 19: 25.33 BitTrate = 823.1kbits/s Cadre = 27967 FPS = 7 Q = 0.0 Taille = 117085KB Time = 00: 19: 25.49 Bittrate = 823.0kbits/s Cadre = 27971 FPS = 7 Q = 0.0 Taille = 117126KB

Aidez-moi s'il vous plaît sortir ce pourcentage, une fois que je peux créer ma propre barre de progression. Merci.

23
Jimbo

D'accord, j'ai trouvé ce dont j'avais besoin - et j'espère que cela aide également quelqu'un d'autre!

avant tout, vous souhaitez générer les données FFMPEG sur un fichier texte sur le serveur.

ffmpeg -i path/to/input.mov -vcodec videocodec -acodec audiocodec path/to/output.flv 1> block.txt 2>&1

Donc, la sortie FFMPEG est bloquée.txt. Maintenant, dans PHP, faisons cela!

$content = @file_get_contents('../block.txt');

if($content){
    //get duration of source
    preg_match("/Duration: (.*?), start:/", $content, $matches);

    $rawDuration = $matches[1];

    //rawDuration is in 00:00:00.00 format. This converts it to seconds.
    $ar = array_reverse(explode(":", $rawDuration));
    $duration = floatval($ar[0]);
    if (!empty($ar[1])) $duration += intval($ar[1]) * 60;
    if (!empty($ar[2])) $duration += intval($ar[2]) * 60 * 60;

    //get the time in the file that is already encoded
    preg_match_all("/time=(.*?) bitrate/", $content, $matches);

    $rawTime = array_pop($matches);

    //this is needed if there is more than one match
    if (is_array($rawTime)){$rawTime = array_pop($rawTime);}

    //rawTime is in 00:00:00.00 format. This converts it to seconds.
    $ar = array_reverse(explode(":", $rawTime));
    $time = floatval($ar[0]);
    if (!empty($ar[1])) $time += intval($ar[1]) * 60;
    if (!empty($ar[2])) $time += intval($ar[2]) * 60 * 60;

    //calculate the progress
    $progress = round(($time/$duration) * 100);

    echo "Duration: " . $duration . "<br>";
    echo "Current Time: " . $time . "<br>";
    echo "Progress: " . $progress . "%";

}

Cela génère le pourcentage de temps restant.

Vous pouvez avoir ceci comme le seul texte de texte a fait écho à une page, et à partir d'une autre page, vous pouvez effectuer une autre page AJAX Demande à l'aide de JQuery pour saisir cette pièce de texte et la sortir dans une DIV, Par exemple, pour mettre à jour sur votre page toutes les 10 secondes. :)

45
Jimbo

fFMPEG a maintenant une option de progression, ce qui donne la production plus facilement analysée.

fFMPEG -PROGRESS BLOCK.TXT -I PATHIO/TO/INPUT.MOV -VCODEC VIDEOCODEC -ACODEC AUDIOCODEC chemin/à/de la sortie.flv 2> & 1

Avant de commencer à encoder, vous pouvez obtenir le total des cadres et beaucoup d'autres informations avec ceci (c'est ce qui serait fait avec Bash. Je suis un programmeur Perl pour que je ne sache pas comment vous obtiendriez l'information dans votre PHP script).

eval $ (FFProbe -of plat = s = _ -show_entries flux = hauteur, largeur, nb_frames, durée, chemin de codec_name chemin/à/entré/entrée.mov);
largeur = $ {streams_stream_0_width};
Hauteur = $ {streams_stream_0_height};
Cadres = $ {streams_stream_0_nb_frames};
videoduration = $ {streams_stream_0_duration};
Audioduration = $ {streams_stream_1_duration};
codec = $ {streams_stream_0_codec_name};
echo $ largeur, $ hauteur, $ cadres, vidéo $ Vidéoduration, $ Audioduration, $ codec;

-Of flate = s = _ dit de mettre chaque nom = valeur sur une ligne séparée. -Show_entries lui dit de montrer les entrées de ce qui suit (flux pour -how_streams, format de -how_format, etc.) Stream = ... dit de montrer ces éléments de la sortie -Show_streams. Essayez ce qui suit pour voir ce qui est disponible:

fFProbe -Show_streams chemin/to/entrée.mov

La sortie du fichier de progression est ajoutée à environ une fois par seconde. Contenu, après la fin du codage, on dirait ce qui suit. Dans mon script, une fois qu'une seconde, je pose le fichier dans un tableau et traversez la matrice dans l'ordre inverse, en utilisant seulement ce qui est entre le premier [dernier avant inversion] deux lignes "progrès" que je trouve, de sorte que j'utilise le informations les plus récentes de la fin du fichier. Il peut y avoir de meilleurs moyens. Cela vient d'un MP4 sans audio, il n'y a donc qu'un seul flux.

cadre = 86
fps = 0.0
Stream_0_0_Q = 23.0
[.____] Total_size = 103173
[.____] Out_Time_MS = 1120000
[.____] Out_Time = 00: 00: 01.120000
DUP_FRAMES = 0
Drop_frames = 0
Progress = Continuer
cadre = 142
[.____] FPS = 140.9
Stream_0_0_Q = 23.0
Total_size = 415861
[.____] Out_Time_MS = 3360000
Out_Time = 00: 00: 03.360000
DUP_FRAMES = 0
Drop_Frames = 0
Progress = Continuer
cadre = 185
FPS = 121.1
Stream_0_0_Q = 23.0
[.____] Total_size = 1268982
[.____] Out_Time_MS = 5080000
[.____] Out_Time = 00: 00: 05.080000
DUP_FRAMES = 0
Drop_frames = 0
Progress = Continuer
cadre = 225
FPS = 110.9
Stream_0_0_Q = 23.0
Total_size = 2366000
[.____] Out_Time_MS = 6680000
[.____] Out_Time = 00: 00: 06.680000
DUP_FRAMES = 0
Drop_Frames = 0
Progress = Continuer
cadre = 262
[.____] FPS = 103.4
Stream_0_0_Q = 23.0
[.____] Total_size = 3810570
[.____] Out_Time_MS = 8160000
[.____] Out_Time = 00: 00: 08.160000
DUP_FRAMES = 0
Drop_frames = 0
Progress = Continuer
cadre = 299
fps = 84.9
Stream_0_0_Q = -1.0
[.____] Total_size = 6710373
[.____] Out_Time_MS = 11880000
Out_Time = 00: 00: 11.880000
DUP_FRAMES = 0
Drop_Frames = 0
Progress = fin

6
Fred McIntyre