Video encoding anstossen

lockdoc

Well-Known Member
Hi,

ueber Samba habe ich eine Freigabe encoding und dort gibt es
Code:
encoding/input
encoding/output

Ich schmeisse beispielsweise Videos in input rein und encode diese dann mit einem script nach output.

Nun sollen das auch andere Mitbewohner komfortable nutzen koennen, ohne auf der shell rumzutippen.

Was koennte ich da bauen, damit man das komfortable anstupsen kann?

Meine erste Idee war anstelle der Input Freigabe ein Ajax web Uploader, der das in Input haut und alles macht. Gibts da evtl. noch was anderes wie "Triggers" die ich in Samba reinbekomme?
 
Vor ca. zehn Jahren, als PDFs auf dem Desktop praktisch nur mit Adobes Acrobat produziert werden konnten, hatten wir in der Firma, in der ich arbeitete, einen Fileserver, der Office-Dokumente in PDFs verwandelte. Das Verfahren war praktisch genauso, wie Du es für Dein Video-Encoding beschreibst.

Als einfache Lösung diente hier meines Wissens nach ein Cron-Job, der den Eingangsordner jede Minute (oder alle paar Minuten?) auf eine neue Office-Datei überprüfte und diese dann umwandelte.

Ist zwar nicht so elegant wie ein Daemon, der den Ordner überwacht und wirklich bei Bedarf tätig wird, aber es ist sehr leicht zu implementieren. Und die Minute, die man maximal auf den Beginn des Encodens warten muss, ist vermutlich nicht so schlimm...
 
Zuletzt bearbeitet:
Das einfachste wäre ein Cronjob der das Verzeichniss absucht. Unter *BSD gibt es kein inotify. Vllt. kannst du mit gamin dir was besseres bauen.
 
Das Problem mit dem Cronjob sehe ich darin, dass wenn ich die Datei grade rueberkopiere und dann der Cron den ffmpeg anschmeisst, dann bearbeitet der ja eine noch nicht vollstaendige Videodatei.
 
Die hässliche lösung wäre lsof. Wenn Samba die Datei geschrieben hat wird es sie wohl zu machen. Ein Webfrontend wäre da sauberer und auch D.A.U. tauglich.
 
hi

es gab mal die moeglichkeit samba so zu konfigurieren das es ein script selber
ausfuehrt wenn in eine freigabei was reinkopiert wird.


holger
 
So hab das mal soweit mit mit nem ajax uploader und nem anschliessendem script aufruf gemacht.
Jetzt kommt noch die youtube-dl mit rein, dass man sich auch gleich playlisten laden und und direkt konvertieren lassen kann. xDDD
 
So hab das heute mal zusammengebaut:

Man kann jetzt Videos via multiform ajax uploader hochladen, oder einfach auf die Samba Share packen. Das encoden wird via webinterface angestossen und man kann sich da auch die ganzen outputs ansehen.

Zusaetzlich kann man links von Videos und links von Playlists (beispiel youtube) ins webinterface eintragen und dann holt sich youtube-dl alles im Hintergrund.
Auch hier kann man sich im webinterface den status ansehen.

Hier mal ein paar fotos:



















Hapert noch an ein paar Ecken, aber sonst laeuft es.

Software
+ apache
+ php
+ samba
+ ffmpeg
+ mplayer
+ /bin/sh
+ youtube-dl

Wer bock hat das noch was dran zu machen kann sich gerne melden.
 
Hi,

mal eine blöde Frage, warum nicht einfach für die Wiedergabe etwas verwenden wo mit dem Ursprungsformat einfach problemlos zu Recht kommt und sich die neu Kodierung einfach schenken ? - der VLC Bär z.B. gibt eigentlich so ziemlich alles wieder. Was steckt da für ein Sinn dahinter das krampfhaft umkodieren zu wollen ?

Gruß Bummibär
 
@oneone:
post ich dann heut abend

@Bummibaer:
Nicht alle Geraete koennen alles abspielen.
So kann ich beispielsweise Videos automatisch fuer den iPod oder ein anderes MP4 Geraet umkodieren.
Evtl. will man da auch die 4-fach Full HD Filme ein wenig verkleinern, damit nicht nur 1 Video platz hat.

Manche User wollen auch einfach spezielle Formate fuer ihren iTunes haben... etc

Aber an sich bin ich mit der momentanigen Loesung ganz gluecklich.
So kann ich mir jetzt ueber nacht die neuesten Mathevorlesungen runterladen und konvertieren lassen und pack das fruehs auf den mp4 player und kann mir das in der bahn ankucken. xD
 
@oneone:
Hier ist das script zum encoden

encode.sh
Code:
#!/bin/sh

IN_DIR=uploads/
OUT_DIR=output/

