DV-Cam per Firewire und ffmpeg / ffserver als FLV mit h.264 (x264) streamen

Hier ist eine Anleitung wie man eine DV-Kamera per Firewire, dvgrab, ffmpeg, ffserver und dem JWPlayer ins Netz streamen kann.

Kompiliere dir auf deinem lokalen Rechner die neueste Version von ffmpeg mit x264. Hier bekommst du ffmpeg. Wie du libx264 Support bekommst, steht (unter Anderem) hier.

Als nächstes solltest du einen Webserver zur Verfügung haben, der genug Kapazitäten (Rechenleistung/RAM/Bandbreite) hat, um dort deinen Streamingserver aufzusetzen. Dafür muss auch dort ffmpeg kompiliert werden. Bei mir gab es irgendeinen Bug, deswegen musste ich eine bestimmte Revision nutzen. Am besten du versuchst es als erstes mal mit der aktuellen Version und wenn es dort komische Fehler gibt, dann nutze die Revision 25337. Auf dem Server (bei mir Debian 5.0) also folgendes ausführen:

svn checkout -r 25337 svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg
cd ffmpeg
./configure --prefix=/usr --enable-avfilter --enable-bzlib --enable-libgsm --enable-libspeex --enable-pthreads --enable-zlib --disable-stripping --enable-runtime-cpudetect --enable-postproc --enable-swscale --enable-libdc1394 --disable-shared --enable-static --enable-nonfree --enable-libfaac --enable-libx264

Als nächstes musst du eine Konfigurationsdatei für ffserver anlegen. Diese gibt an, wie der Server erreicht werden kann und welche Streams mit welchen Eigenschaften angeboten werden.

Inhalt meiner sample.conf

# Port on which the server is listening. You must select a different
# port from your standard HTTP web server if it is running on the same
# computer.
Port 8090

# Address on which the server is bound. Only useful if you have
# several network interfaces.
BindAddress 12.34.56.789

MaxHTTPConnections 200

MaxClients 100

MaxBandwidth 10000

# Access log file (uses standard Apache log file format)
# '-' is the standard output.
CustomLog -

# Suppress that if you want to launch ffserver as a daemon.
NoDaemon

<Feed feed1.ffm>

# You must use 'ffmpeg' to send a live feed to ffserver. In this
# example, you can type:
#
# ffmpeg http://localhost:8090/feed1.ffm

File /tmp/feed1.ffm
FileMaxSize 200K
</Feed>

<Stream stream.flv>
Feed feed1.ffm
Format flv
VideoCodec libx264
AVPresetVideo default
AVPresetVideo baseline
VideoSize 512x288
VideoFrameRate 12
VideoGopSize 12
VideoBitRate 200
VideoBufferSize 40
AudioBitRate 32
AudioCodec libfaac
AudioSampleRate 22050
AVOptionVideo flags +global_header
AVOptionAudio flags +global_header
</Stream>

# Server status

<Stream stat.html>
Format status

# Only allow local people to get the status
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255

</Stream>

<Redirect index.html>
URL http://www.ffmpeg.org/
</Redirect>

Dann kann der Server mit

ffserver -f sample.conf

gestartet werden.

Jetzt solltest du auf deinem lokalen Rechner mit per Firewire angeschlossener DV-Kamera folgendes starten können. Achte darauf, dass du Zugriff auf /dev/raw1394 hast.

dvgrab - | ffmpeg -i - http://12.34.56.789:8090/feed1.ffm

Jetzt sollte dein ffmpeg/ffserver anfangen zu streamen. Du kannst dir den Status des ffservers unter

http://12.34.56.789:8090/stat.html

ansehen.

Jetzt brauchst du einen Player. Ich benutze den JWPlayer von hier. Downloaden, auf den Server ziehen, entpacken und verfügbar machen. Hier eine Beispiel HTML-Seite, die zu den ffserver Einstellungen von oben passt:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
  <head>
    <title>My Player</title>
      <script type="text/javascript" src="/jwplayer/jwplayer.js"></script>
  </head>
  <body>
        <video
        src="http://12.34.56.789:8090/stream1.flv"
        height="288"
        poster="stream1.jpg"
        id="container"
        width="512">
        </video>
        <script type="text/javascript">
          jwplayer("container").setup({
            autostart: false,
            height: 288,
            width: 512,
            image: 'http://12.34.56.789/stream1.jpg',
            players: [
          { type: "html5" },
              { type: "flash", src: "/jwplayer/player.swf" }
            ],
            streamer:'http://12.34.56.789:8090/stream1.flv'
          });
        </script>
  </body>
</html>

Jetzt solltest du diese HTML per Browser aufrufen und nach einem Klick deinen Stream sehen.

Anhang: Hier habe ich versucht ein Live-Bild zu streamen und gleichzeitig auf eine Festplatte aufzunehmen. Keine Garantie für Funktion, ist hier nur vollständigkeitshalber! :)

dvgrab - | ffmpeg -threads 4 -i - -f mpeg -r 25 -b 32000000 -s 1024x576 -acodec mp2 -ab 320000 -ar 44100 pipe: -newvideo -y -f mpeg -r 25 -b 32000000 -s 1024x576 -acodec mp2 -ab 320000 -ar 44100 /media/600c4d7c-f3b6-4a1c-abc2-181a70dfc16f/rec.mpg | ffmpeg -threads 2 -i pipe:0 http://12.34.56.789:8090/feed1.ffm