RTSP 2 HTTP

Il semblerai que le script que j’avais bricolé il y a quelques mois pour convertir un flux RTSP provenant de la Freebox intéresse du monde…
Certains utilisateurs de Xbox veulent l’utiliser pour regarder la Freeboox sur leur Xbox…

AlexSolex l’a même amélioré… Maintenant la freebox ne coupe plus le flux toutes les 30s… Il fallait pour cela renvoyer un petit paquet magique régulièrement à la Freebox pour lui signaler que l’on est toujours en vie !!!

Voici le script modifié (download).

Update 2006/10/24 : Comme j’avais oublié de le faire, je met ce code sous la licence GPL v2. Vous pouvez en faire ce que vous voulez du momoent que vous distribuez le code avec (c’est pas dure, c’est du python 😉 ) et que vous publiez le modifications 😉

(20 commentaires)

Passer au formulaire de commentaire

  1. question bete:
    tu le met ou ton fichier? dans les sources du kernel?
    t’a une notice simplifier de l’installation,ou non?
    je voudrais le mettre sur un firmware freifunk enfin openwrt pour avoir la TV su le reseau rouen-wireless.net.
    Enfin histoire de tester deja….

  2. Bonjour,

    J’ai essayer ton script python, qui permet de tranformer le flux rtsp video de la freebox vers du http.
    Coté linux, ca mouline mais je n’obtiens rien, pas d’image.
    J’utilise vlc 8.4a sur mon client et je suis bloqué sur le port 31337

    Voici ce que j’ai sur l’écran du linux qui tourne en boucle :
    <<< RTSP/1.0 200 OK
    <<< Cseq: 2
    Cseq : 2
    <<< Session: VGiqV5ZU5f7letwaPAhQ6w2a3GwL0KVMh423ZSNVYL724t3KTaqPxjQqPd2GONi
    Session : VGiqV5ZU5f7letwaPAhQ6w2a3GwL0KVMh423ZSNVYL724t3KTaqPxjQqPd2GONi
    <<< Server: fbxrtspd/1.0 Freebox minimal RTSP server
    Server : fbxrtspd/1.0 Freebox minimal RTSP server
    <<<
    RTSP TimeOut : retrying
    <<< RTSP/1.0 200 OK
    <<< Cseq: 3
    Cseq : 3
    <<< Server: fbxrtspd/1.0 Freebox minimal RTSP server
    Server : fbxrtspd/1.0 Freebox minimal RTSP server
    <<<
    ({‘Cseq’: ‘3’, ‘Server’: ‘fbxrtspd/1.0 Freebox minimal RTSP server’}, None)
    HEADER TEARDOWN:
    {‘Session’: ‘VGiqV5ZU5f7letwaPAhQ6w2a3GwL0KVMh423ZSNVYL724t3KTaqPxjQqPd2GONi’, ‘Cseq’: ‘2’, ‘Server’: ‘fbxrtspd/1.0 Freebox minimal RTSP server’}
    starting RTSP connection at 0.590000
    <<< RTSP/1.0 200 OK
    <<< Cseq: 1
    Cseq : 1
    <<< Session: VIbOyTrjH3hzXAsyksP0QYH6EKZaoDj9blOz46JCZQ1MgkbrDQhjEOg9p59DyjD
    Session : VIbOyTrjH3hzXAsyksP0QYH6EKZaoDj9blOz46JCZQ1MgkbrDQhjEOg9p59DyjD
    <<< Server: fbxrtspd/1.0 Freebox minimal RTSP server
    Server : fbxrtspd/1.0 Freebox minimal RTSP server
    <<< Transport: RTP/AVP;unicast;mode=play;destination=212.27.38.254;client_port=31337;server_port=32770-32771
    Transport : RTP/AVP;unicast;mode=play;destination=212.27.38.254;client_port=31337;server_port=32770-32771

    J’ai juste modifié dans ton script le port a 31337 (ligne 176 : Transport: RTP/AVP;unicast;client_port=31337)

    et j’ai mis l’adresse IP de ma freebox( est ce normal ?) à la ligne 174 ((header, data)=rtsp_session.request("""SETUP rtsp://212.27.63.113/freeboxtv%s RTSP/1.0
    CSeq: %s)

    Je ne sais pas par contre ce que signifie dans la console destination=212.27.38.254
    A quoi correspond cette adresse IP ?

    Peux tu me donner un coup de main pour résoudre ce probleme ?
    Encore merci d’avance

    • alexsolex on 18 mai 2006 at 19:34
    • Répondre

    @viking :
    ce script n’est pas fait directement pour tourner dans un routeur. A ma connaissance un autre message de puyb fait état de ce système.

    @wolfy :
    J’ai juste modifié dans ton script le port a 31337 (ligne 176 : Transport: RTP/AVP;unicast;client_port=31337)

    NON ! ou alors il faut mettre client_port=31336-31337 et forwarder ces ports sur l’IP où tourne le proxy.
    Commence par ca et reteste
    Sinon, l’IP de la freebox était, il me semble, identique, quelque soit la freebox… A savoir : 212.27.38.253

  3. J’ai fait les modifs, mais je n’ai pas réussi, j’ai toujours le meme message.
    Par contre, j’ai récupéré l’activeX de vlc pour IE, et ca fonctionne tres bien, meme par le routeur.
    Je peux maintenant regarder les chaines de la freebox, ou des films de n’importe ou sur la planete, a condition d’avoir un navigateur web
    Merci encore

  4. Vicking -> Install python sur ton openwrt puis lance : python rtsp2http.py Je ne sais pas si le wrt va être assez rapide (au pire on pourrait compiler le script python (il existe des compilateur)… Mais je ne sais pas s’il existe des compilateur pour ARM… Wolfy -> Peut tu me décrire un peu mieux ta config…. Apparemment tu as un proxy ?

    • Mightybob on 4 juin 2006 at 15:11
    • Répondre

    Pour information, j’ai du recompiler une version r�cente de Python pour que �a marche… car avec ma 2.1, �a me g�n�rait une erreur � l’ouverture de la socket… Avec la 2.4, tout fonctionne nikel… sauf Roland Garros HD qui fait plant� VLC 0.8.5, mais je pense que le pb viens plut�t de VLC 😉

    J’ai aussi constat� qu’il fallait pas mal de puissance cot� routeur pour faire tourner le script. Mon K6 � 400MHz est full CPU. 2 process sont en t�te du top : le python lui m�me, mais aussi le "named" (puisque j’ai mon propre DNS). Il faudrait voir pourquoi tant de requ�te DNS sont �mises. Il doit forc�ment y avoir un moyen de mettre �a en cache.

    Sinon, excellent boulot !

  5. Oui, comme tout script, c’est interprété, donc c’est un peu beaucoup gourmand en cpu… Il existe des interpréteurs/compilateurs python plus rapides (je me souviens d’un 1.8x plus rapide annoncé). Mais je ne les ai jamais testés…
    Sinon, maintenant que l’on sait que ça marche, on pourrais ré-ecrire tout ça en C (bonjour le parsing des trings ;-)… Enfin, c’est du C quoi 😉 )

    Pour la HD, il faut une version patché de VLC (fait une recherche « freebox multiposte HD »)…

    • Mightybob on 6 juin 2006 at 22:38
    • Répondre

    Pour verser ma participation au pot commun, voilà un petit script qui nous simpliera la vie :

    #!/bin/sh

    PLAYLIST_URL="mafreebox.freebox.fr/free…
    HTTP_BASE_URL="http://<MON_SERVEUR_HTTP&gt;:8083"
    DEST_DIR=/path/to/htdocs

    TEMPFILE=/tmp/basename $0.$$

    wget -o $TEMPFILE -O ${DEST_DIR}/rtsp_playsit.m3u $PLAYLIST_URL
    sed "s#rtsp://mafreebox.freebox.fr/freeboxtv#${HTTP_BASE_URL}#g" < ${DEST_DIR}/rtsp_playsit.m3u > ${DEST_DIR}/http_playlist.m3u
    rm $TEMPFILE

    # EOF

    Il suffit ensuite de faire pointer sa playlist de VLC vers <MON_SERVEUR_HTTP>/…
    Pour ma part, j’ai mis ce petit script dans la crontab pour une mise à jour quotidienne.

    Voilà… Reste à trouver un volontaire pour porter le python vers C/C++…….

    • Mightybob on 6 juin 2006 at 22:46
    • Répondre

    Pour verser ma participation au pot commun, voilà un petit script qui nous simpliera la vie :

    #!/bin/sh

    PLAYLIST_URL="hhtp://mafreebox.freebox.fr/freeboxtv/playlist.m3u"
    HTTP_BASE_URL="hhtp://<MON_SERVEUR_HTTP>:8083"
    DEST_DIR=/path/to/htdocs

    TEMPFILE=/tmp/basename $0.$$

    wget -o $TEMPFILE -O ${DEST_DIR}/rtsp_playsit.m3u $PLAYLIST_URL
    sed "s#rtsp://mafreebox.freebox.fr/freeboxtv#${HTTP_BASE_URL}#g" < ${DEST_DIR}/rtsp_playsit.m3u > ${DEST_DIR}/http_playlist.m3u
    rm $TEMPFILE

    # EOF

    Il suffit ensuite de faire pointer sa playlist de VLC vers hhtp://<MON_SERVEUR_HTTP>/http_playlist.m3u
    Pour ma part, j’ai mis ce petit script dans la crontab pour une mise à jour quotidienne.

    Voilà… Reste à trouver un volontaire pour porter le python vers C/C++…….

    NB: Remplacer "hhtp" par "http" dans le script. Je déteste les parseurs d’URL O:-)

    • alexsolex on 6 juin 2006 at 23:07
    • Répondre

    Salut Mightybob

    Je n’ai pas trop compris ce à quoi servait ta "participation au pot commun" ? Je ne reconnais pas le code (je suis pas un pro non plus de la prog)
    A quoi cela sert t’il ?
    Si j’ai bon c’est pour recréer la playlist.m3u de la freebox en une playlist compatible avec le proxy ?
    Si oui, j’ai codé un truc dans le genre dans un sript python. que je pourrais fournir mais bon, je suis loin d’être une référence. Ca serait juste éventuellement pour faire gagner du temps à certains

    • MightyBob on 8 juin 2006 at 13:49
    • Répondre

    @alexsolex:
    Le script shell unix que j’ai fourni permet de télécharger la playlist officielle Freebox TV Multiposte et de traduire toutes les URLs du type "rtsp" vers des URLs "http" qui pointent sur le serveur où tourne le script rtsp2http-0.0.4.py. Ainsi, il suffit dans le player VLC de charger la nouvelle playlist (http_playlist.m3u), de choisir la chaine et hop, c’est parti ! Plus besoin de taper l’adresse transcrite à chaque fois.
    Si j’ai le temps, ce week-end, je faire un script de démarrage et d’arrêt pour simplifier au maximum l’utilisation (démarrage automatique, etc…) de ce magnifique outil !!! On verra ça la semaine prochaine !

  6. MightyBob, ton script est pas mal, mais pourquoi ne pas directement l’intégrer dans le proxy…

    Dans la fonction httpthread(), ajoute (la première ligne indique à peu près ou placer le code) :

    ça devrait te renvoyer la playlist modifiée a la volée…

    Il suffit de faire http://proxy:8083/playlist.m3u
    Attention, je n’ai pas pu le tester (je suis au boulot et je n’ai pas de Freebox a disposition…) (traduction : ça ne va pas marcher tout seul 😉 )

    • MightyBob on 10 juin 2006 at 00:12
    • Répondre

    @puyb:
    Mon script n’est pas une sorte de redirecteur vers playlist.m3u. Son principal boulot est de remplacer les URLs de type "rtsp" contenues dans "playlist.m3u" par les URLs de type "http" qui pointent vers les proxy. Ce qui apparamment n’est pas fait dans ton morceau de code. Ou alors, je n’ai pas bien compris. Pour faire simple, voilà le fonctionnement de mon script :
    1*/ Téléchargement de la "playlist.m3u" officielle
    2*/ Traduction des URLs tel que:
    #EXTINF:0,999 – Mire FREEBOX
    rtsp://mafreebox.freebox.fr/freeboxtv/308
    devient
    #EXTINF:0,999 – Mire FREEBOX
    hhtp://simpson.livernais.net:8083/308
    3*/ Enregistre la nouvelle playlist.m3u dans le "home directory" du serveur web.
    Ainsi, dans VLC, il suffit de lui donner à manger "hhtp://simpson.livernais.net/http_playlist.m3u" à la place de l’URL officielle et la liste des chaines apparaît avec la nouvelle addres en HTTP pour avoir le flux.

    Plus généralement, j’ai constaté très très clairement, que le script python ne consomme que très peu de CPU en réalité. Par contre les requêtes DNS générées sont trop trop nombreuses… limite flooding ! En remplaçant simplement, le FQDN "mafreebox.freebox.fr" par son IP, il n’y a plus de requête DNS et mon vieux K6-400 suffit largement. Ce qui me fait dire que visiblement pour chaque paquet HTTP, une requête DNS est générée… Il serait certainement préférable de faire la requête DNS une fois à l’ouverture du flux et de la stockée dans une variable pour la suite. Qu’en pensez-vous ?

  7. permet de remplacer les debut d’url rtsp:// par rien du tout…

    Comme le fichier est recupéré depuis le même serveur HTTP que les flux, il n’est pas nécéssaire de mettre la totalité de l’url (url relatives…)

    Concerant les requettes DNS, je ne vois pas bien pourquoi il y aurrais tant de requettes… L’OS est cencé fournir un cache DNS… (Vu que de tant en temps, quand une adresse change, on est obligé de vider le cache DNS (lookupd -flushcache sur mon mac)

  8. Salut,

    Comment faire pourvoir utiliser ce code avec une Livebox Inventel (IP : 192.168.1.1 et IP de mon pc : 192.168.1.10), avec VLC et gestVOD afin qu’un ami puisse lire une vidéo qui est sur mon pc.

    Merci de votre aide.

    Cordialement,

    Ben

    PS: J’arrrive à faire un serveur VOD avec VLC en local, mais dès que j’essaie de passer au via Internet ca ne fonctionne plus (pourtant pas de firewall, et Zone démilitarisé dans ma Livebox…).
    Je crois que le problème vient du fait que c’est du rstp, c’est pourquoi je chercher à tranformer cela en HTTP.

  9. Avant tout, je n’ai jamais utilisé, n’y essayé d’utiliser ce script avec un autre serveur qu’un freebox. Il est donc fort possible que j’ai pris quelques liberté avec la norme RTSP. Le protocole RSP utilise un port TCP (le 554) et un flux de paquet UDP (le port n’est pas connu à l’avance, il est négocier entre le client et le serveur via le canal TCP. A mon avis, tu pourrais facilement résoudre ton problème en définissant la plage de port UDP que ton serveur peut utiliser et en routant ces ports UDP sur ta livebox.

    Sinon, il faut que tu modifie le script pour lui indiquer l’ip de ton serveur RTSP… Commence par faire tes test en local, tu passeras sur internet une fois que ça marchera. Si ça ne marche pas, essaye de debugger le script grâce aux traceback qui peuvent apparaître. Eventuellement, envois moi tes traceback si tu veux un coup de main. Enfin, tu peux utiliser wireshark (ex : ethereal) pour espionner la communication RTSP (en comparant avec une communication RTSP entre un vrai client et ton serveur).

    • tarakan on 8 septembre 2007 at 09:31
    • Répondre

    Salut, y aurait-il quelque part la dernière version du script avec toutes ces modifs ? merci 🙂

  10. Bonjour,

    J’essaie de faire marcher ce script dans ma dreambox (demo sat sous linux).
    J’arrive à lancer le .py mais ça n’a pas l’air de fonctionner.
    N’y aurait il pas un probleme avec le nom des fichires rtsp des chaines de free ?
    Ils n’ont plus ce format :
    rtsp://mafreebox.freebox.fr/freeboxtv/308
    mais celui ci :
    rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=201&flavour=ld

    Ya t il une mise à jour du script ? 🙂
    Merci

    • oncleben31 on 18 juillet 2009 at 20:54
    • Répondre

    Certaine personne maintiennent en partie se script pour le faire marcher sur XBMC. Tu trouvera une des dernière version ici : passion-xbmc.org/developp…

  11. Pim, merci pour l’intérêt que tu porte à ce script… Je dois dire que je suis surpris que ce qui était à l’origine juste un bricolage pour m’amuser un peu avec ma freebox trouve une utilité auprès de tant de personnes… Actuellement, je ne me sert plus de ce script… Tu peux aller chercher de l’aide sur le site dont parle oncleben31, mais tu peux aussi essayer de modifier le script par toi même, ce n’est pas bien compliqué… Il te suffit de trouver la ligne qui forme l’URL et de la corriger… Bon courage. Si tu as des question n’hésite pas…

Laisser un commentaire

Your email address will not be published.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.