Siduction Forum
Siduction Forum => Scripting & Kernelhacking => Topic started by: pit on 2014/06/15, 21:38:23
-
Ich habe hier einen etwas länglichen Einzeiler, der beim Direktaufruf wunderbar funktioniert (das war eine ziemliche Tüftelei ...). Er wandelt beliebige Videodateien in mp4-Dateien um, die von halbwegs zeitgemäßen Browsern problemlos abgespielt werden können. Sie werden dabei auch auf eine Breite von 640 Pixeln skaliert (Höhe wird dynamisch errechnet). Video- und Audiobitraten sind definiert (variabel).
Wie schreibe ich den in die .bashrc ? Ziel wäre ein Aufruf wie
h264 filename
avconv -i 01.mp4 -vf scale=640:-1 -pass 1 -threads auto -c:v libx264 -b:v 800k -r 29.970 -fastfirstpass 1 -preset veryfast -vprofile main -tune fastdecode -level 30 -f mp4 -an /dev/null && avconv -y -i 01.mp4 -vf scale=640:-1 -pass 2 -threads auto -c:v libx264 -b:v 800k -r 29.970 -preset veryfast -vprofile main -tune fastdecode -level 30 -c:a aac -strict experimental -ac 1 -b:a 96k 02.mp4
Probiert habe ich z.B.:
alias 'h264'='avconv -i "$1" -vf scale=640:-1 -pass 1 -threads auto -c:v libx264 -b:v 800k -r 29.970 -fastfirstpass 1 -preset veryfast -vprofile main -tune fastdecode -level 30 -f mp4 -an /dev/null && avconv -y -i 01.mp4 -vf scale=640:-1 -pass 2 -threads auto -c:v libx264 -b:v 800k -r 29.970 -preset veryfast -vprofile main -tune fastdecode -level 30 -c:a aac -strict experimental -ac 1 -b:a 96k ${1%%.*}.mp4'
Wirft mir auf der Konsole dann aber das hier aus:
: No such file or directory
Wie mach ich das?
-
Im alias hast Du das erste Auftreten von 01.mp4 durch $1 ersetzt, im zweiten Teil nach && aber nicht?
Ansonsten falls in dem Einzeiler zuviele Sonderzeichen o.ä. für alias sind, wäre es vielleicht einfacher den in ein einfaches ausführbares Script zu packen und ein alias für die Ausführung des Scripts zu setzen (was nicht nötig wäre wenn das script im Suchpfad ist).
---
PS (OT) netter Avatar ;)
-
@der_bud: Eine gewisse Ähnlichkeit ist vorhanden ;-)
Der Eintrag in der .bashrc funktioniert nun. Für's Protokoll:
h264 () { avconv -y -i "$1" -vf scale=w=640:h=-1 -pass 1 -threads auto -c:v libx264 -b:v 800k -r 29.970 -fastfirstpass 1 -preset veryfast -vprofile main -tune fastdecode -level 30 -f mp4 -an /dev/null && avconv -y -i "$1" -vf scale=w=640:h=-1 -pass 2 -threads auto -c:v libx264 -b:v 800k -r 29.970 -preset veryfast -vprofile main -tune fastdecode -level 30 -c:a aac -strict experimental -ac 1 -b:a 96k "${1%%.*}-blog.mp4"; }
Jetzt stehen noch ein paar Browser-Tests an und wenn keiner muckt habe ich endlich mal eine Routine, die mir ziemlich viel Ärger erspart.
-
Sehr cooler einzeiler, sowas suche ich schon lange.
ich bin leider beim scripten nicht gut.
Was muss ich ändern, um zum Beispiel alle Videos eines Verzechnis auf einem Rutsch neuzukodieren?
Hintergrund: Habe immer viele *mov Dateien meiner DSLR, die ich auf einem Rutsch in mp4 kodieren möchte.
Danke!
-
Was muss ich ändern, um zum Beispiel alle Videos eines Verzechnis auf einem Rutsch neuzukodieren?
Ich bin in Sachen Scripting auch eher einer, der so lange probiert, bis es klappt. Mir fehlt da methodisches Wissen. Es sieht so aus, als könne man in die .bashrc nicht eins zu eins Befehlszeilen übernehmen, die via Direktaufruf in der Bash noch funktionieren. Letzteres würde für deine Bedürfnisse wie folgt lauten (Direktaufruf):
for i in *.{avi,flv};do avconv -i "$i" -vf scale=640:-1 -pass 1 -threads auto -c:v libx264 -b:v 800k -r 29.970 -fastfirstpass 1 -preset veryfast -vprofile main -tune fastdecode -level 30 -f mp4 -an /dev/null -y && avconv -y -i "$i" -vf scale=640:-1 -pass 2 -threads auto -c:v libx264 -b:v 800k -r 29.970 -preset veryfast -vprofile main -tune fastdecode -level 30 -c:a aac -strict experimental -ac 1 -b:a 96k "${i%%.*}"-blog.mp4;done
Ob du ein Suffix wie in meinem Beispiel "-blog" in den Zieldateien brauchst, musst du selbst entscheiden. Ich konvertiere mitunter auch mp4-Originale und stelle so sicher, dass Originale nicht überschrieben werden (es würde allerdings eine Abfrage kommen) und eine klare Unterscheidbarkeit gegeben ist. Eleganter wäre es vermutlich, gleich in ein neues Zielverzeichnis konvertieren zu lassen.
Die Liste der Dateierweiterungen in den geschweiften Klammern (in meinem Beispiel avi + flv) lässt sich natürlich beliebig erweitern. Der Aufruf berücksichtigt alle entsprechenden Dateien im *aktuellen* Verzeichnis.
@alle: Wie schreibt man so etwas (Schleife) in die .bashrc oder in ein Script?
-
dazu gibt es unter der dash/bash das $@ (alle übergebene arumente)
for i in "$@"; do
echo $i
done
Damit tut auch dann sowas wie * für alle dateien im Verzeichnis, weil die ersetztung des * vor der Ausführung passiert:) Was natürlich für so ein einzeiler sicher das richtige ist.
-
Noch eine Ergänzung: Damit die auf oben beschriebene Art konvertierten Videos im Web auch ganz fix starten, ist ein weiterer Schritt erforderlich:
qt-faststart in.mp4 out.mp4
Hintergrund (Zitat aus man avconv):
Normally, a MOV/MP4 file has all the metadata about all packets stored in one location (written at the end of the file, it can be moved to the start for better playback using the qt-faststart tool).