Streaming von DVB Radio

DVB Radio Live Webstreaming mit RDS und EPG Informationen

Hat man sich zuhause Squeezebox Mediaplayer aufgebaut und einen Logitechmediaserver im Haus kommt auch der Wunsch auf, damit Radio empfangen zu können. Problemlos kann man verschiedene Webstreams einrichten, aber eigentlich kommen auch über Satellit und im Kabelfernsehen etliche Radioprogramme. Diese DVB Datenströme haben (technisch) eine hohe Qualität und es skaliert sehr gut. Das bedeutet, daß auch zu "Internet-Stoßzeiten" der unterbrechungsfreie Empfang sichergestellt ist.

Empfang von MPEG-Transport Datenströmen

Radioprogramme bei DVB-S und DVB-C werden als MPEG Transportströme übertragen.

[Ansicht des Players] [Ansicht des Players]
DVB Stream als (Shoutcast kompatibler) Datenstrom empfangen. Darstellung auf dem Player, aktuell läuft SWR1 BW "Der Nachmittag". Auf dem anderen Player ist die RDS Option aktiv und somit wird der aktuelle Titel eingeblendet.

Mit MPEG Transportströmen kommt die Squeezebox und die meisten Internet- und Webradios allerdings nicht zurecht und demzufolge ist eine Konvertierung erforderlich. Mit dieser Konvertierung kann man DVB-S und DVB-C Radioprogramme ganz normal wie einen normalen Webstream mit einer Squeezebox oder einem beliebigen Streaming Client empfangen.

Da man für die Nutzung einer TV Karte eine spezialisierte Applikation braucht verwende ich für den eigentlichen Empfang tvheadend. VDR geht auch, ich komme mit dem Konzept von tvheadend aber besser klar.

Um die Streams mit einem Webradio oder der Squeezebox anhören zu können muß man den MPEG Transportstrom in etwas konvertieren was das Webradio oder die Squeezebox versteht. Hierzu verwende ich die von mir geschriebene Software ts2shout. Diese konvertiert einen MPEG Transportstrom in einen Shoutcast- oder, alternativ, einen nativen MPEG Audiodatenstrom.

Fürs Streaming der Radioprogramme aus dem Kabel oder Satellit verwende ich in tvheadend das "Stream profile" "pass" welches schon als Standard vorbereitet ist.

Hinweise zu "AAC"-LATM Radio

Satellit

ts2shout kommt auch mit den neuen AAC-LATM ARD Radiotranspondern 10891Mhz und 11053 MHz auf Astra 19.2E klar. Damit es mit den original Squeezebox-Radios und den Raspberry-PI-Playern funktioniert bitte die AAC-Hinweise am Seitenende beachten. Ich habe RDS auch für den neuen Transponder implementiert. Damit die Daten auch ausgeliefert werden braucht man den aktuellen Entwicklungsbranch von tvheadend. Dann funktioniert es sofort für SWR, WDR, SR und HR. RBB, NDR, MDR, Radio Bremen und der BR verwenden in den AAC Datenstrom eingebettetes RDS. Hierzu habe ich Anpassungen an libavcodec/libavutil von ffmpeg vorgenommen und in ts2shout eingebunden. Es funktioniert gut, um das in ts2shout zu aktivieren muß allerdings manuell in den compile Vorgang eingegriffen werden. Die Anpassungen an ffmpeg müssen noch upstream eingebunden werden.

Kabel

Bei Vodafone wird seit 16.11. der AAC-LATM Codec ebenso für die ARD Radioprogramme vorausgesetzt. ts2shout sollte damit ebenso klarkommen wie beim Direktempfang vom Satelliten.

ts2shout

Die Konvertierung erledigt apache2 zusammen mit einem CGI- und Filterprogramm, welches ich hier abgelegt habe (Aktuelle Version ist v0.99, Stand Oktober 2021). Ab Version v0.95 sind RDS Daten auch in einem eigenen MPEG-TS Stream möglich (wird für den neuen ARD Transponder mit AAC Audio gebraucht, zu den unterstützten ARD Anstalten, siehe oben). Version v0.99 unterstützt auch im AAC Strom eingebettetes RDS, die erfordert aktuell aber eine spezielle ffmpeg Version von mir (siehe mein FFmpeg@Github) und etwas Handarbeit beim bauen von Library und ts2shout.

