[HowTo] Zweiten Tuner für Livestream verwenden

Status
Für weitere Antworten geschlossen.

tomas123

Benutzer
Mitglied seit
06. Mrz 2012
Beiträge
99
Punkte für Reaktionen
0
Punkte
0
ich habe einen Hauppauge Nova-TD Stick (52009)
Modell 1172 nach dieser Liste http://www.synology.com/support/faq_show.php?q_id=532&lang=deu

man kann den zweiten Tuner für einen zweiten Livestream verwenden, so dass die Funktionen der Syno-Videostation (Timer-Aufnahme etc.) nicht behindert werden

Einzelheiten zu den Shell-Kommandos siehe hier: http://www.synology-forum.de/showthread.html?33254-DVB-T-Sender-in-der-Shell-umschalten

zuerst schaut man sich die Senderliste (mit Portnummer) an
Rich (BBCode):
> cut -d: -f1,13 /usr/syno/etc/packages/VideoStation/channels.conf
Das Erste:14
ZDF:514
3sat:515

...

und schaltet den 2. Receiver ein (-a 1)
Rich (BBCode):
> /var/packages/VideoStation/target/bin/tune -a 1 "ZDF" &
channel:ZDF
tuning to 570000000 Hz
  VIDEO     : PID 0x0221 (0x0002)
  AUDIO     : PID 0x0222
  AUDIO     : PID 0x0223
start vlc, szStreamInput=stream/ts:///dev/dvb/adapter1/dvr0, szStreamOutput=#std{access=http,dst=127.0.0.126:514,mux=ts}

dieser schickt jetzt das Livebild an Port 514 (s. Tabelle oben)
diesen Stream kann man jetzt von Port 514 ins LAN (hier Portnummer 9123) weitergeben
Rich (BBCode):
/var/packages/VideoStation/target/bin/vlc "http://127.0.0.126:514" --sout "#std{access=http,mux=ts,dst=:9123}"
Portnummer 9123 verhindert Überschneidungen mit der Videostation. Diese streamt auf Port 9006.

jetzt kann der Livestream im VLC oder IPAD (Goodplayer etc) mit
Rich (BBCode):
http://MeineSynoIP:9123
angesehen werden

Bei dieser Variante bleibt der (2.) Livestream stehen bis vlc in der Shell beendet wird.

Wer den 40 Sekunden Timeout-Timer von cvlc verwenden will muss auf Port 9006 streamen, weil ansonsten keine Verbindung gezählt wird und somit nach 40 Sekunden die Kombination cvlv+vlc beendet wird
Rich (BBCode):
/var/packages/VideoStation/target/bin/cvlc 514 -v "#std{access=http,mux=ts,dst=:9006}"
das überschneidet sich mit dem Port von der Videostation
(d.h. nicht empfohlen)


Hinweise:
  1. um die Prozesse zu pseudo-daemonisieren empfiehlt sich
    > ipkg install screen
  2. Prozess tune und vlc muss beendet werden, bevor ein anderer Sender eingestellt werden kann ( ps / kill )
  3. Da /var/packages/VideoStation/target/bin/tune ohne Rückfrage auf einen localhost Port streamt, kommt es zu Überschneidungen, wenn man den ersten und zweiten Tuner auf den gleichen Sender einstellt.
  4. vielleicht schreibt jemand ein einfaches php script für die Senderauswahl des 2. Tuners
  5. wer keinen Dual-Tuner hat kann evtl. auch einen 2. DVB-Stick an die Syno stecken (ungetestet)
 
Zuletzt bearbeitet:

tomas123

Benutzer
Mitglied seit
06. Mrz 2012
Beiträge
99
Punkte für Reaktionen
0
Punkte
0
Webseite um die Sender des 2. Receivers umzuschalten

ich scheine wohl der einzige mit einem 2. Tuner zu sein ;-)
(Tip: es könnte auch mit einem 2. DVB-T-Stick gehen)

ich habe mal einen Code drumherum gebastelt um bequem die Sender des 2. Receivers umzuschalten

Das ganze besteht aus den Teilen
  1. auf der Webseite kann man den Sender auswählen
  2. ein Endlos-Shellscript mit Root-Rechten schaltet die Sender um
  3. im VLC (PC) / Aceplayer (IOS) den LiveStream des 2. Receivers ansehen

