Prty::FFmpeg - Konstruiere eine FFmpeg-Kommandozeile
Prty::Hash
FFmpg Online-Dokumentation: https://www.ffmpeg.org/ffmpeg-all.html
Ein Objekt der Klasse repräsentiert eine ffmpeg-Kommandozeile. Die Klasse verfügt einerseits über elementare (Objekt-)Methoden, um eine solche Kommandozeile sukzessive aus Eingabe- und Ausgabe-Dateien, Optionen, Filtern usw. zu konstruieren und andererseits höhere (Klassen-)Methoden, die eine vollständige Kommandozeile zur Erfüllung eines bestimmten Zwecks unter Rückgriff auf die elementaren Methoden erstellen. Die höheren Methoden Methoden befinden sich im Abschnitt "Klassenmethoden (vollständige Kommandozeilen)".
$cmd = $class->new;
Instantiiere ein FFmpeg-Kommando-Objekt und liefere eine Referenz auf dieses Objekt zurück.
$str = $cmd->command;
Liefere das Kommando als Zeichenkette.
$fil = $cmd->input($i);
Instantiiere Eingabe-Datei $i als Prty::File-Objekt und liefere dieses zurück. Das Objekt wird gecachted.
$str = $cmd->suffix;
Liefere den Suffix für eine Ausgabedatei. Der Suffix ist eine Zeichenkette der Form
NAME-WIDTH-HEIGHT-START-STOP
wobei Komponenten fehlen können, die nicht definiert sind.
$cmd->addOption($opt); $cmd->addOption($opt=>$val);
Ergänze die Kommandozeile um die Option $opt und (optional) den Wert $val. Die Methode liefert keinen Wert zurück.
Option ohne Wert:
$cmd->addOption('-y'); => -y
Option mit Wert:
$cmd->addOption(-i=>'video/GOPR1409.mp4'); => -i 'video/GOPR1409.mp4'
$cmd->addInput($input);
Ergänze das Kommando um Input $input, sofern $input einen Wert hat. Die Methode liefert keinen Wert zurück.
Dateiname:
$cmd->addInput('video/GOPR1409.mp4'); => -i 'video/GOPR1409.mp4'
Muster:
$cmd->addInput('img/*.jpg'); => -i 'img/*.jpg'
Undefiniert:
$cmd->addInput(undef); =>
$cmd->addFilter($opt,\@filter,$sep);
Ergänze das Kommando um Filter-Option $opt mit den Filtern @filter und dem Trenner $sep (Komma oder Semikolon).
Video Filter-Chain:
$cmd->addFilter(-vf=>['crop=1440:1080','scale=720*a:720']); => -vf 'crop=1440:1080,scale=720*a:720'
$cmd->addStartStop($start,$stop);
Ergänze das Kommando um Optionen, die den Zeitbereich auf den Bereich $start und $stop eingrenzen.
Nur Start-Zeitpunkt:
$cmd->addStartStop(5.5); => -ss 5.5
Nur Ende-Zeitpunkt:
$cmd->addStartStop(undef,20.5); => -t 20.5
Start- und Ende-Zeitpunkt:
$cmd->addStartStop(5.5,20.5); => -ss 5.5 -t 20.5
$cmd->addBitrate($bitrate);
Ergänze das Kommando um eine allgemeine Bitrate-Option mit Suffix 'k' (= kb/s). Ist die Bitrate 0, '' oder undef, wird die Option nicht hinzugefügt.
Bitrate von 10000k:
$cmd->addBitrate(10000); => -b 10000k
$cmd->addOutput($output);
Ergänze das Kommando um Output $output. Die Methode liefert keinen Wert zurück.
$cmd->addOutput('video/GOPR1409.mp4'); => 'video/GOPR1409.mp4'
$cmd->addOutput('img/%06d.jpg'); => 'img/%06d.jpg'
$cmd->addString($str);
Füge Zeichenkette $str am Ende der Kommandozeile hinzu, mit einem Leerzeichen als Trenner.
Kommando nach Objekt-Instantiierung:
$cmd->addString('ffprobe'); => ffprobe
$cmd->prependString($str);
Füge Zeichenkette $str am Beginn der Kommandozeile hinzu. Ein Leerzeichen wird automatisch hinzugefügt.
Kommando voranstellen:
$cmd->prependString('ffplay -autoexit'); => ffplay -autoexit ...
$str = $cmd->cropFilter($width,$height); $str = $cmd->cropFilter($width,$height,$xOffset,$yOffset);
Erzeuge eine Crop-Filter-Spezifikation für die angegebenen Argumente und liefere diese zurück.
Nur Breite und Höhe:
$cmd->cropFilter(1280,720); => 'crop=1280:720'
Breite, Höhe, X-Offset, Y-Offset:
$cmd->cropFilter(1280,720,240,0); => 'crop=1280:720:240:0'
$str = $cmd->scaleFilter($width,$height); $str = $cmd->scaleFilter("$width:$height");
Sind die Argumente undefiniert, wird eine leere Liste geliefert.
Breite und Höhe als getrennte Argumente:
$cmd->scaleFilter(1280,720); => 'scale=1280:720'
Breite und Höhe in einem Argument:
$cmd->scaleFilter('1280:720'); => 'scale=1280:720'
Undefiniertes Argument:
@filter = $cmd->scaleFilter(undef); => ()
$str = $cmd->fpsFilter($fps);
Erzeuge eine Fps-Filter-Spezifikation und liefere diese zurück. Ist das Argument undef, liefere eine leere Liste.
Argument:
$cmd->fpsFilter(24); => 'fps=24'
@filter = $cmd->fpsFilter(undef); => ()
$str = $cmd->framestepFilter($fps);
Erzeuge eine Framestep-Filter-Spezifikation und liefere diese zurück. Ist das Argument undef, liefere eine leere Liste.
$cmd->framestepFilter(4); => 'framestep=4'
@filter = $cmd->framestepFilter(undef); => ()
$cmd->outName($name); $name = $cmd->outName;
Setze oder liefere die Bezeichnung für die Ausgabe-Datei. Die Angabe wird für den Suffix der Ausgabe-Datei genutzt.
$cmd->outSize($width,$height); ($width,$height) = $cmd->outSize;
Setze oder liefere die Höhe und Breite der Video-Ausgabe. Die Angabe wird für den Suffix der Video-Ausgabe-Datei genutzt.
$cmd->outStart($s); $s = $cmd->outStart;
Setze oder liefere den Start-Zeitpunkt der Ausgabe. Die Angabe wird für den Suffix der Ausgabe-Datei genutzt.
$cmd->outStop($s); $s = $cmd->outStop;
Setze oder liefere den Stop-Zeitpunkt der Ausgabe. Die Angabe wird für den Suffix der Ausgabe-Datei genutzt.
$cmd = $class->imagesToVideo($pattern,$output,@opt);
Generiere ein ffmpeg-Kommando zum Zusammenfügen der Bilder $pattern zu Video $output und liefere dieses Kommando zurück.
Pfad-Muster der Bilder. Enthält das Pfad-Muster einen Stern (*), wird -pattern_type glob gewählt.
-pattern_type glob
Beispiele:
'img/%06d.jpg' => -i 'img/%06d.jpg' 'img/*.jpg' => -pattern_type glob -i 'img/*.jpg'
Name der generierten Video-Datei.
Erzeuge einen Audio-Stream aus Audio-Datei $file.
Beende die Ausgabe, wenn die Dauer $duration erreicht ist.
Anzahl Bilder pro Sekunde.
Wiederhole die Bildserie zyklisch.
Zeige das generierte Video im Player an, statt es in einer Datei zu speichern. Bei -play=>2 bleibt das Fenster des Players offen, bis es per Hand geschlossen wird.
Satz an vorgewählten Optionen, für Encoding-Zeit vs. Kompressionsrate. Mögliche Werte: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow. Siehe https://trac.ffmpeg.org/wiki/Encode/H.264.
Breite und Höhe des generierten Video. Ohne Angabe nimmt ffmpeg die Größe der Bilder.
Video-Bitrate in kbit/s.
Framerate des Video.
$cmd = $ffm->videoToImages($input,$dir,@opt);
Generiere ein ffmpeg-Kommando, das die Frames aus dem Video $input extrahiert und im Verzeichnis $dir speichert. Die Bilder haben das Format 'jpg'. Der Name der Dateien ist NNNNNN.jpg, von 1 an lückenlos aufsteigend.
Gewünschtes Seitenverhältnis der Bilder. Hat das Video ein abweichendes Seitenverhältnis, wird ein entsprechender Crop-Filter aufgesetzt.
Extrahiere jeden $n-ten Frame.
Pixel-Format des erzeugten Bildes. Laut Aussage im Netz ist yuvj422p das Standard-Pixel-Format für jpeg-Dateien. Wird das Pixel-Format hier nicht geändert, erzeugt ffmpeg die Bilder in Pixelformat yuvj420p, was Probleme beim Zusammenfügen mit Bildern einer Kamera zu einem Film macht.
Qualität der generierten jpg-Bilddateien. Wertebereich: 2-31, mit 2 als bester und 31 als schlechtester Qualität.
Zeitpunkt in Sekunden (ggf. mit Nachkommastellen) vom Beginn des Video, an dem das Extrahieren der Frames beginnt.
Zeitpunkt in Sekunden (ggf. mit Nachkommastellen) vom Beginn des Video, an dem das Extrahieren der Frames endet.
Ohne Optionen:
$ffm->videoToImages('video.mp4','img'); => ffmpeg -y -loglevel error -stats -i 'video.mp4' -qscale:v 2 'img/%06d.jpg'
Video-Seitenverhältnis 16:9 zu Bild-Seitenverhältnis 4:3 wandeln:
$ffm->videoToImages('video.mp4','img', -aspectRatio=>'4:3', ); => ffmpeg -y -loglevel error -stats -i 'video.mp4' -vf 'crop=ih/3*4:ih' -qscale:v 2 'img/%06d.jpg'
Alle Optionen:
$ffm->videoToImages('video.mp4','img', -aspectRatio=>'4:3', -framestep=>6, -start=>3, -stop=>10, ); => ffmpeg -y -loglevel error -stats -i 'video.mp4' -vf 'framestep=6,crop=ih/3*4:ih' -ss 3 -t 7 -qscale:v 2 'img/%06d.jpg'
$cmd = $class->extract($input,$output,@opt);
Extrahiere von Position $start bis Position $stop einen Teil aus der Audio- oder Video-Datei $input und schreibe ihn auf Datei $output.
Die Extraktion erfolgt ohne Transcoding, also ohne Qualitätsverlust.
Eingabe-Datei.
Ausgabe-Datei.
Füge dem Dateinamen die Bezeichnung $str hinzu.
Extrahiere den Ausschnitt nicht, sondern zeige ihn an. 1=Exit am Ende, 2=Fenster offen lassen (zu erneuten Positionen).
Start-Position in Sekunden (mit Millisekunden als Nachkommastellen).
Ende-Position in Sekunden (mit Millisekunden als Nachkommastellen).
$cmd = $class->extract169To43($input,$output,@opt);
Croppe 16:9-Video $input zum 4:3-Video $output. Die Crop-Operation schneidet links und rechts einen Teil des Video ab.
Ausgabe-Datei. Wenn undef, wird der Name der Ausgabedatei generiert.
Die Bitrate des generierten Video in kb/s.
Crop-Offset in x-Richtung. Per Default croppt der crop-Filter mittig.
$cmd = $class->videoInfo($input); $cmd = $class->videoInfo($input,$streamIndex);
Erzeuge eine ffprobe-Kommandozeile, die Information über den Video-Stream $streamIndex in Datei $input liefert. Ist kein Stream-Index angegeben, wird der erste Stream (Index 0) genommen.
Index des Video-Stream.
$cmd->execute;
Führe FFmpeg-Kommando $cmd aus. Als Ausgabe erscheint lediglich die Fortschrittsanzeige.
1.101
Frank Seitz, http://fseitz.de/
Copyright (C) 2016 Frank Seitz
This code is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
To install Prty, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Prty
CPAN shell
perl -MCPAN -e shell install Prty
For more information on module installation, please visit the detailed CPAN module installation guide.