Das soll an dieser Stelle als kurze Skizze des Programmablaufs genügen. Der reale Code für das Webradio ist freilich etwas ausgefeilter und umfasst beispielsweise auch die Ansteuerung des Bildschirms. Das komplette CircuitPython-Webradio-Programm steht im Github-Repository des Autors [4] für Sie zum Download bereit.
Listing 1
MP3-Streams abspielen
buffer = bytearray(bufsize)
decoder = audiomp3.MP3Decoder("dummy.mp3", buffer)
i2s = audiobusio.I2SOut(pin_bclk, pin_wsel, pin_data)
response = requests.get(url, timeout=5, headers={"connection": "close"}, stream=True)
decoder.file = response.socket
i2s.play(decoder)
Listing 2
Button-Verarbeitung
import keypad
keys = keypad.Keys([PIN_PREV, PIN_NEXT, PIN_RELOAD, PIN_MUTE], value_when_pressed=False, pull=True, interval=0.1, max_events=4)
callbacks = [on_prev, on_next, on_reload, on_mute]
[...]
while True:
event = keys.events.get()
if event and event.pressed:
callbacks[event.key_number]()
Ergebnisse
Der Betrieb des Webradios funktioniert überwiegend problemlos, aber nicht immer perfekt. So gibt es Streams, bei denen das Programm mehrere Anläufe benötigt, bis die Wiedergabe gelingt. Das hängt mit den MP3-Frames zusammen, auf die sich der Decoder erst synchronisieren muss. Der Autor hat bis jetzt nur einen einzigen (französischen) Sender gefunden, der überhaupt nicht funktionierte. Hier sendet die Radiostation vermutlich falsche Daten und bringt den Decoder aus dem Tritt.
Tests mit dem Pico W haben ergeben, dass er für Streams mit einer CBR (“constant bitrate”, konstante Bitrate) von 64 Bit funktioniert, darüber kommt er ins Stottern. Allerdings überträgt zumindest in Deutschland kaum noch ein Sender mit einer derart niedrigen Bitrate, obwohl sie für viele Anwendungsfälle absolut ausreichend wäre.
Mit der hierzulande üblichen CBR von 128 oder 256 Bit kommt erst ein Pico 2W problemlos zurecht. Wichtig ist aber, dass Sie möglichst unverschlüsselte Streams nutzen, also mit http:// statt https:// in der URL, denn das Entschlüsseln ist eine echte Performance-Bremse. Ebenfalls gut funktioniert ein System auf Basis eines ESP32-S3 oder eines ähnlich leistungsfähigen Mikrocontrollers. Da CircuitPython fast auf jeder MCU läuft, stellt das auch softwareseitig kein Problem dar.
Ausblick
Das in diesem Artikel vorgestellte Programm unterstützt keine ICY-Metadaten. Diese Infoschnipsel mischen die Sender auf Anforderung unter die eigentlichen MP3-Daten. Die Trennung von MP3-Frames und ICY-Metadaten würde die kleinen Rechner wahrscheinlich überfordern und ist deshalb nicht implementiert. Ähnliches gilt für einen zusätzlichen Softwaremixer für die Lautstärkeregelung. Mit zukünftigen, leistungsstärkeren MCUs dürfte sich das aber in absehbarer Zeit ändern. Der Code auf Github ist zumindest schon darauf vorbereitet.
Fazit
Die Implementation des Webradios war insgesamt eine einfache Sache. Ein fertiges Projekt jenseits des Breadboard-Stadiums erfordert freilich noch etwas mehr Arbeit. Haben Sie irgendwo noch alte Boxen herumliegen, könnten Sie sie upcyceln und die Komponenten einfach einbauen.
Auch die Software beschränkt sich auf ein Minimum und lädt förmlich zum Ändern und Erweitern ein. Moderne Touchscreens können die Senderauswahl erleichtern, ein kleiner Webserver auf dem Pico 2W würde die Fernbedienung per Smartphone erlauben. Der Autor nimmt jederzeit Pull Requests an und verlinkt auch gern von seinem Webradio-Repo auf alternative Projekte. (jlu)
Der Autor
Bernhard Bablok ist im Ruhestand. Wenn er nicht Musik hört oder mit dem Rad respektive zu Fuß unterwegs ist, beschäftigt er sich mit Themen rund um Linux, Programmierung und Kleincomputer. Sie erreichen ihn unter mailto:[email protected].
Glossar
-
I<+>2<+>S: Inter-IC Sound. Unidirektionale Schnittstelle für serielle digitale Audiodaten. Kommt typischerweise zur Übertragung digitaler Audiodaten mit Puls-Code-Modulation (PCM) zum Einsatz.
- ICY
-
I Can Yell. Summarische Bezeichnung für Metadaten-Tags und Responses im Streaming-Protokoll des Freeware-Mediaservers Shoutcast [5]. Deren Bezeichnungen beginnen alle mit ICY.
Infos
- Simple Radio: https://github.com/bablokb/simple-radio
- Luxusradio (Teil 1): Bernhard Bablok, “Schmuckstück”, RPG 10/2021, S. 52, https://www.raspi-geek.de/46115
- Pirate Audio HAT: https://www.berrybase.de/pirate-audio-hat-fuer-raspberry-pi-mit-eingebautem-lautsprecher
- Webradio für Pico und Co.: https://github.com/bablokb/cp-webradio
- Shoutcast: https://de.wikipedia.org/wiki/SHOUTcast





