ffmpeg-Problem im pic2mpg-Script des 'pictures'-Plugins

  • Auf meinem bisherigen System mit einer etwas älteren ffmpeg-Version

    funktionierte die Konvertierung von Bildern im JPEG-Format nach *.mpg einwandfrei.

    Auf meinem neu aufgesetzten System befindet sich nun ffmpeg 3.3.4

    und die bringt Fehlermeldungen:

    In /usr/share/ffmpeg gibt es nur


    /usr/share/ffmpeg/libvpx-1080p50_60.ffpreset
    /usr/share/ffmpeg/libvpx-720p50_60.ffpreset
    /usr/share/ffmpeg/libvpx-720p.ffpreset
    /usr/share/ffmpeg/libvpx-360p.ffpreset
    /usr/share/ffmpeg/libvpx-1080p.ffpreset


    und wenn ich von meinem alten System das

    auf das neue System kopiere, dann bekomme ich

    Kann mir da vielleicht jemand weiterhelfen?

    Das verwendete Script ist bei der VDR-Source dabei in PLUGINS/src/pictures/pic2mpg.

    Es sollen damit aus JPEG-Bildern MPG-Frames generiert werden, die VDR dann als Still-Frames anzeigen kann.

    Klaus

  • Wenn ich das richtig sehe ist der Aufruf:


    Code
    ffmpeg -f image2pipe -vcodec ppm -i pipe:0 -an -vcodec libx264 -vpre baseline -s $Size -qscale 2 -f mpegts -y $Mpeg

    Das neue ffmpeg mag davon einiges nicht mehr:

    -vcodec ist jetzt -c:v

    -qscale ist -qscale:v


    -vpre baseline lädt das custom preset "baseline" ist das so gewollt?

    Für das "Standard x264" baseline preset wählen:

    -preset baseline


    Ob das -s so noch funktioniert kann ich nicht sagen. Vermutlich willst du resizing benutzen?

    => https://trac.ffmpeg.org/wiki/S…resizing)%20with%20ffmpeg

    -vf scale=$size

    Aber ich vermute, dann müsste $size=1920:1080 sein statt 1920x1080


    => Was gibt das aus?:

    Code
    ffmpeg -f image2pipe -i - -c:v libx264 -preset baseline -vf scale=$Size -q:v 2 -pix_fmt yuv420p -f mpegts -y $Mpeg


    LG,

    Johannes

  • Wenn ich den ffmpeg-Aufruf wie von dir angegeben ändere erhalte ich

    Das letztlich ausgeführte Kommando ist bei "==>" zu sehen.

    Wobei ich bereits "-probesize 10M" hinzugefügt habe, wie mir 3PO in einer Email empfohlen hat, was aber auch nichts geändert hat.


    Klaus

  • ffmpeg erkennt das Format nicht, das du übergibst. "-probesize 10M" bedeutet, dass er die ersten 10MB einliest um zu versuchen da das Format draus zu bestimmen. Bringt dir in dem Fall also eher nichts. Funktioniert es denn, wenn du es einzeln, also ohne Pipe machst? Eigentlich sagt ihm "-f image2pipe" ja, dass ein Bild kommt. Man kann ihm den codec evtl mitgeben:


    ffmpeg -f image2pipe -c:v ppm -i - -c:v libx264 -preset baseline -vf scale=1920x1080 -q:v 2 -pix_fmt yuv420p -f mpegts -y x.mpg


    [edit]

    Ich sehe gerade, dass in deinem Ursprünglichen command das dabei war. Hatte ich wohl vergessen zu übernehmen ...


    Benutzt du ppm aus einem bestimmten Grund, oder kannst du es auch einfach mal mit jpeg, png o.ä. probieren?


    Das -vf scale=1920x1080 brauchst du eigentlich nicht, wenn du vorher schon per convert die richtige Größe erstellst. Eigentlich brauchst du das convert nicht, wenn ich so drüber nachdenke. Ich glaube das geht auch alles direkt in ffmpeg.

  • Damit ergibt sich:

    Das mit dem 'convert' habe ich damals nur gemacht, um das Bild bei Bedarf drehen und skalieren zu können, und den Hintergrund schwarz zu füllen, falls es kein 16:9-Format ist. Warum ppm weiß ich nicht mehr, das habe ich vermutlich auch einfach irgendwo abgeschrieben ;-). Ich hätte natürlich nichts dagegen, alles gleich in ffmpeg zu machen, wenn das geht.


    Vielleicht magst du ja mal mein ganzes Script einfach ignorieren und ganz unvoreingenommen einen ffmpeg-Aufruf basteln, der folgendes leistet:


    - Ausgangs-Bild ist *.jpg.

    - Das Bild muss um 90, 180 oder 270 Grad gedreht werden, wenn nötig (die Erkennung erfolgt vorher).

    - Das Bild muss auf 1920x1080 Pixel skaliert werden, falls es größer ist.

    - Falls nach dem Skalieren ein Rand frei bleibt, soll er mit einer vorgegebenen Farbe (typ. schwarz) gefüllt werden.

    - Ergebnis soll ein MPEG-TS sein (h.264), der sich mit VDR als Standbild wiedergeben lässt.


    Klaus

  • Ein einzelnes *.jpg, das als Standbild ausgegeben wird? Oder kommen da mehrere Bilder?


    Code
    ffmpeg -i $in  -vf "$rotate scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2"  -c:v libx264 -pix_fmt yuv420p -f mpegts -y $out


    Die Ausgabe von einem Frame kann mein VLC allerdings nicht wiedergeben, ich weiß nicht ob der VDR das macht (habe hier nur headless). Workaround: Bild wiederholen für eine Sekunde (geht vermutlich auch weniger, encodieren dauert sonst etwas?):


    Code
    ffmpeg -loop 1 -i $in -vf "$rotate scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2"  -c:v libx264 -pix_fmt yuv420p -t 1 -f mpegts -y $out


    Das mit dem drehen ist etwas unschön gelöst:

    rotate = "" #nicht drehen

    rotate = "transpose=clock," # 90° nach rechts

    rotate = "transpose=cclock," # 90° nach links

    rotate = "hflip,vflip," # horizontal und vertikal flippen = 180°


    Die "neue" Methode ist, die Drehung als Metadaten mitzugeben. Das Video wird also nicht "physisch" gedreht, sondern der Player muss das umsetzen. kA ob das auch eine Lösung wäre (ginge mit: -metadata:s:v rotate="90")


    Zum Füllen mit einer anderen Farbe, einfach hinter das Pad Kommando schreiben:

    Code
    pad=1920:1080:(ow-iw)/2:(oh-ih)/2:#FFFFFF@1"

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!