ts2shout ist absichtlich minimalistisch, aber autokonfigurierend. Im MPEG Transportstrom wird nach einem passenden Audio-MPEG Kanal gesucht und dieser und die EPG Information (oder RDS Radiotext - RDS = Radio Data System) über die aktuelle Sendung extrahiert. Dieser wird ins Shoutcast Format konvertiert (ohne Parameter gestartet) bzw. in einen nackten mpeg Audiodatenstrom (mit Parameter noshout aufgerufen). Die CRC Prüfungen über die MPEG Controlframes und die RDS Daten werden gemacht. Einen "nackten" mpeg Audiodatenstrom kann man auch mit tvheadend direkt erzeugen, indem man das entsprechende Transcoding modul verwendet. ts2shout stellt darüber hinaus sowohl MPEG EIT als auch RDS Daten breit.

Experimentell habe ich die DSM-CC Daten von HBBTV ausprobiert, diese enthalten aber keine interessanten dynamischen Bilddaten, sondern nur Senderlogos und Daten die man überwiegend auch aus dem EPG beziehen kann.

ts2shout ... als filter

ts2shout wird defaultmässig nach /usr/local/bin installiert. Es handelt sich um eine "Dual-Use" Applikation. Einerseits kann man diese regulär auf der Kommandozeile als "klassischen" Unix Filter verwenden, d.h. auf stdin (Standardeingabe) wird ein MPEG-Transportstrom gelesen und auf stdout (Standardausgabe) wird der nackte MPEG Audiostrom (oder eben Shoutcast-Medienstrom) ausgegeben. Typischerweise verwendet man diesen Modus zum Testen.

ts2shout ... als CGI applikation

Das ist die Hauptanwendung. Bei der Verwendung als CGI Applikation werden die relevanten Streamparameter direkt aus dem MPEG Frames gelesen und - sowie sie zusammengesammelt wurden - "Shoutcast-Kompatibel" als HTTP Header ausgegeben. Damit der Startup möglich schnell ist, wird ein kleiner Cache mit den Streaming-Parametern angelegt und verwendet. Danach beginnt dann das reguläre Streaming der MPEG Daten. Im CGI Modus wird der Eingangsdatenstrom mit Hilfe von libcurl von tvheadend oder einer anderen, passenden Applikation (z.B. vdr) gelesen und wie bei CGI Programmen üblich auf stdout geschrieben.

Es sind einige Hacks im Code enthalten, damit die Anzeige auf einer Squeezebox oder auch auf einem kleinen Webradio sinnvoll wird, aber trotzdem viele Informationen über die aktuelle Sendung eingeblendet werden. Zum Teil sind die EPG Informationen über die aktuelle Sendung über 600 Zeichen lang (gerne in den "Kulturprogrammen" z.B. SWR2 oder Bayern 4 Klassik). Die Squeezebox(-nachbauten) rollen den Text durch und pausieren am Textanfang eine kurze Zeit. Die RDS Daten sind hier geschickter, da sie nur maximal 128 Zeichen umfassen.

[LMS Ansicht eines langen Titels] [LMS Ansicht eines langen Titels]
DVB Stream empfangen. Darstellung im LMS Webinterface, aktuell laufen "SWR2 Feature" bzw. "Bayern 4 Jazztime".

ts2shout ... Audiostreaming

Seit Version v0.96 enthält ts2shout eine Audiostrom-Vorzugsauswahl. Die in einem "Programm" verfügbaren Audio-Streams werden betrachtet und mit einem Rang versehen. Die Rangfolge ist MPEG, AAC-LATM, AAC, AC-3. Im Falle von AAC-LATM wird noch die Stream-Qualität betrachtet und der "beste" Stream (höchste Bitrate/bestes Verfahren) ausgewählt. Auf dem neuen ARD Transponder wird so bevorzugt das AAC profile 4 (256 kBit/s) bei den Kulturprogrammen ausgesucht (z.B. BR-KLASSIK).

Einrichten von apache2 fürs Radiostreaming

