Rtmpdump #1


Ich besitze zwar einen Fernseher aber kein Rundfunkempfangsgerät. Der Fernseher dient  nur dem Zweck ab und an ein wenig Konsole zu spielen oder mit dem WDTV einen Film zu schauen. Ich schaue mir einmal am Tag die Tagesschau an und würde das auch gerne mal auf meinem eigenen Fernseher ansehen und nicht vor dem Monitor oder bei Bekannten.

Dank der modifizierten Firmware von b-rad kann man ja einiges mit dem WDTV anstellen  und es gibt auch einige Livesender im Internet. Beides zu verbinden hat durchaus seinen Reiz. Leider ist es von den diesen Anbietern ja meist nur angedacht den Stream im Browser mit Flash zu schauen. Bei dem WDTV brauche ich gar nicht an Flash zu denken. Also  muß ich wohl oder übel an den eigentlichen Stream und etwas für die WDTV basteln.

Ab und an hat man das Glück und kommt an eine mms:// Adresse aber  oft ist das leider nicht der Fall. Den Stream von Phoenix kann man sich unter der

mms://live.msmedia.zdf.newmedia.nacamar.net/zdf/phoenix_vh.wmv

konsumieren wenn Phoenix Lust hat den Stream einzuschalten. Ohne solche Urls muß man wohl oder übel einen Blick in den Seitenquelltext (Bitte niemals nie mit Source Code oder Code bezeichnen) der Html Seite schauen. Sehr nützlich ist dabei Firefox und die Adblock Plus Erweiterung.

Dieser Artikel ist primär für mein vergessliches Hirn gedacht. Drum rücke ich hier eine sehr grobe Erklärung wie ich mir das mit dem Streaming vorstelle ein.

Prinzipiell kommt beim Streamingkonsum neben dem Browser noch ein 2. Client ins Spiel. Dabei handelt es sich leider zu oft um den Flash Player. In Html erkennt man ihn an der Endung .swf (Shockwave Flash). Dieser Client verbindet sich mit einem Server  der das Video zum Client bringt.

Wir haben also einen Client im Client. Von daher ist es nicht nur logisch, sondern auch gerecht, daß man die Adresse des Streaming Servers herausfinden kann.   Wenn der Streamingserver eine andere Adresse als der Webserver hat welcher die Seite mit dem Flashplayer hostet ist das meiner/unserer/Eurer Sache mehr als dienlich.

An manche Streams kommt man sehr einfach. Hier ist Adblock+ sehr hilfreich. Man klicke auf das rote Icon und dann auf Blockierbare Elemente anzeigen. Nun ordnet man die Elemente der geöffneten Seite nach der Adresse und schaut sich einfach mal an was da so referenziert wird:  

In der Liste sieht man sehr schön, daß Elemente von 3 verschiedenen Seiten hier gelistet sind. Auf einer dieser Seiten befinden wir uns gerade. Nun schließen wir Google als Quelle aus und natürlich die xml Datei. Die 3. Url übergeben wir einfach mal dem wahren Omnivoren unter den Mediaplayern: mplayer. Der kommt auch direkt damit klar.

Glück gehabt:).

Nun haben wir schon 2 Quellen aus denen wir recht einfach Livestreams abgreifen können und das Thema ist zur 2/3 erschöpft – jedenfalls was mein aktuelles Wissen betrifft. 🙂

Adobe hat sich extra ein proprietäres Netzwerkprotokoll ausgedacht um diese Flashplayer zu bedienen. Das Ganze hört auf den Namen RTMP.

Ich möchte kein Beispiel aus dem Leben zeigen, da ich keine Ahnung habe, ob ich mich da irgendwie strafbar mache.

Bevor man loslegen kann wird das Programm rtmpdump benötigt. Dieses Tool scheint auch aus der Feder der Omnivorenschöpfer zu stammen. Das Teil ist recht einfach gebaut, einzig bei Debian für ARM Plattformen (dazu später mehr) mußte ich explizit die libc6-dev installieren.Das Paket gcc kommt ohne aus. Fachlich korrekt aber irgendwie sinnfrei. 5 Minuten meines Lebens wieder mal mit nichts verschwendet. Wie das auf meinem PC war kann ich nicht mehr genau bestimmen. Doch zurück zu RTMP. Ich wollte einen Stream der vom JW Player abgespielt wird.

Die Bedienung von rtmdump wirkt auf den ersten Blick reichlich schräg – wie alles was mit Multimedia auf der Konsole zu tun hat – ist jedoch recht eingängig wenn man die Readme sorgfältig liest.