wie oben erwähnt, beeinflusst der nachfolgende Code nicht die Videostation auf dem 1. Receiver (Timer-Programmierung etc.)

einziges Probelm: auf beiden Receivern den gleichen Sender zu Streamen scheitert, da die interne Portnummer fest am Sendernamen hängt (Port-Überschneidung)

fangen wir an - Vorbereitung in der Shell
login als root
Rich (BBCode):
cd /volume1/web
mkdir dvbt
chmod 777 dvbt
cd dvbt
cp /usr/syno/etc/packages/VideoStation/channels.conf ./
chmod 666 channels.conf 
touch dvbt.php
touch dvbt.sh 
chmod 777 dvbt*
Hinweis: der Ordner benötigt 777 damit das php-Script später eine tmp-Datei ablegen kann

jetzt füllt die Datei dvbt.php mit
Rich (BBCode):
<?php 

echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>DVB-T 2. Receiver</title>
</head>';

if(isset($_POST['action'])) { 
    if(isset($_POST['Sender']))
    {
        //es wurde ein Sender ausgewählt 
        $Sender=$_POST['Sender']; 
        echo "<head> <meta http-equiv='refresh' content='5'> </head>
        <body>";
           $cmd_device = "echo \"".$Sender."\"> Sender.txt";
           $cmd_yes = exec($cmd_device);
           if ( $Sender == 0 )
           {
               echo "Schalte 2. DVB-T Tuner aus";     
           } else {
               $cmd_device="awk -F: '$13 == ".$Sender." {print $1}' channels.conf";
               $Sender_Name = exec($cmd_device);
               echo "Schalte um auf <table border='1' rules='all'><tr><td>".$Sender_Name."</td></tr></table>";     
                 
           }
           echo "<br>bitte 5 Sekunden warten...
        </body>";
    } else {
      echo "error - keine Auswahl gefunden";
    }
    
} else {
    // erster Aufruf = leere Seite
    echo "<body>";
    echo "<FORM name='menueForm' action='' method='POST'>\n";
    echo "<br>  <input type='submit' name='action' value='Sender auswaehlen' />";
    
    $cmd_device = "cat Sender.txt";
    $aktuell_sender = exec($cmd_device);

    echo " <table border='1' rules='all'>
    <tr>
       <th></th> <th>Sender</th> <th>Nummmer</th>
    </tr>
    <tr>
       <td> <INPUT type='radio' name='Sender' value='0'";
          if ($aktuell_sender == "0") echo "checked";
       echo "> </td>
       <td>  TV Stream aussschalten  </td>
       <td>    </td>
    </tr>\n";
        
    // datei mit senderliste öffnen
    $fp = @fopen("channels.conf", "r") or die ("Kann Datei nicht lesen.");
    // datei zeilenweise auslesen  
    while($line = fgets($fp, 1024)){
        //Zeilenumbruch entfernen
        $trimmed = trim($line, "\n\r");
        $teile = explode(":", $trimmed);
        echo" 
        <tr>
           <td><INPUT type='radio' name='Sender' value='".$teile[12]."' ";
                 if ($aktuell_sender == $teile[12]) echo "checked";
           echo "> </td>
           <td>  ".$teile[0]."  </td>
           <td>  ".$teile[12]."  </td>
        </tr>\n";
    }
    // datei schliessen
    fclose($fp);
    
    echo "
    </table>";
    ////////////////////////////        

    echo "
    </FORM>
    </body>";
}
echo "</html>\n";

?>

und dvbt.sh mit
Rich (BBCode):
#!/bin/sh
#