Ich verwende apache2 in Zusammenspiel mit "mod_action" und "mod_cgi" als Webserver für das CGI Programm. Prinzipiell sollte aber jeder Webserver mit der Unterstützung von CGI Programmen funktionieren (also praktisch alle). Hier beschreibe ich aber nur Apache2 weil ich den am besten kenne und selber verwende. Folgende Änderung in /etc/apache2/sites-available/000-default.conf ist nach der Installation des Modules mod_action und mod_cgi (a2enmod action; a2enmod cgi) erforderlich. Wie man sich vorstellen kann, muß dieser Konfigurationsabschnitt natürlich nicht genau an dieser Stelle sein. Die Konfiguration muß eben dort eingefügt werden wo es einem für den virtuellen Host und (virtuellem) Unterverzeichnis passt. In der Debian Defaultinstallation liegt in /etc/apache2/sites-available/000-default.conf eine minimale Serverkonfiguration, dort kann man es im Normalfall einfügen. /cgi-bin/ wird bei Debian defaultmässig in /usr/lib/cgi-bin/ gesucht. Ich habe bei mir einen Symlink angelegt ln -s /usr/local/bin/ts2shout /usr/lib/cgi-bin/.

Ich habe ein github-Repository mit einer apache2 Konfigurationsdatei angelegt.

Nun aber der erforderliche Konfigurationsabschnitt.

    <Location /radio>
        Order Deny,Allow
        Deny from all
        Allow from 172.16.0.0/24
        Allow from ::1
        Allow from 127.0.0.1
        <If "%{HTTP:Icy-MetaData} in {'1'}">
                SetEnv "MetaData" "1"
        </If>
        # Wenn man RDS gegenüber dem MPEG EPG bevorzugen möchte
        # RDS = Radio Daten System
        # (Falls es kein RDS gibt, ist das EPG die Datenquelle)
        SetEnv RDS 1	
        SetEnv TVHEADEND "http://localhost:9981/stream/channelname"
        # Die Radiostationen werden mit der URL z.B. mittels
        # "/radio/SWR1 BW" bzw. (URL encoded) /radio/SWR1%20BW aufgerufen
        # wenn man das Radioprogramm "SWR1 BW" aus der tvheadend Kanalliste
        # hören will.
        # Nur A-Z/a-z/0-9, Leerzeichen und "-" sind wegen des regulären
        # Ausdrucks möglich. GGf. muß man andere Zeichen in den Kanalnamen
        # im tvheadend Frontend anpassen. 
        # Man kann auch die URL http://localhost:9981/stream/channelnumber
        # und die Kanalnummern verwenden (hatte ich hier vorher beschrieben)
        # /radio/SWR2 - mpeg Datenstrom
        SetEnvIf REQUEST_URI "([-A-Za-z0-9_ ]*)$" PROGRAMMNO=$1
        Options +ExecCGI
        Action ts2shout /cgi-bin/ts2shout virtual
        SetHandler ts2shout
    </Location>

Dieser Konfigurationsblock sorgt für folgendes: Apache wird angewiesen für alle Zugriffe auf URLs unterhalb von /radio die CGI Applikation ts2shout aufzurufen. Bei einem Aufruf werden die Environmentvariablen TVHEADEND und MetaData und bei einem "gültigen" Programm PROGRAMMNO gesetzt. Diese werden von ts2shout ausgewertet! Die URL $TVHEADEND/$PROGRAMMNO wird von ts2shout mittels libcurl von tvendend geladen. Es wird im empfangenden MPEG Transportstrom nach MPEG Streaminfos (Streamrate, Bitrate) und dem Stationsnamen gesucht. Wenn dieser empfangen wurde, werden die HTTP Header auf stdout an Apache gesendet und ab da dann der MPEG Datenstrom (im Shoutcastmodus oder eben nicht, abhängig vom evtl. empfangendem Icy-MetaData HTTP Header). ts2shout legt einen Cache in /var/tmp/ts2shout.cache an, in dem die Streamingparameter gemerkt werden. Nachdem man ein Programm einmal aufgerufen hat, wird ab da das Streaming sofort begonnen. Beim ersten Aufruf dauert es ca. eine halbe Sekunde bis der Stream losgeht, da vorher das noch nicht alle Informationen zusammengesammelt sind.

Durch das Parsen von Icy-MetaData im Request und das Setzen der korrekten Stream- und Bitrate sollten die Streams weitestgehend zu vielen Webradios (nicht nur zur Squeezebox) kompatibel sein.

Eventuelle Fehler werden auf stderr und damit ins Apache Errorlog geloggt - normalerweise in /var/log/apache2/error.log zu finden.

Wenn alles richtig eingerichtet und konfiguriert ist, wird folgendes von ts2shout ins apache Error log geschrieben wenn man z.B. SWR1 BW einstellt.

