tab Bash-Skript für die FFmpeg-Konvertierung wird nicht wiederholt




ubuntu set title terminal window (2)

Ich habe dieses Bash-Skript für eine Batch-Konvertierung einiger mp4-Dateien:

#!/bin/bash
ls dr*.mp4 | grep -v -E "\.[^\.]+\." | sed "s/.mp4//g" | while read f 
do
    TARGET="$f.ffmpeg.mp4"
    if ! [ -f $TARGET ]
    then
        echo $TARGET
        ffmpeg  -nostdin -i $f.mp4 -s 320x180 -vc h264 -acodec copy -f mp4 -y $TARGET
    fi

    TARGET="$f.ffmpeg.flv"
    if ! [ -f $TARGET ]
    then
        echo $TARGET
        ffmpeg  -nostdin -i $f.mp4 -s 320x180 -acodec copy -y $TARGET
    fi

    TARGET="$f.jpg"
    if ! [ -f $TARGET ]
    then
        echo $TARGET
        ffmpeg -nostdin -i $f.ffmpeg.mp4 -ss 0 -vframes 1 -f image2 $TARGET
    fi

    TARGET="$f.ffmpeg.ogv"
    if ! [ -f $TARGET ]
    then
        echo $TARGET
        ffmpeg  -nostdin -i $f.mp4 -s 320x176 -ar 11025 -acodec libvorbis -y $TARGET
    fi
done 

Es wird einmal ausgeführt, konvertiert jedoch den Namen der Eingabedatei in 4 verschiedene Formate, führt jedoch keine Schleife zum nächsten Eingabedateinamen. Ich habe versucht, die Reihenfolge der verschiedenen Konvertierungen zu ändern, aber das Skript wird immer genau einmal für einen Dateinamen ausgeführt. Ich habe versucht, ffmpeg mit der -nostdin-Flagge auszuführen, aber es steht

"Unrecognized option 'nostdin'"

Die ffmpeg-Version ist ffmpeg Version 0.10.6-6: 0.10.6-0ubuntu0jon1 ~ lucid2 - Ich aktualisiere nur das ffmpeg-Paket von http://ppa.launchpad.net/jon-severinsson/ffmpeg/ubuntu und finde keine neuere Version . Das Basissystem ist

Distributor ID: Ubuntu 
Description:    Ubuntu 10.04.1 LTS 
Release:        10.04 
Codename:       lucid

Ich stieß auf das gleiche Problem mit einer while-Schleife und es war, weil ich die- -nostdin Flagge auf einem meiner ffmpeg-Befehle vermisste. Ich denke, weil read liest von Standard-Eingabe, dass mit einem ffmpeg-Befehl drin war einige der Daten zu essen. In meinem Fall war meine While-Schleife wie folgt:

find /tmp/dir -name '*-video' | while read -r file; do
    # note: I forgot -nostdin on the ffmpeg command
    ffmpeg -i "$file" -filter:v "amazing_filtergraph" out.mp4
done

Und ich würde einen Fehler über tmp/dir/1-video nicht gefunden bekommen (beachten Sie, dass der Anfangs-Schrägstrich im Pfad fehlte). Sobald ich -nostdin hinzugefügt -nostdin das Problem gelöst.

Beachten Sie auch, dass Sie in Ihrer while-Schleife fast immer das Flag -r möchten, da sonst unerwartete Zeilenumbrüche auftreten können.


Parsen Sie die Ausgabe von ls , Sie können stattdessen glob bing verwenden. Sie sollten auch Ihre Variablen angeben, um mögliche Leerzeichen in den Dateinamen zu berücksichtigen:

for input in dr*.mp4; do
    output=${input%.mp4}.ffmpeg.mp4
    [ -f "${output}" ] || ffmpeg -nostdin -i "${input}" -s 320x180 -vc h264 -acodec copy -f mp4 -y "${output}"

    output=${input%.mp4}.ffmpeg.flv
    [ -f "${output}" ] || ffmpeg -nostdin -i "${input}" -s 320x180 -acodec copy -y "${output}"

    [...]
done

Was den Fehler angeht, den Sie erhalten, wurde laut ChangeLog die Option -nostdin in ffmpeg 1.0 hinzugefügt, so dass Sie Ihre ffmpeg Installation von 0.1x auf 1.0.x aktualisieren müssen.





stdin