Ein ziemlich kranker Test von Flash-Video-Streaming

Aus FeM Streaming Wiki
Wechseln zu: Navigation, Suche

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