[Thu Nov 18 06:54:40.411122 2021] [ts2shout:info] [pid 1000] init_structures(): Subscribing to MPEG-TS PID 0, 17, 18 (CHANNEL_TYPE_PAT, CHANNEL_TYPE_SDT, CHANNEL_TYPE_EIT)
[Thu Nov 18 06:54:40.411173 2021] [ts2shout:info] [pid 1000] ts2shout version v0.99-3-g52c20a5 compiled 19.10.2021 23:26 started
[Thu Nov 18 06:54:40.411179 2021] [ts2shout:info] [pid 1000] MPEG streaming with shoutcast StreamTitles in CGI mode with RDS support.
[Thu Nov 18 06:54:40.412216 2021] [ts2shout:info] [pid 1000] fetch_cached_parameters(): found parameters for programme SWR1 BW
[Thu Nov 18 06:54:40.612297 2021] [ts2shout:info] [pid 1000] add_channel(): Subscribing to MPEG-TS PID 500 (Type CHANNEL_TYPE_PMT)
[Thu Nov 18 06:54:40.612348 2021] [ts2shout:info] [pid 1000] extract_pat_payload(): Added 1 possible PMT id(s) with transport_stream_id: 1039.
[Thu Nov 18 06:54:40.753966 2021] [ts2shout:info] [pid 1000] add_payload_from_pmt(): Audio `AAC profile, Level 2'
[Thu Nov 18 06:54:40.754025 2021] [ts2shout:info] [pid 1000] add_payload_from_pmt(): stream language `deu'
[Thu Nov 18 06:54:40.754037 2021] [ts2shout:info] [pid 1000] add_payload_from_pmt(): Found HE-AAC audio stream in PID 501 (service_id 10440)
[Thu Nov 18 06:54:40.754047 2021] [ts2shout:info] [pid 1000] add_channel(): Subscribing to MPEG-TS PID 501 (Type CHANNEL_TYPE_PAYLOAD)
[Thu Nov 18 06:54:40.756620 2021] [ts2shout:info] [pid 1000] add_payload_from_pmt(): Found RDS data stream in PID 502
[Thu Nov 18 06:54:40.756637 2021] [ts2shout:info] [pid 1000] add_channel(): Subscribing to MPEG-TS PID 502 (Type CHANNEL_TYPE_RDS)
[Thu Nov 18 06:54:40.756646 2021] [ts2shout:info] [pid 1000] AAC inline RDS messages are disabled (Separate RDS PID 502 available)
[Thu Nov 18 06:54:40.812991 2021] [ts2shout:info] [pid 1000] Synced to HE-AAC, Guessed Samplerate 48000 Hz, Bitrate 128 kBit/s
[Thu Nov 18 06:54:40.854066 2021] [ts2shout:info] [pid 1000] EIT: Guten Morgen Baden-Württemberg
[Thu Nov 18 06:54:41.293136 2021] [ts2shout:info] [pid 1000] SDT: Stream is station SWR1 BW from network ARD SWR.
[Thu Nov 18 06:54:58.912523 2021] [ts2shout:info] [pid 1000] RDS: RDS data found, using RDS instead of EIT.
[Thu Nov 18 06:54:58.912607 2021] [ts2shout:info] [pid 1000] RDS: Blame it on the boogie / The Jacksons, The Jacksons 
[Thu Nov 18 06:55:18.953019 2021] [ts2shout:info] [pid 1000] RDS: Blame it on the boogie / The Jacksons, The Jacksons Für uns in Baden-Württemberg 
[Thu Nov 18 06:55:39.054252 2021] [ts2shout:info] [pid 1000] RDS: The Jacksons, The Jacksons - Blame it on the boogie 
[Thu Nov 18 06:55:59.134701 2021] [ts2shout:info] [pid 1000] RDS: Blame it on the boogie / The Jacksons, The Jacksons 

Programme mit inline RDS funktionieren auch, hier z.B. NDR 2