ARGS=" -y \
-threads 2 \
-acodec libmp3lame \
-ab 128k \
-vcodec libx264 \
-level 41 \
-crf 20 \
-bufsize 20000k \
-maxrate 25000k \
-g 250 \
-r 20 \
-coder 1 \
-flags +loop \
-cmp +chroma \
-partitions +parti4x4+partp8x8+partb8x8 \
-flags2 +dct8x8+bpyramid \
-me_method umh \
-subq 7 \
-me_range 16 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -rc_eq 'blurCplx^(1-qComp)' \
-bf 16 \
-b_strategy 1 \
-bidir_refine 1 -refs 6 -deblockalpha 0 -deblockbeta 0"

whereami=`dirname $0`
IN_DIR="$whereami/../$IN_DIR"
OUT_DIR="$whereami/../$OUT_DIR"

SESS_FILE="$whereami/encode.session"
touch $SESS_FILE

err="$whereami/encode.err"
log="$whereami/encode.log"

total=`ls -1 $IN_DIR | wc -l`
total=`/bin/expr ${total}` # cast to integer to avoid white spaces in front of number
count=0;

echo "___start  encoding___"
echo ""

for file in $IN_DIR*
do
 f=`basename "$file"`
 count=`/bin/expr $count + 1`

 echo "($count/$total) $f -> $f.mp4"
 `ffmpeg -i "$file" $ARGS $OUT_DIR"$f"".mp4" >$err 2>$log`
 rm "$file"
done

echo ""
echo "___finished___"
rm $SESS_FILE

Ich muss das aber noch anpassen, das ueber die args verschiedene encodings auswaehlen kann.
 
hi

mein tip zum encoden -> Handbrake(Cli)
es verwendet auch u.a. die ffmpeg engine ist aber deutlich einfacher zu handhaben,
bezueglich optionen.

holger
 
Code:
> make
===>  handbrake-0.9.3 is only for i386, while you are running amd64.
*** Error code 1
schade

das kann nicht sein ... ich selber nutze das u.a.

Code:
Linux lindenberg 2.6.32-5-amd64 #1 SMP Mon Oct 3 03:59:20 UTC 2011 x86_64 GNU/Linux


holger

p.s. sorry ist linux da das vdr projekt dort laeuft.
 
Also ich hab mir mal handbrake testweise auf windows installiert.
An sich will ich das auf dem server encoden lassen, da der einfach mehr power hat.
Da ich aber die handbrake profile sehr gut finde, wuerde ich diese gerne uebernehmen fuers encoden.
Nun zur frage:

Ich kann mir ja bei handbrake den query anzeigen lassen, der ist allerdings nur fuer handbrake selbst.
Wie kann ich den jetzt fuer ffmpeg oder x264 rauskriegen?
 
Ich wollte das encoding nochmal umkrempeln und das so exakt wie moeglich machen...

Code:
# 01 extract video to yuv (raw) [and resize/scale if desired]
user> mplayer -nosound -benchmark -sws 9 -vo yuv4mpeg:file=video.yuv <infile>

#  02 encode (3 passes!) set bitrate fps and res
user> x264 --demuxer y4m --preset placebo --profile high --level 4.1 --bitrate %s --fps %s --input-res %s --stats h264.stats.tmp --slow-firstpass --pass 1 --output video.h264 video.yuv
user> x264 --demuxer y4m --preset placebo --profile high --level 4.1 --bitrate %s --fps %s --input-res %s --stats h264.stats.tmp --slow-firstpass --pass 2 --output video.h264 video.yuv
user> x264 --demuxer y4m --preset placebo --profile high --level 4.1 --bitrate %s --fps %s --input-res %s --stats h264.stats.tmp --slow-firstpass --pass 3 --output video.h264 video.yuv

#  03 extract audio to wav 
user> mplayer -nocorrect-pts -vo null -vc null -ao pcm:fast:file=audio.wav <infile>

# 04 encode audio
user> faac audio.aac audio.wav 

# 05 merge (video framerate from original file)
user> mp4box -fps %s -add video.264 -add audio.aac output.mp4

Leider ist jetzt das Problem, dass ich bei manchen Playern nicht seeken kann. Hat da jemand noch ein tipp fuer die x264 Option, damit das seekable wird
 
So ich habe mal ein wenig weiter an dem Video encoding geschraubt und es nimmt langsam Form an.
Habe jetzt huebsche Echtzeit tail log anzeigen und auch die Mediainfo ist verbessert.
Das Layout ist erstmal recht spartanisch, da ich nicht so der HTML/CSS Experte bin







Ich muss jetzt nur noch wirllich effiziente Commands im Sinne von bester Qualitaet und kleinster Groesse finden... Encoding time spielt da keine so grosse Rolle erstmal.

Die Grundsatzfrage hier:
Ist es besser das zu encodene Video vorher als yuv (raw) video zu exportieren und dann komplett neuzubauen oder ist das overkill und direkt den ffmpeg drueber laufen zu lassen ist da besser?
 
Ich sehe in dem Zwischenschritt kein Sinn. Das Video kann ja nicht besser als sein Ausgangsmaterial werden.
 
Zurück
Oben