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]](pictures/2018/02/Squeezebox-PI-SWR1-Nachmittag.jpg)
![[Ansicht des Players]](pictures/2020/04/Streaming2-RDS.jpg)
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. Der ORF hat nun auf Astra 19.2E, 11302 MHz ebenso mit AAC-LATM Übertragungen seiner Radioprogramme begonnen. 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 RDS Daten verarbeitet werden können 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 sind leider nicht upstream eingebunden.
RDS gibt es aktuell nur bei der ARD. RDS wird bei allen ARD Programmen inline im AAC Datenstrom als sog. anxillary Daten eingepackt. Der ORF sendet keine RDS Daten im AAC Signal. Aktuell (3. Oktober 2024) gibt es offensichtlich noch technische Probleme mit dem AAC Signal beim ORF.
Kabel
Bei Vodafone wird seit 16.11. der AAC-LATM Codec ebenso für die ARD Radioprogramme vorausgesetzt. ts2shout kommt damit ebenso klar 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). 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 bzw. in einen nackten mpeg Audiodatenstrom. Der Default ist der nackte Audiostrom. 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]](pictures/2018/03/SWR2-LMS-Screen.png)
![[LMS Ansicht eines langen Titels]](pictures/2018/03/Bayern4-LMS-Screen.png)
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, hier noch aus einer Zeit mit einem extra RDS-Datenstrom.
[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.
Richtung | Programmname | Beschreibung |
---|---|---|
Ziel | Squeezebox | Darum geht es mir primär |
Ziel | cmus | Ein curses Kommandozeilenplayer. Er unterstützt die Anzeige des Stationnamens und der RDS bzw. der EPG Daten |
Quelle | Dreambox/Enigma2 | Userfeedback: 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. |
Quelle | vdr | Userfeedback: funktioniert |
Quelle | tvheadend | funktioniert |
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]](pictures/2018/02/User-Screen-5.png)
![[Ansicht des Players]](pictures/2018/02/Squeezebox-PI-SWR1-Nachmittag.jpg)
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:
- Die Datei
/var/lib/squeezeboxserver/prefs/favorites.opml
anpassen. - Das Perl-Skript radio-list.pl aus dem Helper
Repository herunterladen und ins cgi-bin Verzeichnis des Webservers kopieren
(Bei Debian
/usr/lib/cgi-bin/radio-list.pl
) und anpassen (enthält die Benutzerdaten und URLs von tvheadend und apache). Vermutlich muß man noch einige Perl-Pakete nachinstallieren (wie z.B. librest-client-perl, liburi-encode-perl etc.) - Die Apache Config von oben weiter erweitern (siehe unten), gibt es auch zum Download.
- Das heruntergeladene Skript
radio-list.pl
editieren und an die eigene Installation anpassen (siehe nächster Abschnitt. - Das Skript gerne an der Kommandozeile testen, es muß dann die eine XML Liste von möglichen Stationen anzeigen die tvheadend bereitstellt.
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]](pictures/2021/11/Screenshot_20211117_223230_uk.org.ngo.squeezer.jpg)
![[Ansicht der
Auswahlliste SWR]](pictures/2021/11/Screenshot_20211117_223234_uk.org.ngo.squeezer.jpg)
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]](pictures/2018/03/User-Screen-7.png)
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 LATM audio 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