[Mon Nov 15 23:15:46.808505 2021] [ts2shout:info] [pid 18207] init_structures(): Subscribing to MPEG-TS PID 0, 17, 18 (CHANNEL_TYPE_PAT, CHANNEL_TYPE_SDT, CHANNEL_TYPE_EIT)
[Mon Nov 15 23:15:46.808549 2021] [ts2shout:info] [pid 18207] ts2shout version v0.99-3-g52c20a5 compiled 19.10.2021 23:26 started
[Mon Nov 15 23:15:46.808554 2021] [ts2shout:info] [pid 18207] MPEG streaming without shoutcast support, audio only in CGI mode with RDS support.
[Mon Nov 15 23:15:47.233519 2021] [ts2shout:info] [pid 18207] add_channel(): Subscribing to MPEG-TS PID 200 (Type CHANNEL_TYPE_PMT)
[Mon Nov 15 23:15:47.233612 2021] [ts2shout:info] [pid 18207] extract_pat_payload(): Added 1 possible PMT id(s) with transport_stream_id: 1039.
[Mon Nov 15 23:15:47.335018 2021] [ts2shout:info] [pid 18207] add_payload_from_pmt(): Audio `AAC profile, Level 2'
[Mon Nov 15 23:15:47.335110 2021] [ts2shout:info] [pid 18207] add_payload_from_pmt(): stream language `deu'
[Mon Nov 15 23:15:47.335126 2021] [ts2shout:info] [pid 18207] add_payload_from_pmt(): Found HE-AAC audio stream in PID 201 (service_id 10412)
[Mon Nov 15 23:15:47.335138 2021] [ts2shout:info] [pid 18207] add_channel(): Subscribing to MPEG-TS PID 201 (Type CHANNEL_TYPE_PAYLOAD)
[Mon Nov 15 23:15:47.340796 2021] [ts2shout:info] [pid 18207] AAC inline RDS messages are enabled
[Mon Nov 15 23:15:47.340944 2021] [ts2shout:info] [pid 18207] Synced to HE-AAC, Guessed Samplerate 48000 Hz, Bitrate 128 kBit/s
[Mon Nov 15 23:15:47.341044 2021] [ts2shout:info] [pid 18207] aac_decode(): Error submitting the packet to the decoder: Invalid data found when processing input
[Mon Nov 15 23:15:47.495022 2021] [ts2shout:info] [pid 18207] EIT: NDR 2 Soundcheck Neue Musik
[Mon Nov 15 23:15:47.714760 2021] [ts2shout:info] [pid 18207] SDT: Stream is station NDR 2 NDS from network ARD NDR.
[Mon Nov 15 23:15:56.696578 2021] [ts2shout:info] [pid 18207] RDS: RDS data found, using RDS instead of EIT.
[Mon Nov 15 23:15:56.696720 2021] [ts2shout:info] [pid 18207] RDS:  NDR 2 - ndr.de/ndr2 
[Mon Nov 15 23:16:11.795824 2021] [ts2shout:info] [pid 18207] RDS:  Forever Summer - Eli 
[Mon Nov 15 23:17:11.815467 2021] [ts2shout:info] [pid 18207] RDS: Forever Summer - Eli 
[Mon Nov 15 23:18:24.916150 2021] [ts2shout:info] [pid 18207] RDS: Forever Summer - Eli Overpass Graffiti - Ed Sheeran 

Zu den AAC Formaten auf original Squeezeboxen bitte das Seitenende beachten.

Die ersten 2 Zeilen werden direkt mit Programmstart geschrieben. Aus der PAT (Programme association table) wird die Datenstrom-ID der PMT (programm map table) ausgelesen in der wiederrum die Datenstrom-ID der eigentlichen "Audio-Payload" übertragen wird. Dies wird automatisch aus dem Datenstrom herausgelesen und wenn die Daten aus PAT und PMT verarbeitet wurden wird ab da der Audiodatenstrom ausgegeben. Sobald "Synced to MPEG audio" und die "SDT:" Zeile geloggt wurde, wird der Audiostrom im CGI weitergeleitet. Zusätzlich zu den Audiodaten werden noch Daten aus der EIT (Event information table, besser bekannt unter dem Namen EPG) herausgelesen um die aktuelle Sendung zu bestimmen. Sind RDS Daten vorhanden können diese bevorzugt ausgewertet werden (s.o.). Als Schmankerl werden die aktuellen Radiotexte (bei einer Änderung) geloggt. Insbesondere bei der Satellitenübertragung gibt es oft eine große Diskrepanz zwischen der Menge der mpeg-ts Streaming Daten und tatsächlichen Audiodaten.

