Siduction Forum

Siduction Forum => Scripting & Kernelhacking => Topic started by: pit on 2014/06/15, 21:38:23

Title: Eintrag in der .bashrc => mp4 (h264 / aac)
Post 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

Code: [Select]
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.:

Code: [Select]
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:

Code: [Select]
: No such file or directory
Wie mach ich das?
Title: Re: Eintrag in der .bashrc => mp4 (h264 / aac)
Post by: der_bud on 2014/06/15, 22:55:09
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  ;)
Title: Re: Eintrag in der .bashrc => mp4 (h264 / aac)
Post by: pit on 2014/06/15, 23:11:17
@der_bud: Eine gewisse Ähnlichkeit ist vorhanden ;-)

Der Eintrag in der .bashrc funktioniert nun. Für's Protokoll:

Code: [Select]
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.
Title: Re: Eintrag in der .bashrc => mp4 (h264 / aac)
Post by: Lanzi on 2014/06/18, 11:40:06
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!

Title: Re: Eintrag in der .bashrc => mp4 (h264 / aac)
Post by: pit on 2014/06/21, 10:43:11
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):


Code: [Select]
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?
Title: Re: Eintrag in der .bashrc => mp4 (h264 / aac)
Post by: hefee on 2014/06/22, 22:30:52
dazu gibt es unter der dash/bash das $@ (alle übergebene arumente)
Code: [Select]
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.
Title: Re: Eintrag in der .bashrc => mp4 (h264 / aac)
Post by: pit on 2014/08/17, 13:12:19
Noch eine Ergänzung: Damit die auf oben beschriebene Art konvertierten Videos im Web auch ganz fix starten, ist ein weiterer Schritt erforderlich:

Code: [Select]
qt-faststart in.mp4 out.mp4
Hintergrund (Zitat aus man avconv):

Quote
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).