sender="0"
echo $sender > Sender.txt
SLEEP_PID_TUNE=fafjhgfdstzr
SLEEP_PID_VLC=fafjhgfdstzr
while [ 1 ]
 do 
  sender_cmd=$(cat Sender.txt)
  if [[ "$sender" != "$sender_cmd" ]]
  then 
  
    if [[ "$SLEEP_PID_VLC"a != "0a" ]]
    then 
       #check and kill vlc
       check=$(ps | grep $SLEEP_PID_VLC | grep -v "grep") 
       #use dummy a for empty string
       if [[ "$check"a != "a" ]] 
       then
          echo kill $SLEEP_PID_VLC
          kill $SLEEP_PID_VLC
       fi 
       # sleep 1
    fi

    if [[ "$SLEEP_PID_TUNE"a != "0a" ]]
    then 
       #check and kill vlc
       check=$(ps | grep $SLEEP_PID_TUNE | grep -v "grep")       
       if [[ "$check"a != "a" ]] 
       then
          echo kill $SLEEP_PID_TUNE 
          kill $SLEEP_PID_TUNE
       fi 
       #sleep 1
    fi
    sleep 1
    sender=$sender_cmd
    if [[ "$sender_cmd" != "0" ]]
    then
        # search id - workaround für sonderzeichen   
        dummy="awk -F: '\$13 == $sender_cmd {print \$1}' channels.conf"
        s_name=$(eval $dummy)
        if [ "$s_name" != "" ] 
        then
            echo "Schalte um auf $s_name $sender_cmd"
            /var/packages/VideoStation/target/bin/tune "$s_name" &
            SLEEP_PID_TUNE=$(echo $!)
            echo $SLEEP_PID_TUNE
            
            #warte bis tuner aktiv
            sleep 4
            /var/packages/VideoStation/target/bin/cvlc $sender_cmd -v "#std{access=http,mux=ts,dst=:9123}" -t 7000  &
            SLEEP_PID_VLC=$(echo $!)
            echo $SLEEP_PID_VLC
        fi
    fi
  fi  
  sleep 1
 done

zum Testen reicht es die Shell offen zu lassen und das ShellScript laufen zu lassen
Rich (BBCode):
cd /volume1/web/dvbt
./dvbt.sh

später am besten mit "ipkg install screen" das Script dvbt.sh in einer Edlosschleife laufen lassen
wenn alles ok ist, kann man dan ein Start/Stop-Script in /opt/etc/init.d/S99dvbt.sh bauen

Webseite aufrufen und Sender auswählen
http://meine_syno/dvbt/dvbt.php
die Webseite speichert den gewählten Sender in die Datei
/volume1/web/dvbt/Sender.txt

das ShellScript beobachtet die Datei Sender.txt und schaltet wie im obigen Post den Sender um
das ganze Umschalten dauert ca. 5 bis 10 Sekunden

jetzt kann der Livestream im VLC (PC) oder auf dem IPAD (Goodplayer/Aceplayer etc) oder Android-Tablett mit
Rich (BBCode):
http://MeineSynoIP:9123
angesehen werden

DSM 4.1
Dyno DS212+
 
Zuletzt bearbeitet:

tomas123

Benutzer
Mitglied seit
06. Mrz 2012
Beiträge
99
Punkte für Reaktionen
0
Punkte
0
im Script ist ein kleiner Fehler (es läuft auf dem ersten Tuner)
es muss für die Ansteuerung des 2. Tuner heißen
Rich (BBCode):
 /var/packages/VideoStation/target/bin/tune -a 1 "$s_name" &
 

seshigh

Benutzer
Mitglied seit
08. Feb 2010
Beiträge
1
Punkte für Reaktionen
0
Punkte
0
Hallo tomas123,

ich habe deinen Thread mit Freude aufgenommen. Deine Anleitung funktioniert gut. Sie zeigt allerdings die auch
die ganze Schwäche des Systems der Videostation. Klar es funktioniert, aber da darf kein Fehler auftreten.

Hier erst mal meine Erfahrungen:
Synology Nas DS 209+II (PPC)
Erster Stick Hauppauge Win TV Nova TD (Twin Tuner)
Dieser Stick läuft leider nicht sehr stabil. Deshalb habe ich mir zwei MSI Digivox mini2 (v3.0) besorgt.
Diese laufen stabiler und steigen auf Treiberebene weniger oft aus.

Die Software kann den Stick immer wieder starten, solange der Treiber noch funktioniert. Dazu reicht es
das Shell Programm wieder neu zu starten.

Was mir aufgefallen ist. In der ganzen Kette dürfen keine Fehler im Datenstrom auftauchen. Z.B. mal das Antennenkabel abziehen.
Anschließend kann man die Software neu starten, oder wenn es mies läuft, wieder in den Keller gehen und den Stick ziehen.
Ebenso verhält es sich bei schlechtem Signal.

