Ein ziemlich kranker Test von Flash-Video-Streaming
Inhaltsverzeichnis |
Ein paar Tests und Überlegungen zum Streamen in Form von Flash-Video (.flv)
Motivation
Es besteht die Anforderung zur FormulaStudent das Video-Streaming als Flash-Video durchzuführen.
Leider beschränken sich unsere Erfahrungen auf Windows-Media, da.
Das Encodieren in Flash-Video ist recht einfach, aber wie verteilt man das?
Encodieren
Encodieren kann man auf einfache Weise mit dem mencoder.
Die Kommandozeile für ein einfaches Encodieren:
mencoder eingabedatei.avi -cache 1024 -o ausgabeidatei.flv -ovc lavc -oac mp3lame \ -of lavf -lavcopts vcodec=flv:vmax_b_frames=0:vbitrate=500:turbo -vf pp=flb,scale=384:288 -srate 44100 \ -lameopts mode=3:cbr=64:aq=1 -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames
Das encodiert eingabedatei.avi zu ausgabedatei.flv in einer Auflösung von 384x288 mit 500kbit. Es wird ein einfacher Deinterlacer verwendet (linear blend) (kann bei halbem PAL eigentlich weggelassen werden). Als audio-codec wird Lame (mp3) verwendet. Die Abtastrate ist 44,1 kHz und es wird mit einer konstante Bitrate von 64kbit encodiert. "mode=3" bedeutet Mono-Betrieb.
Alles nachzulesen in der Manpage vom mencoder
Verteilen
Meines Wissens nach beziehen die einbettbaren Flashplayer ihre Daten per http://.
Daher wird auch hier http:// zum Verteilen zum Einsatz kommen.
Wie das im Detail geschehen wird muss noch evaluiert werden.
Erste Tests
Das Live-Video
Also Live-Quelle kommt beim test ein Stream (ebenfalls http://) von meinem VDR zum Einsatz. Dieser wird mit dem mencoder in eine fifo encodiert.
Das Encoding
Als erstes muss eine fifo erstellt werden:
mkfifo /tmp/stream.flv
Dann wird der mencoder gestartet
mencoder http://vdr.greussen.eller-net.de/stream/11 -cache 1024 -o /tmp/stream.flv -ovc lavc -oac mp3lame \ -of lavf -lavcopts vcodec=flv:vmax_b_frames=0:vbitrate=500:turbo -aspect 16:9 -vf pp=flb,scale=384:288 \ -srate 44100 -lameopts mode=3:cbr=64:aq=1 -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames
Das ganze dauert ein paar Sekunden, da er selbst ersteinmal den stream vom VDR holen und cachen muss.
Ein kleiner http-Server
Wir wollen im Player die Daten ja per http abrufen. Also bauen wir uns einen kleinen httpd mittels netcat und einem shell-script
echo "HTTP/1.1 200 OK" echo "Connection: close" echo "Content-Type: video/flash" echo cat /tmp/stream.flv
Aufgerufen wird das dann folgendermaßen
/tmp/httpd | nc6 -l -p 8080
Auf meiner kleinen Testwebseite steht dann
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="en"><head><title>stream-test</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head><body> <p id="player1"></p> <script type="text/javascript" src="flash-Dateien/ufo.js"></script> <script type="text/javascript"> var FO = { movie:"http://rezitator.de/i/flvplayer/flvplayer.swf", width:"384", height:"288", majorversion:"8", build:"0", bgcolor:"#FFFFFF", flashvars:"file=http://localhost:8080/stream.flv&showdigits=false&showicons=true&volume=80&autostart=true"}; UFO.create( FO, "player1"); </script> </script> </body></html>
Das ist eine kleine Seite mit einem eingebetteten Player, der seinerseits seine Daten von http://localhost:8080/stream.flv holt. Dem kleinen test-script ist der Dateiname dabei egal ;-)
Starten und Testen
- mencoder starten
- httpd starten
- webseite im browser aufrufen
Todo
- Wie kann man das ordentlich verteilen
- evtl apache mit mod-proxy
- wie kommen die Daten zum Verteilserver
- Robustheit gegen Verbindungsabbrüche
Probleme
Der player spielt nicht, wenn man "mittendrin" einsteigt. evtl muss man am encoding etwas ändern oder sogar etwas einfügen (header oder ähnliches).