Um dem JW Player den Stream abzuringen werden einige Dinge benötigt, die man ausschließlich im Markup findet:

  • die swf Url: http://player.longtailvideo.com/player.swf
  • die Url des RTMP Streams – schaut immer so aus rtmp://<Dein Stream>
  • ein File(file=“) –  immer in der Nähe von rtmp und swf zu finden

Der JW Player möchte noch einen recht dämlichen Handshake bevor der Spaß losgeht. Der sieht so aus:

Zuerst wird die swf Datei heruntergeladen, deren Größe bestimmt und der sha-256 digest des Files bestimmt. Beide Werte müssen wir rtmpdump übergeben.  Ohne diese Argumente gibt es auch keinen Stream :).

Zum Testen bietet es sich an ein Script anzulegen um bequem mit dem Unfug spielen zu können. Bei mir sieht das nun so aus:

#!/bin/bash
name=’arte‘
###SWF url
swfurl=’http://player.longtailvideo.com/player.swf&#8216;
###RTMP
urlrtmpuri=’rtmp://<URL>/‘
##file
file=“
wget -O /tmp/player.swf $flvurl  &>/dev/null
sum=$(sha256sum /tmp/player.swf |cut -d “ “ -f 1)
size=$(ls -l /tmp/player.swf | cut -d “ “ -f 5)
output=$name.flvrtmpdump -V -r $rtmpuri -y $file -s $swfurl -w $sum -x $size -o $output

Die Option -V steigert wie immer die Gesprächigkeit, den Rest kann man der Readme entnehmen. Nun öffnet man einfach den Output von rtmpdump mit mplayer  – in diesem kleinen  Beispiel arte.flv und man sieht hoffentlich einen schönen Stream.

Auf der Projektseite sind ein paar Programme gelistet, die auf rtmpdump aufbauen, doch empfinde ich es immer wieder als nette Erfahrung mir solche Dinge einmal genauer anzuschauen.

Soviel zu meinen Erfahrungen mit Livestreams und rtmpdump. Dieses Intermezzo war recht kurz weil ich noch nicht wirklich viel Ahung von der Geschichte habe. Zum Spaß habe ich mir das Ganze auch mal mit Wireshark angesehen und dabei andächtig über die Entwickler von rtmpdump reflektiert. Über weitere Infos zudem Thema würde ich mich natürlich sehr freuen.

Im nächsten Schritt muß natürlich Bild und Ton auf das WDTV. Ein rudimentäres UMSP Skript habe ich mal erstellt aber noch nichts wirklch Vorzeigbares. Momentan plane ich das Encodieren und Dumpen auf meinem neuen NAS zu erledigen an dem sich dann mehrere Clients bedienen können. Das spart nicht nur Bandbreite im Flaschenhals DSL Anschluss falls mehere Clients darauf zugreifen, sondern reduziert auch grausame WDTV Friemeleien auf ein Minimum.

Nun bleibt mir nur noch zu fragen wie Ihr Streams konsumiert. Schaut Ihr im Browser? oder habt Ihr gar ein schönes Skript um Flash zu umgehen?

Advertisements
Dieser Beitrag wurde unter webkrams abgelegt und mit , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

2 Antworten zu Rtmpdump #1

  1. ClicClac schreibt:

    Hallo,
    Ein schöner Artikel. Leider ist meine Internetverbindung furchtbar lahm, was es fast unmöglich macht, solche Filme zu sehen. Bei youtube kann man wenigstens, abwarten und spulen, aber bestimmte „mediatheken“ scheinen etwas dagegen zu haben.
    Leider scheint es den Betreibern auch zu belieben, alternative Wege zum Video mit allerhand Steinen zu versehen (Warum stellen sie ihren Kram dann ins Internet?).

    Nun gut. Ein hoch gerühmer und wenig gesehener Deutsch/französischer Sender schien es mir wert, ein wenig Aufwand zu treiben.
    Ich habe mir also ein kleines ruby-Script (für Shellscript bin ich leider zu blöd) geschrieben, dass die URL der Seite frisst, auf der das Video normalerweise erscheinen soll und mithilfe von
    * open-uri
    * CGI::unescape
    * und einiger regulärer Ausdrücken
    ein passendes rtmpdump-Kommando generiert.

    Ein schönes Blog übrigens 🙂

  2. augeauge schreibt:

    Ich finde diese Knechtung an merkwürdige Flashplayer auch nicht schön. Ich bin auch kein Experte für Bash Skripts, ich hab mich nur mal ein wenig damit beschäftigt um effizienter in der Konsole zu arbeiten. An die Eleganz von Ruby kommt die holprige Bash-Syntax nicht dran.^^ Hast Du Dein Skript irgendwo veröffentlicht?

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s