Ich finde es eine tolle Sache, nur im Augenblick ist es nur eine Spielerei. Da muß noch einiges gemacht werden bis da ein Produkt daraus wird,
auf das man sich verlassen kann. Die Treiber sind nicht stabil und die ganze Weiterleitung der Streams ist auch nicht stabil. Meine Hoffnung
liegt bei DVBLogic. Da soll es auch mit DVB-S funktionieren, wobei es da noch in den Sternen steht ob es da überhaupt eine Version für PPC
geben wird. Falls ich es noch richtig im Kopf habe, ist die neue DS 213+ auch ein PPC. ?????

Die Datei channels.conf habe ich editiert. Ich habe für manche Sender zwei oder drei Einträge. Diese sind auf anderen Frequenzen und sehr schlecht
empfangbar. ZDF angewählt, dann ging nicht mehr. Das Programm tune nimmt den ersten Eintrag aus der Liste. Schwacher Sender -> tot. Hab alle die
Einträge von entfernten Standorten rausgeschmissen, und siehe da, es wird brauchbar.

Vielleicht kann der Eine oder Andere damit etwas anfangen.

Bis dann
Seshigh
 

tomas123

Benutzer
Mitglied seit
06. Mrz 2012
Beiträge
99
Punkte für Reaktionen
0
Punkte
0
2. Tuner mit Tvheadend ansprechen

ist ja irre, dass sich mal jemand für meine Spielereien interessiert

zu Deinen Hinweisen:
Diese Stabilität der Videostation-DVB-T-Kernel-Treiber ist so eine Sache. Im täglichen Gebrauch läuft es eigentlich recht gut. Aber alle paar Tage kann schon mal ein Neustart des Videostation Dienstes erforderlich sein.
In der Zwischenzeit habe ich oben veröffentlichte Scripte verworfen und habe den 2. Tuner mit Tvheadend angesprochen.
Das macht richtig Spaß, da man bei Tvheadend den Kanal über die Streaming-URL anwählt. Ein Lesezeichen für den Sender in der Player-App und es entfällt das nervige Sender Umschalten der Videostation

kurze Anleitung

- Paketmanager ergänze Quelle http://packages.synocommunity.com
- Install Tvheadend

jetzt nicht wie empfohlen alle DVB-Devices für Tvheadend schreibbar machen
Rich (BBCode):
find /dev/dvb -type c -exec chmod 666 {} \;

sondern nur die Rechte für den 2. Tuner ändern, bei mir sieht das jetzt so aus
Rich (BBCode):
> find /dev/dvb/ -type c -exec ls -al {} \;
crw-r--r-- 1 root root 212, 7 Nov 22 21:55 /dev/dvb/adapter0/net0
crw-r--r-- 1 root root 212, 3 Nov 22 21:55 /dev/dvb/adapter0/frontend0
crw-r--r-- 1 root root 212, 4 Nov 22 21:55 /dev/dvb/adapter0/demux0
crw-r--r-- 1 root root 212, 5 Nov 22 21:55 /dev/dvb/adapter0/dvr0

crw-rw-rw- 1 root root 212, 71 Nov 22 21:55 /dev/dvb/adapter1/net0
crw-rw-rw- 1 root root 212, 67 Nov 22 21:55 /dev/dvb/adapter1/frontend0
crw-rw-rw- 1 root root 212, 68 Nov 22 21:55 /dev/dvb/adapter1/demux0
crw-rw-rw- 1 root root 212, 69 Nov 22 21:55 /dev/dvb/adapter1/dvr0

der Vorteil besteht darin, dass jetzt die DVB-T-Videostation und Tvheadend parallel laufen.
Jeder mit seinem eigenen Tuner.

jetzt noch den Dienst Tvheadend stop / start
und fertig

durch die o.g. Rechte-Vergabe ist jetzt unter TVHeadend/Configuration nur der 2. Tuner sichtbar
Rich (BBCode):
Device path:  /dev/dvb/adapter1
Device name: DiBcom 7000PC

das läuft bei mir mit Tvheadend auf dem 2. Tuner rock-stable !!

Offensichtlich liegt das Stabiltätsproblem nicht bei den Kernel-Treibern sondern bei der Synology-Portierung von tzap mit dieser blödsinnigen Eimerkette "jeder Sender seinem eigenem Port".
siehe meinen Hinweis zum 3sat-Bug: http://www.synology-forum.de/showthread.html?33967-Ursache-f%FCr-3sat-Fehler-der-Videostation
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat