# Videoumwandlung mittels ffmpeg



## aargau (24. November 2009)

Ich möchte für meine Webseite ein Videoupload ermöglichen. Nun bin ich leider schon stunden am testen mit FFMPEG und komme einfach nicht mehr weiter...
Ich hoffe jemand von euch hatt eine idee wie ich das hinkreige.

Das Uploaden eines Videofiles Funktioniert einwandfrei. Nun kommt allerdings das Problem, das umwandeln. 
Ich habe derzeit eine Testumgebung auf Windows Server 2003 basis. ffmpeg-php wäre installiert...

nun, da ich irgend wie mit dem ffmpeg-php nicht zurecht komme habe ich mir gedacht ich könnte das ganze per exec() lösen. Wenn ich da allerdings direkt dem Pfad eingebe geht das ganze nicht. Mittels Batch Datei habe ich es schon geschafft ein Video umzuwandeln. Da wüsste ich allerdings nicht wie ich das Video in die Datenbank eintrage. Zusätzlich habe ich das Problem das der User dann extrem lange warten muss.  Optimal wäre es wenn das ganze im hintergrund umgewandelt werden würde und der User eben eine Nachricht + Mail bekommt sobald das Video umgewandelt wird. Hierbei sind allerdings die Probleme:

- Video wird auf externem Server umgewandlet, also Datenbank Einträge nicht per CMD möglich.
- kA. Wie ich ein CMD Command in den Hintergrund schicke ohne das es beim User lädt. 

Alternativ wäre das der user sieht wie weit der Umwandlungsstatus ust. Bei einem Kostenpflichtigen Programm habe ich schon gesehen das dies geht. Wäre dies mittels ffmpeg + ecec auch möglich?

Wie sieht das ganze aus, wenn ich später ein Linux Server hätte?

Ein weiteres Problem das ich habe ist, dass das Video nicht Proportional dargestellt wird, wenn es nicht schon als 4:3 Hochgeladen wird. Giebt es eine möglichkeit die Grösse zu beschränken und trozdem die Proportionalität zu behalten?

Ich hoffe mir kann jemand helfen


----------



## chmee (24. November 2009)

zum ersten Problem : Du gibst die Aufgabe per AJAX ab, so, dass die Aufgabe vom Server angenommen wird und abgearbeitet. Das ist dann völlig unabhängig von der zu sehenden Seite und kann auch vom User nicht durch Abbrechen oder Schließen unterbrochen werden. Am Ende -also nach dem Transcoding- ist dann die eMail abzuwerfen, Erfolg oder nicht.

also zB URL mit GET-Data an Server versenden:
http://meinServer.DE/encode.php?file=maxmachtmusik.avi&sizex=320&sizey=240&DestFormat=mp4_small

Der Umwandlungsstatus könnte durch Betrachten der Filegröße gemacht werden. Dafür müssen wir wissen, wie groß die Enddatei etwa sein wird. Also, Encoder ist so eingestellt, dass pro Minute etwa 2MB verbraten werden. Aus der Originaldatei haben wir erfahren, dass die Datei etwa 4:30min lang ist, die Enddatei sollte also etwa eine Größe von 9MB haben. Die aktuell berechnete Temp-Datei ist im Moment 3,2MB groß, also sind etwa 35% fertig. Das Abfragen der Tempdatei ist nicht so einfach, dazu gehört im Moment noch APC und  php>v5.2. Da bitte genauer Hier nachschauen, denn Bilderuploads haben das gleiche Problem. 

Proportionen : Ist immer ein elendes Thema, man muss sich aber auf Etwas einigen. Grundsätzlich würde ich immer die längere Kante des Originals auf das Zielformat anpassen und den Rest mit Schwarz auffüllen.

Beispiel:

Originaldatei : 800x 450 (16:9)
Zielformat : 320x240
Skalierung also : 320/800 = auf 40%
vertikal nur 180px, welche dann auf 240px mit schwarz aufgefüllt werden.

Das geht in ffmpeg 

Links:
http://blog.rvi-media.de/php/ffmpeg-php/
http://youtubeclone.wordpress.com/2007/05/26/how-to-convertencode-files-to-flv-using-ffmpeg-php/

mfg chmee


----------



## aargau (16. Januar 2010)

Klingt gut, hatte jetzt leider wenig Zeit und auch keine möglichkeiten das ganze zu Testen, mir ist aber gerade noch ein kleines Problem aufgefallen. Ich möchte den Videoupload über seperate Server regeln, so das beim umwandeln nicht die ganze Seite schlechend langsam wird. Nun ist es aber ja so da wenn ich von http://www.server auf "video upload" klicke und dann auf video.server weitergeleitet werde die Session ja auf dem Video Server nicht gefunden wird... Nun weis ich nicht wie ich dies am schlausten löse, damit der User dann auch darauf Zugriff hat ohne sich erneut einzuloggen? 

Was mir spontan einfällt wäre per mysql abfrage aber wie genau das aussehen würde hab ich kein Plan ^^


----------



## aargau (22. Mai 2010)

Nach langer Zeit bin ich nun mal dazugekommen mich ein wenig mit der Videoupload Funktion zu beschäftigen. "Testweise" Funktioniert das Uploaden und umwandeln einwandfrei, heisst meine PHP Funktionen laufen. Momentan läuft das ganze im Testbereich über meinen Homeserver. Da auf diesem Windows Server Installierst ist habe ich einfach ein kleines batch geschrieben welche die umwandlung und eintragung in die Datenbank vornimmt. Anstelle einer Statusanzeige wie viel % die Umwandlung schon hat, habe ich mich entschieden einfach eine PM an den User zu senden wenn die Umwandlung fertig ist bzw. ein Fehler aufgetreten ist. 

Zwei kleine dinge habe ich allerdings noch nicht ganz im griff:

1. Verkleinerung
Ich weis zwar dank der ffmpeg-php extensions wie hoch bzw breit ein Video ist, aber spontan fällt mir nicht ein wie ich das Proportional auf die ausgangsgrösse kriege... 
heisst ich hätte vor ffmpeg via paramater gleich mitzuteilen wie gross das endvideo un sein soll, also nicht das es einen schwarzen rand hat oder so. 
heisst 1. schritt ist sicher: 

```
if($vid_width > $max_width)...
```
bzw. das selbe bei der breite. Nun fällt mir spontan einfach nicht ein wie ich danach Proportional werde, die maximale breite allerdings $max_width ist. (Sorry falls es einfach ist, ich bin tot müde ^^)

2. Serverlast:
Logischerzweise braucht das umwandeln extreme rechenpower. Folgegleich steht die CPU auf 100% last und das kann je nach länge des Videos schon mal einige Zeit in anspruch nehmen. Da auf dem Server allerdings noch andere Aufgaben ausgeführt werden sollen würde ich gerne ein Limit setzen, da ich nicht glaube das ich irgend wie sagen kann ffmpeg.exe darf max 50% von der CPU brauchen, denke ich das ich da unter Windows mit den Prioritäten arbeiten muss. Kann ich via batch irgend wie Automatisiert sagen ffmpeg hat niedrigste Priorität?
Und denkt ihr es ist sinnvoll es möglich zu machen mehrere Videos gleichzeitig umzuwandeln oder sollte ich da ev. eine Warteschlaufe Programmieren und immer nur ein Video abarbeiten, wenn es mal dazu kommen sollte das mehrere User ein Video gleichzeitig Fertig hochgeladen haben?


----------

