Beiträge von Zerphod

    Hallo,


    habe die Optionen in die modules.conf eingebaut. Hat aber leider keine Änderung gebracht.
    Ich werde wohl mal warten was sich auf der ivtv-Seite tut. Da ist ja auch ein Thread mit einem ähnlichen Problem.


    Ich denke auch,daß es ein ivtv-Problem ist, da auch ein 'dd of=/dev/video1 if=/dev/video16' ein LiveBild ohne Ton hervorbringt.


    Bei der ganzen Testerei ist aber eine Sache aufgefallen. Wie kann man eigendlich sehen, mit welchen Optionen/Paramtern ein Modul geladen wurde?


    Gruss,
    Zerphod

    powarman:


    ich habe mal ein paar kleine Tests gemacht.
    Nach einem Update auf ivtv 0.3.7(j) funktioniert auch die zweite PVR fast perfekt.
    LiveTV läuft immer auf der ersten Karte. Wird eine Aufnahme gestartet, wird das LiveBild auf die zweite Karte umgeschaltet. Bild ist ok, leider ist der Ton weg.
    Wird dann noch eine Aufnahme gestartet, wird auch diese Sendung aufgenommen, leider aber ohne Ton.
    Ich kann beide Sendungen auch ansehen, kein Standbild mehr.


    Ich werde gleich mal das neue pvrinput instalieren, dann noch mal testen, und dann auch mal das syslog posten.


    Gruss,
    Zerphod

    Hallo obifrz,


    ich habe folgende Erfahrungen gemacht:


    Ich benutze das pvrinput-Plugin, und habe auch mal eine PVR150MCE in den Rechner gesteckt. IVTV hat beide Karten erkannt. Der VDR startet und alles funktioniert auf der PVR350.
    Wenn eine Aufnahme startet, steht das LiveBild (kein Ton). Die Aufnahem aber wird korrekt durchgeführt. Ich gehe davon aus, das dieses Verhalten i.O. ist.
    Schalte ich nun auf einen anderen Kanal um, zeigt mir das OSD die Informationen von dem neuen Kanal. (steht auch so im message log) Ich sehe aber weiter das Standbild (kein Ton). Ich gehe davon aus, daß der VDR zwei Karten erkannt hat, aber die zweite Karte nicht 'benutzt' wird.


    Ich bin kein Programmierer, und kenne mich (noch) nicht so mit dem Zusammenspiel zwischen VDR<->Plugin<->IVTV aus. Vielleicht muß ich die channels.conf noch anpassen. Vielleicht muß das pvrinput-Plugin (läuft super) noch erweitert werden. Mal sehen...


    Gruss,
    Zerphod

    Hallo,


    da mein VDR (siehe Signatur) jetzt stabil läuft, habe ich mir überlegt, noch eine zweite PVR(150/250) einzubauen.
    Hat schon jemand so eine Konfiguration am laufen?
    Habe im Forum so recht nichts gefunden.


    Bin für jede Info dankbar.


    Gruss,
    Zerphod

    Hallo powarman,


    erstmal vielen Dank für das super Plugin!


    Hab's sogleich installiert, läuft super, hatte mit der vorigen Version leichte Klötzchenbildung beim Umschalten. Das ist jetzt weg.


    Im syslog kommt vom ivtv laufend folgende Meldung:


    Jul 23 15:46:09 localhost kernel: ivtv: ENC Stream 2 OVERFLOW #3: Stealing a Buffer, 1317 currently allocated


    nach dem OVERFLOW kommt #0 - #3.


    Noch 'ne kleine Frage. Ist vielleicht mal eine Unterstützung von mehreren PVR-Karten angedacht?


    Gruss,
    Zerphod

    Hmm...


    Log sieht gut aus. Sollte eigendlich funktionieren.
    Welche VDR Version setzt Du ein?


    Disable (auf '0' stellen) mal alle Einstellungen mit denen der VDR selbst versucht EPG-Daten zu bekommen. Unter Einstellungen->EPG und bei den analogTV Einstellungen. (EPGfrom auf file)
    in der setup.conf sollte dann so etwas stehen:


    <snipp>
    DoubleEpgAction = 0
    DoubleEpgTimeDelta = 10
    EPGBugfixLevel = 2
    EPGScanTimeout = 0
    <snipp>
    analogtv.EPGfrom = 0
    analogtv.EPGprovider = "FF
    analogtv.External = "
    <snipp>


    Zerphod

    jarny:


    Hier ein Auszug aus der 'svdrp.c':


    svdrp: Simple Video Disk Recorder Protocol


    The "Simple Video Disk Recorder Protocol" (SVDRP) was inspired
    by the "Simple Mail Transfer Protocol" (SMTP) and is fully ASCII
    text based. Therefore you can simply 'telnet' to your VDR port
    and interact with the Video Disk Recorder - or write a full featured
    graphical interface that sits on top of an SVDRP connection.



    CHAN [ + | - | <number> | <name> | <id> ]
    Switch channel up, down or to the given channel number, name or id.
    Without option (or after successfully switching to the channel)
    it returns the current channel number and name.


    CLRE
    Clear the entire EPG list.


    DELC <number>
    Delete channel.


    DELR <number>
    Delete the recording with the given number. Before a recording can be
    deleted, an LSTR command must have been executed in order to retrieve"
    the recording numbers. The numbers don't change during subsequent DELR
    commands. CAUTION: THERE IS NO CONFIRMATION PROMPT WHEN DELETING A
    RECORDING - BE SURE YOU KNOW WHAT YOU ARE DOING!


    DELT <number>
    Delete timer.


    GRAB <filename> [ jpeg | pnm [ <quality> [ <sizex> <sizey> ] ] ]
    Grab the current frame and save it to the given file. Images can
    be stored as JPEG (default) or PNM, at the given quality (default
    is 'maximum', only applies to JPEG) and size (default is full screen).


    HELP [ <topic> ]
    The HELP command gives help info.


    HITK [ <key> ]
    Hit the given remote control key. Without option a list of all
    valid key names is given.


    LSTC [ <number> | <name> ]
    List channels. Without option, all channels are listed. Otherwise
    only the given channel is listed. If a name is given, all channels
    containing the given string as part of their name are listed.


    LSTE
    List EPG data.


    LSTR [ <number> ]
    List recordings. Without option, all recordings are listed. Otherwise
    the summary for the given recording is listed.


    LSTT [ <number> ]
    List timers. Without option, all timers are listed. Otherwise
    only the given timer is listed.


    MESG [ <message> ]
    Displays the given message on the OSD. If message is omitted, the
    currently pending message (if any) will be returned. The message
    will be displayed for a few seconds as soon as the OSD has become
    idle. If a new MESG command is entered while the previous message
    has not yet been displayed, the old message will be overwritten.


    MODC <number> <settings>
    Modify a channel. Settings must be in the same format as returned
    by the LSTC command.


    MODT <number> on | off | <settings>
    Modify a timer. Settings must be in the same format as returned
    by the LSTT command. The special keywords 'on' and 'off' can be
    used to easily activate or deactivate a timer.


    MOVC <number> <to>
    Move a channel to a new position.


    MOVT <number> <to>
    Move a timer to a new position.


    NEWC <settings>
    Create a new channel. Settings must be in the same format as returned
    by the LSTC command.",


    NEWT <settings>
    Create a new timer. Settings must be in the same format as returned
    by the LSTT command. It is an error if a timer with the same channel,
    day, start and stop time already exists.


    NEXT [ abs | rel ]
    Show the next timer event. If no option is given, the output will be
    in human readable form. With option 'abs' the absolute time of the next
    event will be given as the number of seconds since the epoch (time_t
    format), while with option 'rel' the relative time will be given as the
    number of seconds from now until the event. If the absolute time given
    is smaller than the current time, or if the relative time is less than
    zero, this means that the timer is currently recording and has started
    at the given time. The first value in the resulting line is the number
    of the timer.


    PUTE
    Put data into the EPG list. The data entered has to strictly follow the
    format defined in vdr(5) for the 'epg.data' file. A '.' on a line
    by itself terminates the input and starts processing of the data (all
    entered data is buffered until the terminating '.' is seen).


    STAT disk
    Return information about disk usage (total, free, percent).


    UPDT <settings>
    Updates a timer. Settings must be in the same format as returned
    by the LSTT command. If a timer with the same channel, day, start
    and stop time does not yet exists, it will be created.


    VOLU [ <number> | + | - | mute ]
    Set the audio volume to the given number (which is limited to the range
    0...255). If the special options '+' or '-' are given, the volume will
    be turned up or down, respectively. The option 'mute' will toggle the
    audio muting. If no option is given, the current audio volume level will
    be returned.


    QUIT
    Exit vdr (SVDRP).
    You can also hit Ctrl-D to exit.



    SVDRP Reply Codes:


    214 Help message
    215 EPG data record
    220 VDR service ready
    221 VDR service closing transmission channel
    250 Requested VDR action okay, completed
    354 Start sending EPG data
    451 Requested action aborted: local error in processing
    500 Syntax error, command unrecognized
    501 Syntax error in parameters or arguments
    502 Command not implemented
    504 Command parameter not implemented
    550 Requested action not taken
    554 Transaction failed

    ibooduoo:


    Ist mir auch aufgefallen, man sollte (muss) in der '/etc/vdr/svdrphosts.conf' sein locales Netzwerk eintragen. Muss für den VDRADMIN oder andere streaming-clients sowieso gemacht werden. Dann kann man auch die IP des VDR eingetragen lassen.


    Bis die Tage,
    Mathias

    ibooduoo:


    Hmmm, zuerst muss der VDR natürlich EPG-Daten haben/anzeigen. Dann muss der User, der das script aufruft nach '/video' und in das Verzeichnis schreiben dürfen von wo das Script aufgerufen wird.(für die epg.tmp). Ist die epg.tmp leer/nicht da?


    Bis die Tage,
    Mathias

    Natürlich!


    Also, mit dem Script 'savepg' kann man epg-Daten aus dem Vdr auslesen und in '/video/epg.data' schreiben:


    #! /usr/bin/perl


    $verz = "/var/log";
    $epg = "/video";


    sub open_logging
    {
    open (LOGGING, ">>$verz/savepg.log");
    }


    sub close_logging
    {
    close LOGGING;
    }


    # Debuglevel -> 1=kein Debug / 6=alles
    sub printlog
    {
    my $debuglevel = 6;
    my ($text,$dbl) = @_;
    my $date = localtime();
    &open_logging;
    printf LOGGING "$date: $text" if ($debuglevel > $dbl);
    &close_logging;
    }



    printlog "SAVEPG: EPG-Daten speichern\n",1;


    # Hauptprogramm
    # EPG-Daten aus VDR lesen
    $Text="/root/svdrpsend.pl -d 192.168.65.130 LSTE > epg.tmp";
    system $Text;
    # epg.tmp einlesen
    &Lesepgtmp;
    &Loeschepg;
    foreach $epgzeile (@epgdatei)
    {
    if ($epgzeile =~ /\A\d\d\d-/)
    {
    $epgzeile = $';
    # printlog "SAVEPG: EPG_Zeile-> $epgzeile\n".3;
    &Schreibepg;
    }
    }
    printlog "SAVEPG: fertig!\n",1;


    sub Lesepgtmp
    {
    open (EINGABE, "<./epg.tmp");
    @epgdatei = <EINGABE>;
    close (EINGABE);
    }


    sub Schreibepg
    {
    open (AUSGABE, ">>$epg/epg.data");
    print AUSGABE $epgzeile;
    close (AUSGABE);
    }


    sub Loeschepg
    {
    open (AUSGABE, ">$epg/epg.data");
    print AUSGABE "";
    close (AUSGABE);
    }



    Mit dem Script 'putepg' kann man die EPG-Daten aus '/video/epg.data' in den VDR übertragen.


    #!/usr/bin/perl


    # warten bis der VDR hochgefahren ist
    sleep (20);


    use IO::Socket;
    use Getopt::Std;
    use Date::Manip;
    use HTML::Entities;
    use bytes; # no unicode


    push (@INC, "/etc/vdr/tvmovie2vdr");
    require ("config.pl");
    ### require ("channels.pl");


    push (@INC, "/usr/share/vdr-addon-tvmovie2vdr/inc");
    require ("helperfunc.pl");


    $verz = "/var/log";
    $epg = "/video";


    sub open_logging
    {
    open (LOGGING, ">>$verz/putepg.log");
    }


    sub close_logging
    {
    close LOGGING;
    }


    # Debuglevel -> 1=kein Debug / 6=alles
    sub printlog
    {
    my $debuglevel = 6;
    my ($text,$dbl) = @_;
    my $date = localtime();
    &open_logging;
    printf LOGGING "$date: $text" if ($debuglevel > $dbl);
    &close_logging;
    }


    printlog "PUTEPG: EPG-Daten in den Vdr eintragen\n",1;


    our ($sim,$verbose) = 0;


    $verbose = 1 if $opt_v;
    $sim = 1 if $opt_s;
    $Dest = $opt_d || "localhost";
    $Port = $opt_p || 2001;
    $Timeout = $opt_t || 300; # max. seconds to wait for response


    if ($cleanupoldfiles)
    {
    print "cleanup old files ..\n";
    cleanup();
    }


    $SIG{'INT'} = \&SIGhandler;
    our $SVDRP = SVDRP->new($Dest,$Port,$verbose,$sim);


    our $EXIT = false;


    if ($clearEPG eq 1)
    {
    print "clearing EPG\n";
    my($result) = $SVDRP->SendCMD("clre");
    die "Fehler beim Löschen EPG-Daten: $result" if ($sim == 0 && !$result =~ /EPG data cleared/);
    }


    # epg.tmp einlesen
    &Lesepg;


    foreach $epgzeile (@epgdatei)
    {
    chomp ($epgzeile);
    if ($epgzeile =~ /\AC C-\d-\d\d\d-\d\d/)
    {
    $sender = $';
    $epgzeile = substr($epgzeile,0,12);
    printlog "PUTEPG: EPG-Zeile für Sender $sender ist -> $epgzeile\n",4;
    my($result) = $SVDRP->SendCMD("PUTE");
    printlog "PUTEPG: PUTE gesendet Result=$result \n",1;
    $SVDRP->command("$epgzeile");
    printlog "PUTEPG: EPG-Zeile gesendet-> $epgzeile\n",4;
    }
    if ($epgzeile =~ /\AC C-\d-\d\d-\d\d/)
    {
    $sender = $';
    $epgzeile = substr($epgzeile,0,11);
    printlog "PUTEPG: EPG-Zeile für Sender $sender ist -> $epgzeile\n",4;
    my($result) = $SVDRP->SendCMD("PUTE");
    printlog "PUTEPG: PUTE gesendet Result=$result \n",1;
    $SVDRP->command("$epgzeile");
    printlog "PUTEPG: EPG-Zeile gesendet-> $epgzeile\n",4;
    }
    if ($epgzeile =~ /\AE /)
    {
    $SVDRP->command("$epgzeile");
    printlog "PUTEPG: EPG-Zeile gesendet-> $epgzeile\n",4;
    }
    if ($epgzeile =~ /\AT /)
    {
    $SVDRP->command("$epgzeile");
    printlog "PUTEPG: EPG-Zeile gesendet-> $epgzeile\n",4;
    }
    if ($epgzeile =~ /\AS /)
    {
    $SVDRP->command("$epgzeile");
    printlog "PUTEPG: EPG-Zeile gesendet-> $epgzeile\n",4;
    }
    if ($epgzeile =~ /\AD /)
    {
    $SVDRP->command("$epgzeile");
    printlog "PUTEPG: EPG-Zeile gesendet-> $epgzeile\n",4;
    }
    if ($epgzeile =~ /\Ac\z/)
    {
    $SVDRP->command("$epgzeile");
    printlog "PUTEPG: EPG-Zeile gesendet-> $epgzeile\n",4;
    my($result) = $SVDRP->SendCMD(".");
    printlog "PUTEPG: . gesendet!! Result=$result\n",1;
    printlog "PUTEPG: Kanal abgeschlossen!!!\n",1;
    }
    if ($epgzeile =~ /\Ae\z/)
    {
    $SVDRP->command("$epgzeile");
    printlog "PUTEPG: EPG-Zeile gesendet-> $epgzeile\n",4;
    }
    }


    my($result) = $SVDRP->SendCMD("QUIT");
    printlog "PUTEPG: QUIT gesendet!! Result=$result\n",1;
    $SVDRP->close;
    printlog "PUTEPG: fertig!!!\n",1;
    exit;


    sub Error
    {
    print STDERR "Fehler: @_\n";
    close(SOCK);
    exit 0;
    }


    sub Lesepg
    {
    open (EINGABE, "<$epg/epg.data");
    @epgdatei = <EINGABE>;
    close (EINGABE);
    }


    Das zweite Script ist, wie man sieht, aus dem tvm2vdr.pl entstanden, und sind beide noch "ausbaufähig" (Fehlerbehandlung, usw).


    Bis die Tage,
    Zerphod