Externremux.sh
Inhaltsverzeichnis |
Beschreibung
Der HTTP-Server des streamdev-plugins erlaubt es den Datenstrom eines Senders vor dem Versenden zu manipulieren. Um von dieser Möglichkeit Gebrauch zu machen, muss der Stream über folgende Adresse abgerufen werden:
http://vdr-ip-or-host:3000/EXT/1
Die 3000 steht für den im streamdev-plugin Setup eingestellten Port des HTTP-Servers. Die 1 steht für Kanal 1 gemäß der channels.conf. Die Übergabe von Parametern zur Qualitätssteuerung ist in der URL möglich (bei Verwendung untenstehender externremux.sh (2):
http://vdr-ip-or-host:3000/EXT;DSL3500/1
Das streamdev-plugin ruft dann das Skript externremux.sh. Der Datenstrom des gewählten Senders steht dem Skript über Standard-Eingabe (stdin) zur Verfügung. Der manipulierte Datenstrom muss über Standard-Ausgabe (stdout) an das Plugin zurückgegeben werden.
U.a. kann man MPlayer / VLC media player als Client benutzen.
Konfiguration
Das streamdev-plugin muss installiert und der HTTP-Server des Plugins aktiviert sein.
Um viele Fehler bei der externremux.sh zu umgehen (da untenstehende Beispiele bei der aktuellen vdr-Version (1.7.18), bzw. streamdev-Server (0.5.1) nicht funktionieren), sollte die Beispiel-Config aus /usr/share/doc/vdr-plugin-streamdev-server/examples/externremux.sh.gz kopiert werden, zB: in den vdr-Plugins-Ordner:
gunzip /usr/share/doc/vdr-plugin-streamdev-server/examples/externremux.sh.gz -c > /etc/vdr/plugins/externremux.sh
Die externremux.sh muss für den vdr-user les- und ausführbar sein:
chown vdruser:vdrgroup externremux.sh chmod 755 externremux.sh
Auch das Verzeichnis in dem die externremux.sh liegt muss den Zugriff für den VDR-Benutzer zulassen, das Verzeichnis /etc/vdr/plugins/ ist es im Normalfall.
Anschließend externremux.sh nun in den streamdev-server Aufruf einzubinden.
Distributions-spezifisch
Je nach Distribution wird die Übergabe, an das Plugin unterschiedlich erfolgen.
Gentoo
Bei gentoo ist es folgende Konfigurations-Datei.
zumindest bei Gen2VDR beta3
muß es
PLUGIN_PARAMETERS="--remux=/home/vdr/externremux.sh"
heißen
Für streamdev 0.5.x
STREAMDEV_REMUX_SCRIPT="/home/vdr/externremux.sh"
Außerdem müssen alte Skripte so beginnen:
echo -ne 'Content-type: video/mpeg\r\n' echo -ne '\r\n'
Debian / C't-VDR
Im StartUp-Skript von Debian/ctvdr werden die Plugin-Parameter über eine Datei namens plugin.<pluginname>.conf bestimmt. Diese Datei befindet sich unter /etc/vdr/plugins/. Folglich muss eine Datei in etwa so angelegt werden:
# # Kommandozeilenparameter für das Streamdev-Plugin # # Mit dem Parameter -r oder --remux kann ein externer Remuxer aufgerufen werden. # Die Streams können dann wie folgt den Remuxer inkludieren: # http://vdr-ip-or-host:3000/Extern/1 # Dabei ist IP und Port auf dem Client der Serveradresse anzupassen. # Die letzte Zahl entspricht dem Kanal wie sie in der channels.conf aufgeführt werden. # -r /var/lib/vdr/plugins/streamdev/externremux.sh
Beim Debian-Paketen wird dies im vdr-Plugins Directory (zB: /etc/vdr/plugins/ ) das File plugin.streamdev-server.conf erstellt und darin die externremux.sh beim Start des streamdev-servers aufgerufen.
echo "-r /etc/vdr/plugins/externremux.sh" > /etc/vdr/plugins/plugin.streamdev-server.conf
oder auch
echo "-r=/etc/vdr/plugins/externremux.sh -a user:password" > /etc/vdr/plugins/plugin.streamdev-server.conf
Hier wird dann bei allen Zugriffen auf einen Channel Username und Password abgefragt die nicht in der streamdevhosts.conf Datei eingetragen sind.
Nun muss noch vdr neu gestartet werden, und fertig:
/etc/init.d/vdr restart
Natürlich sollte sich unter /var/lib/vdr/plugins/streamdev/ auch das Skript externremux.sh befinden. Man kann es aus den Beispielen kopieren (/usr/share/doc/vdr-plugin-streamdev-server/examples/externremux.sh) und den Pfad wie oben beschrieben ggf. anpassen.
Ubuntu
Bei Ubuntu muss im externremux.sh #!/bin/sh durch #!/bin/bash ersetzt werden.
Fedora
Bei Fedora werden die Plugin-Parameter für den streamdev-server in der Datei streamdev-server.conf im Ordner /etc/sysconfig/vdr-plugins.d/ festgelegt. Das Skript externremux.sh befindet sich schon mit im Paket vdr-streamdev-server und braucht nur noch angegeben werden. Dabei ist darauf zu achten, dass der Pfad je nach Architektur (lib/lib64) angepasst wird. Das folgende Beispiel ist für 64Bit:
# Configuration snippet for vdr-streamdev-server -*- sh -*- # # Add command line options to pass to the streamdev-server plugin to PLUGIN_OPTIONS. PLUGIN_OPTIONS="--remux=/usr/lib64/vdr/bin/externremux.sh"
Anwendungsbeispiele
Streamen über schmalbandige Verbindungen
Mit Hilfe des streamdev-plugins und MEncoder kann man das laufende Fernsehprogramm auch über schmalbandige Verbindungen (z. B. DSL-Upload) streamen.
Dazu dient folgender MEncoder-Aufruf (im obigen Beispiel ergänzen):
mencoder -ovc lavc -ffourcc XVID -oac lavc \ -lavcopts acodec=mp3:abitrate=32:vcodec=mpeg4:vbitrate=100 \ -vf scale -zoom -xy 288 -channels 1 -o $FIFO - &>$OUTLOG
Bei Verwendung eines Routers zum Internet muss der Port 3000 auf den VDR-Server weitergeleitet werden. Zum Testen empfiehlt es sich, erst einmal im lokalen Netz die Funktionsfähigkeit zu überprüfen.
Der Clientrechner muss zudem die Erlaubnis haben, auf den Stream zugreifen zu dürfen. Dies wird in der Datei streamdevhosts.conf eingestellt. Die Zeile
0.0.0.0/0
gibt allen Rechnern im Internet die Erlaubnis, den Stream zu sehen. Diese Einstellung sollte nur in Verbindung mit einer Passwortabfrage im streamdev-plugin verwendet werden!
externremux.sh (1)
In der Praxis kommt häufig das Programm MEncoder (Bestandteil von MPlayer) zum Einsatz. Dazu empfiehlt sich eines der folgenden Beispiele:
#!/bin/sh umask 077 tmpdir=${TMPDIR-/tmp}/externremux-${RANDOM:-$$} FIFO=$tmpdir/out.avi OUTLOG=$tmpdir/out.log mkdir -p $tmpdir || exit 1 mkfifo $FIFO (cat $FIFO; rm -rf $tmpdir) & mencoder <OPTIONEN> -o $FIFO -- - &>$OUTLOG
In die Datei out.log kann man bei Problemen rein schauen. Allerdings wird diese Datei beim Beenden von externremux.sh gelöscht. Um dies zu verhindern, bitte die Zeile "OUTLOG=" folgendermaßen ändern:
OUTLOG=/tmp/out.log
externremux.sh (2)
#!/bin/sh # # externremux.sh # CONFIG START TMP=/tmp/externremux-${RANDOM:-$$} STREAMQUALITY="DSL6000" # CONFIG END mkdir -p $TMP mkfifo $TMP/out.avi (trap "rm -rf $TMP" EXIT HUP INT TERM ABRT; cat $TMP/out.avi) & case ${1:-$STREAMQUALITY} in "DSL1000") exec mencoder -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=100 \ -oac mp3lame -lameopts preset=15:mode=3 -vf scale -zoom -xy 160 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; "DSL2000") exec mencoder -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=128 \ -oac mp3lame -lameopts preset=15:mode=3 -vf scale -zoom -xy 160 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; "DSL3000") exec mencoder -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=250 \ -oac mp3lame -lameopts preset=15:mode=3 -vf scale -zoom -xy 320 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; "DSL3500") exec mencoder -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=300 \ -oac mp3lame -lameopts preset=15:mode=3 -vf scale -zoom -xy 320 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; "DSL6000") exec mencoder -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=350 \ -oac mp3lame -lameopts preset=15:mode=3 -vf scale -zoom -xy 320 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; "DSL16000") exec mencoder -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=500 \ -oac mp3lame -lameopts preset=15:mode=3 -vf scale -zoom -xy 480 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; "LAN10") exec mencoder -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=4096 \ -oac mp3lame -lameopts preset=standard \ -o $TMP/out.avi -- - &>$TMP/out.log ;; "WLAN11") exec mencoder -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=768 \ -oac mp3lame -lameopts preset=standard -vf scale -zoom -xy 640 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; "WLAN54") exec mencoder -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=2048 \ -oac mp3lame -lameopts preset=standard \ -o $TMP/out.avi -- - &>$TMP/out.log ;; "IPAQ") exec mencoder -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=350 \ -oac mp3lame -lameopts preset=15:mode=3 -vf scale -zoom -xy 320 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; "OGG") exec ffmpeg2theora --format ts \ --videoquality 0 --videobitrate 300 --width 360 --height 360 --speedlevel 1 \ --audioquality 0 --audiobitrate 37 --channels 1 --audiostream 0 \ --title "VDR Live Stream" \ --output $TMP/out.avi -- - &>$TMP/out.log ;; "COPY") exec mencoder -of mpeg -ovc copy -oac copy -mpegopts format=mpeg \ -o $TMP/out.avi -- - &>$TMP/out.log ;; *) touch $TMP/out.avi ;; esac
Der Aufruf des Streams erfolgt hierbei für das Beispiel "DSL1000" über folgende Adresse:
http://vdr-ip-or-host:3000/Extern;DSL1000/1
externremux.sh (3)
#!/bin/sh # # externremux.sh # CONFIG START STREAMQUALITY="UMTS" # COPY, UMTS, DSL{1,2,3,6}000, DSL3500, LAN10, WLAN{11,54}, IPAQ RECDIR=/video0/ TMP=/tmp/externremux-${RANDOM:-$$} # CONFIG END # DVD abspielen: # /Extern;STREAMQUALITY:dvd:dvdfile # Aufzeichnungen abspielen # /Extern;STREAMQUALITY:rec:dirname to search # /Extern;STREAMQUALITY:file:filename to search mkdir -p $TMP mkfifo $TMP/out.avi (trap "rm -rf $TMP" EXIT HUP INT TERM ABRT; cat $TMP/out.avi) & case ${1:0:1} in [A-Z]) IFS=: CMD=($1) IFS= ;; *) IFS=: CMD=("$STREAMQUALITY" $1) IFS= ;; esac case ${CMD[1]} in d*) RECORDING="dvd://${CMD[2]}" ;; r*) REC=$(eval find $RECDIR -name 20*.rec | grep -m 1 -i "${CMD[2]}") if [ -d "$REC" ] ; then RECORDING="$REC/[0-9][0-9][0-9].vdr" fi ;; f*) REC=$(eval find $RECDIR | grep -m 1 -i "${CMD[2]}") if [ -f "$REC" ] ; then RECORDING="$REC" fi ;; esac case $CMD in H265) exec mencoder $RECORDING -ovc x264 \ -x264encopts bitrate=200:vbv_maxrate=250:vbv_bufsize=300:ratetol=0.1:threads=3 \ -oac faac -faacopts br=32 -vf pp=ci,scale -zoom -xy 320 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; H264_150) exec mencoder $RECORDING -ovc x264 -srate 22050 \ -x264encopts bitrate=150:vbv_maxrate=180:vbv_bufsize=300:ratetol=0.1:threads=3 \ -oac mp3lame -lameopts cbr:br=16:q=2:mode=3 -vf pp=ci,scale -zoom -xy 320 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; H264_200_15) exec mencoder $RECORDING -ovc x264 -srate 22050 -ofps 15 \ -x264encopts bitrate=200:vbv_maxrate=250:vbv_bufsize=300:ratetol=0.1:threads=3 \ -oac mp3lame -lameopts cbr:br=16:q=2:mode=3 -vf pp=ci,scale -zoom -xy 320 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; H264_200) exec mencoder $RECORDING -ovc x264 -srate 22050 \ -x264encopts bitrate=200:vbv_maxrate=250:vbv_bufsize=300:ratetol=0.1:threads=3 \ -oac mp3lame -lameopts cbr:br=16:q=2:mode=3 -vf pp=ci,scale -zoom -xy 320 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; H264_250) exec mencoder $RECORDING -ovc x264 -srate 22050 \ -x264encopts bitrate=250:vbv_maxrate=280:vbv_bufsize=300:ratetol=0.1:threads=3 \ -oac mp3lame -lameopts cbr:br=16:q=2:mode=3 -vf pp=ci,scale -zoom -xy 320 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; H264_400) exec mencoder $RECORDING -ovc x264 -srate 22050 \ -x264encopts bitrate=400:vbv_maxrate=450:vbv_bufsize=300:ratetol=0.1:threads=3 \ -oac mp3lame -lameopts cbr:br=16:q=2:mode=3 -vf pp=ci,scale -zoom -xy 320 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; H264_500) exec mencoder $RECORDING -ovc x264 -srate 44100 \ -x264encopts bitrate=500:vbv_maxrate=550:vbv_bufsize=600:ratetol=0.1:threads=3 \ -oac mp3lame -lameopts cbr:br=16:q=2:mode=3 -vf pp=ci,scale -zoom -xy 480 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; H264_600) exec mencoder $RECORDING -ovc x264 -srate 44100 \ -x264encopts bitrate=600:vbv_maxrate=650:vbv_bufsize=600:ratetol=0.1:threads=3 \ -oac mp3lame -lameopts cbr:br=16:q=2:mode=3 -vf pp=ci,scale -zoom -xy 480 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; H264_800) exec mencoder $RECORDING -ovc x264 -srate 22050 \ -x264encopts bitrate=800:vbv_maxrate=850:vbv_bufsize=300:ratetol=0.1:threads=3 \ -oac mp3lame -lameopts cbr:br=16:q=2:mode=3 -vf pp=ci,scale -zoom -xy 320 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; UMTS) exec mencoder $RECORDING -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=150 \ -oac mp3lame -lameopts preset=15:mode=3 -vf scale=320:240 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; HANDY) exec mencoder $RECORDING -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=350 \ -oac mp3lame -lameopts preset=15:mode=3 -vf scale=320:240 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; DSL1000) exec mencoder $RECORDING -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=100 \ -oac mp3lame -lameopts preset=15:mode=3 -vf scale=160:104 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; DSL2000) exec mencoder $RECORDING -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=128 \ -oac mp3lame -lameopts preset=15:mode=3 -vf scale=160:104 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; DSL3000) exec mencoder $RECORDING -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=250 \ -oac mp3lame -lameopts preset=15:mode=3 -vf scale=320:208 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; DSL3500) exec mencoder $RECORDING -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=300 \ -oac mp3lame -lameopts preset=15:mode=3 -vf scale=320:208 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; DSL6000) exec mencoder $RECORDING -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=350 \ -oac mp3lame -lameopts preset=15:mode=3 -vf scale=320:208 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; DSL16000) exec mencoder $RECORDING [21~-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=500 \ -oac mp3lame -lameopts preset=15:mode=3 -vf scale -zoom -xy 480 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; LAN10) exec mencoder $RECORDING -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=4096 \ -oac mp3lame -lameopts preset=standard \ -o $TMP/out.avi -- - &>$TMP/out.log ;; WLAN11) exec mencoder $RECORDING -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=768 \ -oac mp3lame -lameopts preset=standard -vf scale=640:408 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; WLAN54) exec mencoder $RECORDING -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=2048 \ -oac mp3lame -lameopts preset=standard \ -o $TMP/out.avi -- - &>$TMP/out.log ;; IPAQ) exec mencoder $RECORDING -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=350 \ -oac mp3lame -lameopts preset=15:mode=3 -vf scale=320:208 \ -o $TMP/out.avi -- - &>$TMP/out.log ;; COPY) exec mencoder $RECORDING -of mpeg -ovc copy -oac copy -mpegopts format=mpeg \ -o $TMP/out.avi -- - &>$TMP/out.log ;; *) touch $TMP/out.avi ;; esac
externremux.sh via ffmpeg in flv Container
Diese Version der externremux.sh (Quelle: vdr-portal) verwendet ffmpeg direkt und muxt den h264 Video- und MP3 Audiostream in einen FLV Container (abspielbar mit den meisten gängigen Software Playern und auch embedded Flash Player in Websites wie z.B dem JW-Player)
#!/bin/sh # # externremux.sh ### GENERAL CONFIG START ### # Pick one of DSL/WLAN QUALITY="DSL" ### ### GENERAL CONFIG END case "$REMUX_VPID" in ''|0|1) CONTENTTYPE='audio/mpeg';; *) CONTENTTYPE='video/mpeg';; esac QUALITY=${REMUX_PARAM_QUALITY:-$QUALITY} case "$QUALITY" in DSL|dsl) VBR=640K; ABR=64K; VSIZE=hd480;; WLAN|wlan) VBR=3072K; ABR=128K; VSIZE=hd720;; *) error "Unknown quality '$QUALITY'";; esac ABR=${REMUX_PARAM_ABR:-$ABR} VBR=${REMUX_PARAM_VBR:-$VBR} VSIZE=${REMUX_PARAM_VSIZE:-$VSIZE} FPS=${REMUX_PARAM_FPS:-$FPS} if [ "$SERVER_PROTOCOL" = HTTP ]; then echo -ne "Content-type: ${CONTENTTYPE}\r\n" echo -ne '\r\n' # abort after headers [ "$REQUEST_METHOD" = HEAD ] && exit 0 fi ffmpeg -f mpegts -i - \ -filter:v yadif -filter:v scale=${VSIZE} \ -c:v libx264 -maxrate ${VBR} -bufsize 1024K \ -c:a libmp3lame -b:a ${ABR} -ar 44100 -ac 2 -async 50 \ ${FPS:+-r $FPS} \ -f flv pipe:1