Stream-Technik Ton aus crabSDR ohne Browser
Sofort ausprobieren
| Was | DF0HHH (Rosengarten) | DM0NDR (Hamburg) |
|---|---|---|
| FM-Relais, Opus | 145725/fm.ogg | 145725/fm.ogg |
| Anruf FM, Opus 64 kbit/s | 145500/fm.ogg?br=64 | 145500/fm.ogg?br=64 |
| SSB-Runde, langsame AGC | 144260/usb.ogg?pb=300,2700&agc=slow | 144260/usb.ogg?pb=300,2700&agc=slow |
| APRS roh, PCM (für Decoder) | 144800/data.wav?sq=off | 144800/data.wav?sq=off |
| Zwei Kanäle links/rechts, PCM | pair.wav?l=145725/fm&r=145500/fm | pair.wav?l=145725/fm&r=439275/fm |
I/Q 48 kHz 16 bit (nur Sysop, token=) | 145700/iq.wav?bw=30000 | 439275/iq.wav?bw=30000 |
| Animierte Krabbe in VLC (Theora 160×140, 6 fps, +8–10 kbit/s; ohne Live-Titel und Titelbild) | 145725/fm.ogg?anim=1 | 145725/fm.ogg?anim=1 |
| Senderliste für VLC | presets.m3u | presets.m3u |
| Browser, Minimal-Ansicht | ?tune=145725.000fm&ui=min | ?tune=145725.000fm&ui=min |
Alle Adressen beginnen mit https://<station>/stream/. In VLC: Medien → Netzwerkstream öffnen, Adresse einfügen.
„Laufzeit 00:00“ ist bei Live-Streams normal.
Stream details audio from crabSDR without a browser
Try it right away
| What | DF0HHH (Rosengarten) | DM0NDR (Hamburg) |
|---|---|---|
| FM repeater, Opus | 145725/fm.ogg | 145725/fm.ogg |
| FM calling frequency, Opus 64 kbit/s | 145500/fm.ogg?br=64 | 145500/fm.ogg?br=64 |
| SSB net, slow AGC | 144260/usb.ogg?pb=300,2700&agc=slow | 144260/usb.ogg?pb=300,2700&agc=slow |
| APRS raw, PCM (for decoders) | 144800/data.wav?sq=off | 144800/data.wav?sq=off |
| Two channels left/right, PCM | pair.wav?l=145725/fm&r=145500/fm | pair.wav?l=145725/fm&r=439275/fm |
I/Q 48 kHz 16 bit (sysop only, token=) | 145700/iq.wav?bw=30000 | 439275/iq.wav?bw=30000 |
| Animated crab in VLC (Theora 160×140, 6 fps, +8–10 kbit/s; without live title and cover art) | 145725/fm.ogg?anim=1 | 145725/fm.ogg?anim=1 |
| Station list for VLC | presets.m3u | presets.m3u |
| Browser, minimal view | ?tune=145725.000fm&ui=min | ?tune=145725.000fm&ui=min |
All addresses start with https://<station>/stream/. In VLC: Media → Open Network Stream, paste the address.
“Duration 00:00” is normal for live streams.
Adressen
https://<station>/stream/<kHz>/<mode>.ogg Opus, fürs Ohr (≈ 4 kB/s) https://<station>/stream/<kHz>/<mode>.wav PCM 16 bit 48 kHz mono, für Decoder (96 kB/s) https://<station>/stream/pair.wav?l=<kHz>/<mode>&r=<kHz>/<mode> PCM stereo, zwei Kanäle (192 kB/s) https://<station>/stream/presets.m3u Schnellwahl als Senderliste https://<station>/stream/<kHz>/iq.wav I/Q links/rechts, 48 kHz 16 bit (1,5 Mbit/s), ?rate=32000&bits=8 → 0,5 Mbit/s https://<station>/stream/<kHz>/iq.ogg?br=192 I/Q als Opus, Experiment (0,2 Mbit/s) https://<station>/stream/decoder/<id>.ogg Ton eines Decoders (z. B. FreeDV), id aus /api/decoders
Frequenz in kHz, auch mit Nachkommastellen; unter 1000 gilt MHz. Das Band wird anhand der Frequenz gewählt.
mode: fm, am, sam, usb, lsb, cw, cwr,
data (FM ohne Sprachfilter, für Decoder), disc (Diskriminator flach über bw); iq siehe unten.
Parameter
| Parameter | Werte | Vorgabe |
|---|---|---|
bw | Bandbreite in Hz | FM 12500, AM 9000, SSB 2700, CW 500, disc 25000 |
pb | SSB-Durchlass lo,hi in Hz | 300,3000 |
sq | auto · auto:10 (dB über Rauschen) · -85 (dBFS fest) · off | auto bei FM/Daten, sonst off |
agc | fast · medium · slow · off (AM/SSB/CW) | medium |
br | Opus-Bitrate 8–128 kbit/s, nur .ogg | Station (32) |
anim | 1: animierte Krabbe als Theora-Videospur (160×140, 6 fps, 3-s-Schleife, ~8–10 kbit/s extra, keine Zusatzlatenz), nur .ogg; dann ohne Live-Titel und Wasserfall-Titelbild | aus |
live | 1: Titel zeigt Pegel, Rauschsperre und Rufzeichen · 0: fester Titel | an, außer im Browser |
cover | wf: alle 10 s der Wasserfall um die Frequenz als Titelbild | – |
pic | Stationsbild in den Tags | an, außer im Browser |
name | Name in der Hörerliste | Stream |
band | Band-Kennung, falls zwei Bänder die Frequenz abdecken | automatisch |
rate, bits | nur iq.wav: 32000/48000 Hz, 8/16 bit | 48000, 16 |
token | Gast-Token (POST /api/auth/guest), Anmelde-Token aus dem Browser (localStorage.crab_token) oder der feste Stream-Schlüssel der Station (Admin → Station → Erzeugen, oder Datei stream_key_file): zählt wie der Sysop, nur für Streams, läuft nie ab | – |
Addresses
https://<station>/stream/<kHz>/<mode>.ogg Opus, for the ear (≈ 4 kB/s) https://<station>/stream/<kHz>/<mode>.wav PCM 16 bit 48 kHz mono, for decoders (96 kB/s) https://<station>/stream/pair.wav?l=<kHz>/<mode>&r=<kHz>/<mode> PCM stereo, two channels (192 kB/s) https://<station>/stream/presets.m3u quick tune list as a station list https://<station>/stream/<kHz>/iq.wav I/Q left/right, 48 kHz 16 bit (1.5 Mbit/s), ?rate=32000&bits=8 → 0.5 Mbit/s https://<station>/stream/<kHz>/iq.ogg?br=192 I/Q as Opus, experimental (0.2 Mbit/s) https://<station>/stream/decoder/<id>.ogg audio of a decoder (e.g. FreeDV), id from /api/decoders
Frequency in kHz, decimals allowed; below 1000 it is taken as MHz. The band is chosen by the frequency.
mode: fm, am, sam, usb, lsb, cw, cwr,
data (FM without speech filter, for decoders), disc (flat discriminator across bw); iq see below.
Parameters
| Parameter | Values | Default |
|---|---|---|
bw | bandwidth in Hz | FM 12500, AM 9000, SSB 2700, CW 500, disc 25000 |
pb | SSB passband lo,hi in Hz | 300,3000 |
sq | auto · auto:10 (dB above noise) · -85 (fixed dBFS) · off | auto for FM/data, otherwise off |
agc | fast · medium · slow · off (AM/SSB/CW) | medium |
br | Opus bit rate 8–128 kbit/s, .ogg only | station (32) |
anim | 1: animated crab as a Theora video track (160×140, 6 fps, 3 s loop, ~8–10 kbit/s extra, no additional latency), .ogg only; then without live title and waterfall cover art | off |
live | 1: title shows level, squelch and call sign · 0: fixed title | on, except in the browser |
cover | wf: every 10 s the waterfall around the frequency as cover art | – |
pic | station picture in the tags | on, except in the browser |
name | name in the listener list | Stream |
band | band ID, in case two bands cover the frequency | automatic |
rate, bits | iq.wav only: 32000/48000 Hz, 8/16 bit | 48000, 16 |
token | guest token (POST /api/auth/guest), sign-in token from the browser (localStorage.crab_token), or the station’s fixed stream key (Admin → Station → Generate, or the file stream_key_file): counts like the sysop, streams only, never expires | – |
Browser-Link
https://<station>/?tune=145700.000fm&pb=-8.00,8.00&sq=auto:6&agc=slow&vol=-10&mute=1&name=DO1XX&ui=min
| Parameter | Wirkung |
|---|---|
tune | Frequenz in kHz plus Betriebsart; Endung dv = DV in USB, dvl = DV in LSB, t = Betriebsart T |
pb | Durchlass in kHz relativ zum Träger (SSB 0.30,2.70) |
sq, agc | wie beim Stream |
vol | Lautstärke in dB, −20 bis 6 |
mute=1 | stumm starten |
name | Anzeigename |
ui=min | nur Frequenz, Betriebsart, Bandbreite, Pegel; kein Wasserfall, kein Chat. Für viele Tabs. Tab-Titel = Frequenz |
view=all | alle Bänder untereinander |
dec | Ton eines Stations-Decoders, dec=<id> |
Ton startet in jedem Tab erst nach einem Klick (Browser-Regel). Chrome merkt sich die Erlaubnis je Seite, Firefox nicht.
Browser link
https://<station>/?tune=145700.000fm&pb=-8.00,8.00&sq=auto:6&agc=slow&vol=-10&mute=1&name=DO1XX&ui=min
| Parameter | Effect |
|---|---|
tune | frequency in kHz plus mode; suffix dv = DV in USB, dvl = DV in LSB, t = mode T |
pb | passband in kHz relative to the carrier (SSB 0.30,2.70) |
sq, agc | as for the stream |
vol | volume in dB, −20 to 6 |
mute=1 | start muted |
name | display name |
ui=min | only frequency, mode, bandwidth, level; no waterfall, no chat. For many tabs. Tab title = frequency |
view=all | all bands stacked |
dec | audio of a station decoder, dec=<id> |
In every tab, audio starts only after a click (browser rule). Chrome remembers the permission per site, Firefox does not.
Betriebsart data
FM mit flachem Diskriminator-Ausgang: derselbe ZF-Filter wie FM, aber kein 300-Hz-Hochpass (bei FM gegen CTCSS),
kein Sprachfilter bei 4 kHz, sondern Tiefpass bei 8 kHz, Gleichanteil-Entfernung bei etwa 30 Hz, Verstärkung auf
±4,5 kHz Hub (Spitze −8 dBFS). Erhält die Flanken von POCSAG (1200/2400 Bd), AFSK 1200, DTMF. Für DMR (4FSK, ±1,9 kHz)
.wav nehmen, Opus rundet die Symbole ab.
I/Q-Stream
Kein Demodulator: der Kanalausschnitt wird zur Mitte gemischt (Gleichanteil bleibt), auf die Abtastrate umgerechnet, auf Spitze −6 dBFS
geregelt, links I und rechts Q. bw ist die Breite des Ausschnitts (Vorgabe 30 kHz; TETRA 25 kHz, DMR 12,5 kHz). Bei I/Q ist die
nutzbare Bandbreite gleich der Abtastrate, 32 kHz reichen also für einen TETRA-Kanal. Datenmenge: 48 kHz/16 bit 1,5 Mbit/s, 32 kHz/8 bit
0,5 Mbit/s (8 bit = −48 dB Quantisierungsrauschen, TETRA braucht 10–20 dB SNR), Opus-Experiment 0,2 Mbit/s. Ein I/Q-Hörer wiegt wie
50 Ton-Hörer, deshalb iq_stream = "admin" | "users" | "all" | "off" (Vorgabe admin) und max_iq (Vorgabe 1).
curl -sN "https://<station>/stream/430450/iq.wav?bw=30000&token=…" \ | sox -t wav - -t raw -r 36000 -e float -b 32 -c 2 - | <tetra-decoder>
Mode data
FM with a flat discriminator output: the same IF filter as FM, but no 300 Hz high-pass (used in FM against CTCSS),
no voice filter at 4 kHz, instead a low-pass at 8 kHz, DC removal at about 30 Hz, gain set for
±4.5 kHz deviation (peak −8 dBFS). Preserves the edges of POCSAG (1200/2400 Bd), AFSK 1200, DTMF. For DMR (4FSK, ±1.9 kHz),
use .wav; Opus rounds off the symbols.
I/Q stream
No demodulator: the channel slice is mixed to the center (DC remains), resampled to the sample rate, leveled to a peak of −6 dBFS,
I on the left and Q on the right. bw is the width of the slice (default 30 kHz; TETRA 25 kHz, DMR 12.5 kHz). With I/Q, the
usable bandwidth equals the sample rate, so 32 kHz is enough for one TETRA channel. Data volume: 48 kHz/16 bit 1.5 Mbit/s, 32 kHz/8 bit
0.5 Mbit/s (8 bit = −48 dB quantization noise, TETRA needs 10–20 dB SNR), Opus experiment 0.2 Mbit/s. One I/Q listener weighs as much as
50 audio listeners, hence iq_stream = "admin" | "users" | "all" | "off" (default admin) and max_iq (default 1).
curl -sN "https://<station>/stream/430450/iq.wav?bw=30000&token=…" \ | sox -t wav - -t raw -r 36000 -e float -b 32 -c 2 - | <tetra-decoder>
Decoder-Beispiele
# ohne Soundkarte, multimon-ng will 22050 Hz s16le curl -sN "https://df0hhh.crabsdr.de/stream/144800/data.wav?sq=off" \ | sox -t wav - -t raw -r 22050 -e signed -b 16 -c 1 - \ | multimon-ng -t raw -a AFSK1200 -a POCSAG1200 -a POCSAG2400 - # DMR mit DSD-FME curl -sN "https://ccchh.crabsdr.de/stream/439500/data.wav?sq=off" | dsd-fme -i - -fs # zwei Frequenzen auf ein virtuelles Audiokabel, je ein Decoder links/rechts mpv --audio-device=… "https://df0hhh.crabsdr.de/stream/pair.wav?l=145700/fm&r=145725/fm&sq=off" # Home Assistant: media_player.play_media media_content_id: https://df0hhh.crabsdr.de/stream/145500/fm.ogg media_content_type: music
Lastgrenzen
Teuer ist der Kanal, nicht der Hörer: jede andere Frequenz/Betriebsart/Bandbreite kostet auf einem Pi 4 rund 2–3 % CPU,
Hörer auf demselben Kanal teilen ihn. Oben in config.toml, gilt je Band, 0 = keine Grenze:
| Schlüssel | Vorgabe | Wirkung |
|---|---|---|
max_channels | 16 | verschiedene Kanäle; darüber „Station voll“ (Browser-Hinweis, Stream 503), schon gehörte Frequenzen gehen weiter |
max_streams | 6 | gleichzeitige Streams (503) |
max_per_ip | 10 | Verbindungen je Adresse, Tabs und Bänder zählen einzeln (429) |
max_listeners | 50 | Verbindungen insgesamt (503) |
max_iq | 1 | gleichzeitige I/Q-Streams (503); iq_stream regelt, wer darf |
Decoder examples
# without a sound card, multimon-ng wants 22050 Hz s16le curl -sN "https://df0hhh.crabsdr.de/stream/144800/data.wav?sq=off" \ | sox -t wav - -t raw -r 22050 -e signed -b 16 -c 1 - \ | multimon-ng -t raw -a AFSK1200 -a POCSAG1200 -a POCSAG2400 - # DMR with DSD-FME curl -sN "https://ccchh.crabsdr.de/stream/439500/data.wav?sq=off" | dsd-fme -i - -fs # two frequencies onto a virtual audio cable, one decoder each left/right mpv --audio-device=… "https://df0hhh.crabsdr.de/stream/pair.wav?l=145700/fm&r=145725/fm&sq=off" # Home Assistant: media_player.play_media media_content_id: https://df0hhh.crabsdr.de/stream/145500/fm.ogg media_content_type: music
Load limits
The channel is what costs, not the listener: each additional frequency/mode/bandwidth costs about 2–3 % CPU on a Pi 4;
listeners on the same channel share it. At the top of config.toml, applies per band, 0 = no limit:
| Key | Default | Effect |
|---|---|---|
max_channels | 16 | distinct channels; beyond that “Station full” (browser note, stream 503); frequencies already being heard keep going |
max_streams | 6 | simultaneous streams (503) |
max_per_ip | 10 | connections per address; tabs and bands count individually (429) |
max_listeners | 50 | connections in total (503) |
max_iq | 1 | simultaneous I/Q streams (503); iq_stream decides who may |
Latenz
I/Q 2 ms + DSP-Rahmen ≈ 50 ms + Anlauf 100 ms + Ogg-Seite 100 ms + Puffer des Spielers (VLC Vorgabe 1 s,
--network-caching=300 geht). Realistisch 0,5–1,5 s; der Browser liegt bei etwa 0,4 s.
Latency
I/Q 2 ms + DSP frame ≈ 50 ms + start-up 100 ms + Ogg page 100 ms + player buffer (VLC default 1 s,
--network-caching=300 works). Realistically 0.5–1.5 s; the browser is at about 0.4 s.