Die öfter auftauchende Zeile beim Beenden des Streaming [cgid:error] [pid 589:tid 139682125932288] (32)Broken pipe: [client 172.16.0.4:50752] AH02550: Failed to flush CGI output to client ist kein Fehler im engen Sinne, sondern rührt daher, wie das Streaming von den Clients abgebrochen wird. Es wird versucht möglichst sauber das Streaming von tvheadend zu stoppen.

Die Vorbereitung von tvheadend beschreibe ich auf einer extra Seite.

Getestete Playersoftware

In dieser Tabelle möchte ich Player beschreiben die die Streamtitelanzeige im Shoutcastformat beherrschen und deshalb die Programminformationen im Stream von ts2shout nutzen können.

RichtungProgrammnameBeschreibung
ZielSqueezeboxDarum geht es mir primär
ZielcmusEin curses Kommandozeilenplayer. Er unterstützt die Anzeige des Stationnamens und der RDS bzw. der EPG Daten
QuelleDreambox/Enigma2Userfeedback: funktioniert nicht, im erzeugten mpeg-transport fehlen SDT und EIT, der erzeugte Transportstrom ist damit audio-only. ts2shout benötigt allerdings unbedingt die SDT für den Sendernamen.
QuellevdrUserfeedback: funktioniert
Quelletvheadendfunktioniert

Es gibt sicher noch zahllose weitere Player die das richtig können. Shoutcast ist ja recht verbreitet.

tvheadend Radiostationen komfortabel in der Squeezebox auswählen

In der Weboberfläche des LMS kann man die Favoriten editieren (Da habe ich die Radioprogramme hingelegt, dann kann man denen auch einfach ein Logo zuordnen).

[Ansicht der LMS Oberfläche] [Ansicht des Players]
Ansicht der Favoriten in der LMS Oberfläche und Darstellung auf dem Player, aktuell läuft SWR1 BW "Der Nachmittag".

Einzelne Radioprogramme kann man in die Favoritenliste unter /var/lib/squeezeboxserver/prefs/favorites.opml einfügen. Achtung: Wenn man sich in der favorites.opml vertippt, dann wird einem die Datei bei Start des logitechmediaservers zurückgesetzt. Schaltet man das Debugging für die favoriten an, kann man im Logfile sehen, welche Zeile ihm nicht passt.

<outline URL="http://172.16.0.4/radio/SWR1 BW" icon="http://172.16.0.4/logos/SWR1-BW.png" text="SWR1 BW" type="audio" />

Da mehrere Radioprogramme manuell einzugeben etwas umständlich ist und man insbesondere kein Logo zuordnen kann habe ich mittlerweile ein Programm geschrieben. Gut und sinnvoll ist es alle Radioprogramme die in tvheadend konfiguriert sind automagisch auch in der Squeezebox verfügbar zu haben. Hierzu habe ich ein Perl-Skript geschrieben daß auch auf dem Apache als CGI läuft. Folgendes muß man tun:

Konfigurationsabschnitt für die automatische Senderliste

Dieser Abschnitt ist schon in meiner Konfigurationsvorlage vorbereitet.

	# IP Adressen usw. anpassen wie man es braucht
    <Location /station>
        Order Deny,Allow
        Deny from all
        Allow from 172.16.0.0/24
        Allow from ::1
        Allow from 127.0.0.1
        SetEnvIf REQUEST_URI "([-A-Za-z0-9_ ]*)$" PROGRAMMNO=$1
        Options +ExecCGI
        Action stationlist /cgi-bin/radio-list.pl virtual
        SetHandler stationlist
    </Location>

Die Stationslist wird ähnlich wie ts2shout eingebunden und ruft 2 REST Funktionen von tvheadend auf und baut daraus eine praktische Squeezebox Liste aller im tvheadend konfigurierten und aktivierten Radioprogramme.

Wenn man nur auf die Hauptstationsliste verweist, muß man das nur einmal in den Favoriten anpassen und kann die Radioprogramme mit dem Logo ansonsten über tvheadend verwalten. Usernamen oder Passwörter braucht man nicht, das wird vom Apache rein über eine Accessliste gemacht bzw. die sind im Skript hinterlegt. Dies ist die einzige Zeile die man in den Favoriten hinzufügen muß, damit man über das Favoritenmenü auf alle Sender zugreifen kann.

<outline URL="http://172.16.0.4/station/" icon="html/images/favorites.png" text="Alle Radioprogramme" type="playlist" />

