Dreambox/VlcPlayer

Aus SchnallIchNet
Wechseln zu: Navigation, Suche

VlcPlayer plugin

Client Versionen

ich hatte probleme mit meinem vlc-player plugin auf der dm800

uname -a
Linux dm800 2.6.12-5.1-brcmstb-dm800 #1 Tue Mar 10 13:19:31 CET 2009 7401c0-nand unknown
# ipkg list_installed | grep -i vlc
enigma2-plugin-extensions-vlcplayer - 2.7cvs20100104-r0


nach einem update sieht die konfiguration so aus:

Linux dm800 2.6.18-7.4-dm800 #1 Tue Mar 22 18:02:59 UTC 2011 7401c0 GNU/Linux
# ipkg list_installed | grep -i vlc
enigma2-plugin-extensions-vlcplayer - 3.1git20110318-r0

ein entsprechender patch findet sich weiter unten im text...


Server Versionen

ii vlc      0.8.6-svn20061012.debian-5.1+etch3
Achtung.jpeg nach einem upgrade auf lenny geht das ganze nicht mehr!! :-(
dies war aber zum abspielen von HD-videos noetig

nach dem update:

ii  vlc                                                     1.0.3-1+opp~1                   multimedia player and streamer
ii  vlc-nox                                                 1.0.3-1+opp~1                   multimedia player and streamer (without X)

wenn man ein lenny benutzt muss man also folgendes repo einbinden:

wget http://debian.oppserver.net/gpg-opp-signing-pubkey.asc -O - | apt-key add -

sources.list:

deb http://debian.oppserver.net/debian/ lenny main non-free contrib
deb-src http://debian.oppserver.net/debian/ lenny main non-free contrib
Achtung.jpeg Opp hat sein paket auf version 1.1.4-1+opp~1 geupdated - hiermit laeuft (bei mir) das streaming zur dreambox nicht mehr!!!
Nach einem downgrade auf die alte version 1.0.x war alles gut... ;-)

aus diesem grund bitte folgende datei editieren:

vi /etc/apt/preferences

und folgendes dort eintragen:

Package: vlc
Pin: version 1.0.3-1+opp~1
Pin-Priority: 999

Package: vlc-nox
Pin: version 1.0.3-1+opp~1
Pin-Priority: 999

wer die version 1.0.3-1+opp~1 nicht oder nicht mehr hat, kann sie hier bekommen:

http://deb.rubbish.de/debian/pool/main/v/vlc/vlc_1.0.3-1+opp~1_i386.deb
http://deb.rubbish.de/debian/pool/main/v/vlc/vlc-nox_1.0.3-1+opp~1_i386.deb

nun ein:

apt-get update
...
apt-get dist-upgrade

nun habe ich auf dem server:

ii vlc      1.0.3-1+opp~1

und alles ist gut und er spielt zumindest .mkv-files


configuration dm800

  1. Name des Servers: vlc.lan.mydomain.de
  2. Server-Adresse: vlc.lan.mydomain.de
  3. Server-Port: 8080


configuration server

Starten des vlc-binary mit folgenden parametern:

vlc -I http --http-host vlc.lan.mydomain.de:8080 -vvv


problem 1

  1. das plugin kann zum server connecten.
  2. ich kann durch die verzeichnis-struktur browsen
  3. ich kann filme zum abspielen auswaehlen
  4. abspielen von streams zeigt die dm800 ein schwarzes bild zeigt.
  5. der timer laeuft, ich kann augenscheinlich spulen, etc. aber der bildschirm bleibt schwarz.

nach etwas debugen habe ich dann rausgefunden dass der vlc-server beim starten eines streams
einen fork() macht und versucht, soweit nichts explizit angefordert wird,
default den port 8080 zu verwenden. dies fuehrte bei mir zu einem:

[...]
Could not bind port. Allready in use.
[...]

was ja auch logisch ist, da unser vlc-webinterface des servers ja bereits auf 8080 lauscht.

ich aendere also meine configuration folgendermassen:


configuration dm800

  1. Name des Servers: vlc.lan.mydomain.de
  2. Server-Adresse: vlc.lan.mydomain.de
  3. Server-Port: 8081


configuration server

Starten des vlc-binary mit folgenden parametern:

vlc -I http --http-host vlc.lan.mydomain.de:8081 -vvv


problem 2

  1. das plugin kann zum server connecten.
  2. ich kann durch die verzeichnis-struktur browsen
  3. ich kann filme zum abspielen auswaehlen
  4. der server kann fork()-en und port 8080 binden!!!
  5. der stream laeuft und ich kann ihn mit einem vlc-player auf einem 3. rechner ansehen.
  6. die dm800 zeigt nach wie vor ein schwarzes bild!
  7. der timer laeuft, ich kann augenscheinlich spulen, etc. aber der bildschirm bleibt schwarz. sagte ich das schon? ;-)

folglich:

  1. die dm800 versuchte den stream vom configurierten port (8081) zu lesen statt vom default-port 8080
    und bekommt einen 404 vom vlc-server auf port 8081


loesung

