Ich mag Radio. Das schrieb ich hier schon einmal im Jahr 2009 und begann so meinen Artikel zum Streamrecording. Damals ging es um ein Skript, mit dessen Hilfe Webstreams in praktischen Haeppchen mitgeschnitten werden konnten. Das hier beschriebene Projekt hatte eine leicht andere Zielstellung: Statt kontinuierlichen Mittschnitts geht es hier eher um die Arbeit gegen den was-war-das-eben-bitte-?-Effekt beim Zuhoeren. Stets gefolgt vom Aerger drueber, dass man am Radio nicht einfach zurueckspulen kann.

Motivation

Da war eben im Radio eine Meldung, die ich nochmal hoeren moechte. Oder ein Versprecher, an dem ich mich noch in einem Jahr erfreuen werde. Oder einfach ein fuer mich relevanter Beitrag, den ich behalten moechte. Aber nun ist es natuerlich zu spaet zum Mitschneiden... ich koennte natuerlich hoffen, dass der Beitrag wiederholt wird. Aber dann bin ich den Rest der Zeit bis das der Fall ist -- oder auch nicht -- mit dem Warten beschaeftigt.
Natuerlich kann ich auch die unter streamrecording.html beschriebene Loesung bestaendig mitlaufen lassen. Das habe ich sogar eine ganze Weile getan. Das hat aber zwei Nachteile:

Hinzu kommt eine wesentliche Beobachtung eigenen Verhaltens: Das alles trieb mich zu einer einfachen Frage: Was will ich denn eigentlich? Und zur zugehoerigen Antwort: Ich will die letzten n gelaufenen Minuten aus dem Stream.

Details

Eigentlich ist der obenstehende Wunsch in der Summe erfreulich einfach zu realisieren, wenn ich den Stand der Technik betrachte:

  • Der Webstream kommt per HTTP-Auslieferung. Detaillierte Anforderung: Einen Request stellen und danach mit einer potentiell unendlichen Antwort umgehen koennen.
  • Diese Antwort in einem angemessen grossen Ringpuffer halten, so dass immer eine dem Puffer entsprechend grosse Datenmenge dessen, was gewesen ist zur Verfuegung steht.
  • Den Ringpuffer auf ein Signal hin in eine Datei schreiben; danach weiter den Ringpuffer aktuell halten.
  • Das ist erstaunlich wenig. Also -- gesagt, getan. Und als Kroenung hab ich auf saemtliche Dependicies verzichtet und zu C/C++ gegriffen (C++ fuer alles, was in C eklig ist, C fuer alles lowlevelige (Unix-Signal-Handling, Netzwerkerei, ...). Ein Vormittag basteln, ein Nachmittag zum verschoenern. Schon ist er fertig -- der MiRiPu, der Mini-Ring-Puffer.
    Tut das, was er soll. Buffert mir 5 MB Daten, die er auf CTRL-C hin in eine mit Timestamp und per Stream uebertragener Senderkennung benannte Datei im Workdirectory ausschuetten kann.

    In der Praxis sieht das dann laufenderweise z.B. so aus:

    [ad001@glas ~/pfad/zum/programm/namen]$ ./a http://ndrstream.ic.llnwd.net/stream/ndrstream_ndrinfo_hi_mp3
    Given URL is http://ndrstream.ic.llnwd.net/stream/ndrstream_ndrinfo_hi_mp3
    Aquiring buffer space for 1048576 Bytes (1024 KBytes)
    Connecting...connected.
    File name changed to NDR_Info-YYYYMMDD-HHMMSS.mp3
    Stream Name:        "NDR Info"
    Stream Description: "NDR Info"
    Press CTRL-C to dump buffer.
    [                                      |                                ] 56 %  
    
    Hier mit einem sehr kleinen Puffer von nur einem Megabyte, da ich noch am Testen war. Die "Progressleiste" unten ist uebrigens die prozentuale Position des Schreibpointers im Ringspeicher -- eine Spielerei, die ich mir aus zwei Gruenden nicht verkneifen konnte: 1. Damit man zumindest irgendwelche Aktivitaet sieht.
    2. Weil ich kann :)

    Stichworte:


    Impressum