Posts by peterh

    Um DVD abzuspielen verwende ich das dvd plugin. Der Rechner steht aber nicht im selben Raum, weshalb das Wechseln der DVDs sehr umständlich ist. Mit folgender Lösung werden die DVDs, in meinem Laptop eingelegt, am VDR Rechner abgespielt.


    Diese Anleitung ist für Debian/Ubuntu kann aber für andere Distris angepasst werden.


    Am Laptop:


    apt-get install nbd-server


    Bei eingelegter DVD kann dieser mittels "nbd-server 2000 /dev/hdc -r" gestartet werden (/dev/hdc ist bei mir das DVD Device).


    Ein Wechseln der DVDs ist danach ohne den Dienst zu beenden jederzeit möglich.


    Beendet wird der Dienst durch ein "killall nbd-server"


    Um nicht das ganze jedes mal auf der Konsole einzutippen habe am Desktop
    zwei Verknüpfungen angelegt.



    Am VDR-Rechner:


    apt-get install nbd-client


    zu /etc/modules "nbd" hinzufügen (bzw. modprobe nbd zum testen)



    Das Plugin dvd ist mit dem File "dvd-remote-0.1.diff" zu patchen.


    cd dvd
    patch -p1<dvd-remote-0.1.diff


    Vor und nach jedem Zugriff auf das DVD-Device wird damit ein Shellscript gestartet, das mittels "nbd-client" das DVD-Device von meinem Laptop über das Netzwerk lokal dem VDR-Rechner als "/dev/nbd0" zur Verfügung stellt.


    Pluginstartoptionen für den VDR:


    vdr -u vdr -P'dvd -C /dev/nbd0 -c /home/vdr/dvdmount.sh'


    Bei mir läuft VDR als user "vdr". Um Kommandos ausführen zu können, die root rechte benötigen verwende ich sudo:


    /etc/sudoers:
    vdr ALL=(ALL) NOPASSWD: /sbin/shutdown, /sbin/nbd-client


    have fun
    Peter

    Ziel: Streaming über NUR 256 KBits (ADSL upload) mittels mplayer -vo xv http://IP:3000/Extern/1


    mein /root/externremux.sh:


    #!/bin/bash
    rm -f /tmp/out.avi
    /usr/bin/mkfifo /tmp/out.avi
    cat /tmp/out.avi &
    /usr/bin/mencoder -oac mp3lame -lameopts cbr:br=48 -vf scale=0:0:1:0:0.33:0.33:qpal -ovc xvid -xvidencopts bitrate=128 -quiet -o /tmp/out.avi -- - &>/tmp/out.log


    ?? hat da wer eine Lösung ohne fifo ??


    Mit folgenden Patch für streamdev/remux/extern.c hat das streaming dann bei mir funktioniert:


    ---------------------------------------------------- cut ----------------------------------------------------
    --- extern.c_orig 2005-12-08 11:37:10.000000000 +0100
    +++ extern.c 2005-12-08 11:38:34.000000000 +0100
    @@ -3,6 +3,7 @@
    #include <vdr/tools.h>
    #include <sys/types.h>
    #include <signal.h>
    +#include <wait.h>


    class cTSExt: public cThread {
    private:
    @@ -57,7 +58,7 @@
    for (int i = STDERR_FILENO + 1; i < MaxPossibleFileDescriptors; i++)
    close(i); //close all dup'ed filedescriptors


    - printf("starting externremux.sh\n");
    +// printf("starting externremux.sh\n");
    execl("/bin/sh", "sh", "-c", "/root/externremux.sh", NULL);
    printf("failed externremux.sh\n");
    _exit(-1);
    @@ -77,6 +78,7 @@
    close(m_Outpipe);
    close(m_Inpipe);
    kill(m_Process, SIGTERM);
    + waitpid(m_Process, 0, 0);
    }


    void cTSExt::Action(void)
    ---------------------------------------------------- cut ----------------------------------------------------


    das Problem war dass die prinf Ausgabe in den stream geschrieben wurde und somit der
    avi header von mplayer nicht erkannt wurde, den mplayer aber für mpeg4 anscheinend benötigt


    waitpid verhindert zombie's


    cu Peter

    VDR crasht beim svdrp GRAB, da DVB 1.1.1 nicht mehr "DVB Board" als Name zurückgibt und der Patch dann irtümlich zweimal ein fclose(f) macht:


    siehe dvbdevice.c / cDvbDevice::GrabImage()


    if (ofs == -1) { // firsttime
    while (1) {
    snprintf(buffer, sizeof buffer, "/proc/video/dev/video%d", ++ofs);


    if ((f = fopen(buffer, "r")) == (FILE *)NULL) { // does not exist?
    ofs = 0;
    break;
    }


    if (fgets(buffer, sizeof buffer, f)) {
    if (strstr(buffer, "DVB Board")) // found the _first_ DVB card
    break;
    }
    else {
    ofs = 0;
    break;
    }
    fclose(f);
    }
    - fclose(f);
    + if (f) fclose(f);


    cu Peter