ich habe dann einen quick'n dirty patch fuer den client gemacht.
da der vlc-client keinen expliziten port anfodert wird mein server IMMER 8080 verwenden.
daher habe ich an der stelle wo der serverstream geoeffnet werden soll
'self.getHttpPort()' einfach statisch durch 8080 ersetzt.


patch VlcServer.py Version 2.7cvs20100104-r0

# cd /usr/lib/enigma2/python/Plugins/Extensions/
# diff -uBr VlcPlayer.orig/VlcServer.py VlcPlayer/VlcServer.py
--- VlcPlayer.orig/VlcServer.py 2010-03-06 12:42:48.000000000 +0100
+++ VlcPlayer/VlcServer.py      2010-03-06 13:23:20.000000000 +0100
@@ -254,7 +254,7 @@
                        return None
                else:
                        self.lastError = None
-               return "http://%s:%d/%s.ts" % (self.getHost(), self.getHttpPort(), streamName)
+               return "http://%s:8080/%s.ts" % (self.getHost(), streamName)

        def unpause(self):
                self.__xmlRequest("status", {"command": "pl_pause"})


patch VlcServer.py Version 3.1git20110318-r0

diff -uBr VlcPlayer.orig/VlcServer.py VlcPlayer/VlcServer.py
--- VlcPlayer.orig/VlcServer.py 2012-01-12 18:35:55.000000000 +0100
+++ VlcPlayer/VlcServer.py      2012-01-12 18:35:53.000000000 +0100
@@ -257,7 +257,8 @@
                        return None
                else:
                        self.lastError = None
-               return "http://%s:%d/%s.ts" % (self.getHost(), self.getHttpPort(), streamName)
+               #return "http://%s:%d/%s.ts" % (self.getHost(), self.getHttpPort(), streamName)
+               return "http://%s:8080/%s.ts" % (self.getHost(), streamName)
 
        def unpause(self):
                self.__xmlRequest("status", {"command": "pl_pause"})
  1. patch auf der dreambox einspielen - see 'man patch'
  2. auf der dm800 loechen der .pyc oder .pyo
    rm /usr/lib/enigma2/python/Plugins/Extensions/VlcPlayer/VlcServer.(pyc|pyo)
    sonst wird die veraenderung an der VlcServer.py nicht uebernommen!
  3. dm800 rebooten
    sonst wird die veraenderung an der VlcServer.py nicht uebernommen! WTF??
  4. vlc-server starten, falls noch nicht geschehen:
    vlc -I http --http-host vlc.lan.mydomain.de:8081 -vvv
  5. vlc-server auf der dm800 auf port 8081 configurieren
  6. film auswaehlen
  7. bier holen
  8. entspannen!!!!


Appendix

init-script fuer lenny

#! /bin/sh
### BEGIN INIT INFO
# Provides:          VLCStream
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start vlc as streaming server
# Description:       Starts vlc as streaming server for dream dm800
### END INIT INFO

# Author: Christoph Steidl <chris@rubbish.de>

# Do NOT "set -e"
#set -x

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin

DESC="VLC Streaming Service"
NAME=vlc

# using sudo as daemon since vlc-1.0.x
# giving vlc-binary as daemon-args
DAEMON=/usr/bin/sudo
DAEMON_ARGS="-u $NAME /usr/bin/$NAME -vvv -I http --http-host vlc.lan.mydomain.de:8081"

PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/vlcstreamd

# unset DISPLAY - we have no X and will run vlc as server
unset DISPLAY

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

# verbose =YES
VERBOSE=yes

#
# Function that starts the daemon/service
#
do_start()
{
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
        start-stop-daemon --start --quiet --background --make-pidfile \
                --user vlc --group vlc --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_ARGS
        
        [ -n "`/bin/pidof $NAME`" ] && return 0 || return 2
}

#
# Function that stops the daemon/service
#
do_stop()
{
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
        if [ $? -eq 0 ]; then
                rm $PIDFILE;
                return 0
        else
                return 2
        fi
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
        #
        # If the daemon can reload its configuration without
        # restarting (for example, when it is sent a SIGHUP),
        # then implement that here.
        #
        #start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
        log_daemon_msg "Reload of $DESC not possible"
        log_daemon_msg "Please stop and start the service"
        log_end_msg 1
        return 0
}

case "$1" in
  start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
        case "$?" in
               0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
               2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  reload)
        #
        # If do_reload() is not implemented then leave this commented out
        # and leave 'force-reload' as an alias for 'restart'.
        #
        #log_daemon_msg "Reloading $DESC" "$NAME"
        do_reload
        log_end_msg $?
        ;;
  restart|force-reload)
        #
        # If the "reload" option is implemented then remove the
        # 'force-reload' alias
        #
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        if [ `pidof $NAME` ]; then log_end_msg 1; exit 1; fi
        case "$?" in
          0|1)
                do_start
                case "$?" in
                        0) log_end_msg 0 ;;
                        1) log_end_msg 1 ;; # Old process is still running
                        *) log_end_msg 1 ;; # Failed to start
                esac
                ;;
          *)
                # Failed to stop
                log_end_msg 1
                ;;
        esac
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
        exit 3
        ;;
esac

: