Welcome, Guest. Please login or register.
Did you miss your activation email?

Author Topic: [DE] Eintrag in der .bashrc => mp4 (h264 / aac)  (Read 7897 times)

Offline pit

  • User
  • Posts: 237
[DE] Eintrag in der .bashrc => mp4 (h264 / aac)
« 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?
« Last Edit: 2014/06/15, 23:12:29 by pit »

Offline der_bud

  • User
  • Posts: 1.072
  • member
Re: Eintrag in der .bashrc => mp4 (h264 / aac)
« Reply #1 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  ;)
Du lachst? Wieso lachst du? Das ist doch oft so, Leute lachen erst und dann sind sie tot.

Offline pit

  • User
  • Posts: 237
Re: Eintrag in der .bashrc => mp4 (h264 / aac)
« Reply #2 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.
« Last Edit: 2014/06/15, 23:31:38 by pit »

Offline Lanzi

  • User
  • Posts: 1.777
Re: Eintrag in der .bashrc => mp4 (h264 / aac)
« Reply #3 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!


Offline pit

  • User
  • Posts: 237
Re: Eintrag in der .bashrc => mp4 (h264 / aac)
« Reply #4 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?

hefee

  • Guest
Re: Eintrag in der .bashrc => mp4 (h264 / aac)
« Reply #5 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.

Offline pit

  • User
  • Posts: 237
Re: Eintrag in der .bashrc => mp4 (h264 / aac)
« Reply #6 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).