Diese Zeile muß in die Favoritenliste mit aufgenommen werden, 172.16.0.4 durch den Hostnamen des Systems mit dem Apache ersetzen.

Das Skript radio-list.pl kann und soll an der Kommandozeile getestet werden (ob der Zugriff auf tvheadend richtig klappt) und auch über den Browser. Es wird genau eine Hierarchieebene unterstützt, wenn man sich bisher um das Tagging der Radioprogramme keine Gedanken gemacht hat ist das Ergebnis schon sehr brauchbar.

[Senderliste in Squeezer] [Ansicht der
Auswahlliste SWR]
Ansicht der Gesamtsenderübersicht (erstes Bild) und der Senderübersicht des SWR in der Android App Squeezer.

Die Logos habe ich mir alle über Wikipedia heruntergeladen und auf dem Apache (Senderverzeichnisse) bzw. als "picon" in tvheadend (einzelne Programme) hinterlegt. Ebenso kann man in tvheadend über "Channeltags" auch den "tags" ein Icon zuordnen. Dadurch kann man die Icons recht komfortabel über tvheadend verwalten und nirgends sind Icondateien hartcodiert.

Senderlogos für tvheadend und Squeezebox

Die Logos habe ich mir direkt von den jeweiligen Infoseiten über das Radioprogramm bei der Wikipedia als png Datei heruntergeladen. Damit die Logos richtig funktionieren muß in den Defaulteinstellungen des LMS die IP Adresse der Icon-URL hart hereingeschrieben werden. Ansonsten wird der "Imageproxy" von mysqueezebox verwendet. Der kommt aber an einen Webserver den es nur im LAN gibt gar nicht heran.

Damit die Senderlogos gut sowohl in den Squeezeboxen als auch über tvheadend z.B. in kodi genutzt werden können sind folgende Einstellungen im LMS sinnvoll Configuration->General (tvheadend) bzw. Einstellungen->Erweitert->Leistung (LMS):

[LMS Einstellungen]
Einrichten des lokalen Imageproxies im LMS

Damit die piCore Player ("Squeezeboxen") die Icons in der Favoritenauswahl schnell laden können ist es sinnvoll den lokalen "Imageproxy" zu verwenden. Im Einstellungsdialog heißt der Punkt Plattenhüllen Grössenanpassung und sollte so eingestellt werden wie oben im Screenshot gezeigt. Die aktuellen Versionen der Android App Squeezer und von Logitech-Mediaserver funktioniert dann auf Anhieb problemlos.

HE-AAC / LATM und original Squeezebox Player

Die originalen Squeezeboxen bzw. ältere LMS installationen kommen mit den neuen AAC Formaten nicht zurecht (Von ts2shout werden diese als HE-AAC Format ins Log geschrieben). Ich habe das LMS-Binary faad durch ein kleines Shellskript, welches ffmpeg nutzt, ersetzt:

mamba:/usr/share/squeezeboxserver/Bin/x86_64-linux>cat faad

#! /bin/bash
/usr/bin/ffmpeg -i /dev/stdin -vn -acodec pcm_s16le -f wav - 2>/dev/null

Dadurch werden die AAC streams bei mir passend konvertiert. Im LMS muß man unter Einstellungen -> Erweitert -> Dropdown "Dateiarten" auswählen und dort MPEG-4 "AAC" auf "Deaktiviert" stellen und unter AAC alle drei Datenstromformate auf "faad" stellen. Wenn man ein Radioprogramm frisch umgestellt hat, kann es sein, das es nicht auf anhieb geht, der LMS hat offensichtlich einen internen Cache von Streamingparametern. Nach ein paar Versuchen und einer kurzen Wartezeit gehts dann dauerhaft.

Vorteile dieses Setup sind folgende

  • Privacy - Die erhöhte Privacy gegenüber Webstreaming da keiner weiß welches Programm man hört.
  • Qualität - Die hohe Qualität der Medienströme, egal ob Satellit oder Kabel
  • Sparen - Das Einsparen der Bandbreite und von Kosten.
  • Unabhängigkeit - Unabhängig von irgendwelchen Streaminganbietern. Keine laufenden Kosten für Webstreaming.
  • Full Open-Source - Eine voll quelloffene Lösung, kein Tracking, keine Cloud.
  • Ausfallsicherheit - Hat man "alles richtig gemacht" geht alles sogar noch wenn das Internet ausgefallen ist.

Viel Erfolg