Radio audio interfacing for live streaming

A long running goal of mine was to be able to live stream audio of amateur radio traffic (FM Voice, DMR Voice, SSTV, FT8 ) to the internet. ( previously ) The places I wanted to be able to stream that to vary quite a bit, with the options of Youtube, Twitch, or Discord all being typical cases I might want.

Additionally, I have a goal of being able to livestream both audio and video, specifically to eventually allow live decoders for slow scan TV, or live playback of digital modes like FT8. So this isn't an audio only streaming solution.

Youtube Live and Twitch both support RTMP end points. Discord, however, has it's own streaming protocol, which makes the easiest way to interface with it the Discord Client and something that pretends to be a webcam.

Native Bluetooth Headset Profile

I particularly like the Anytone 578 series of radios. Analog FM and DMR support covers the 2m and 440mhz modes I use most often. So, how to get the audio from that radio to somewhere I can use it usefully. I also have an interest in live production setups for streaming to conferences, so when I encountered the Rode Caster Video (and the smaller S variant), with it's extensive audio handling and routing support, I had an idea. Specifically, the Rode Caster Video implements a 9 stereo in by 9 independent stereo mix out audio mixer. Inputs can include HDMI inputs, Analog audio inputs, USB Audio in and out, Rode Wireless microphones, and most importantly Bluetooth audio.

The Anytone radio has a bluetooth stack in it that can be attached to a number of accessories they produce, or your car's head unit. The radio speaks headset profile (very specifically HSP and only HSP) as a "phone" and attaches to other devices which claim to be "headsets" over headset profile. In my truck, this works remarkably well. One of the more useful features from my perspective is that it interrupts the playing entertainment audio as a phone call when there's traffic on the channel, and after a time out, hangs up, and the 'music' continues.

The Rode Caster Video has a bluetooth stack in it that claims to be a headset. This allows you to attach the Rode Caster Video as a headset to a phone. Presumably this lets you bring in a remote party over the phone line to the live production.

So, I have a radio that claims to be a phone (Via bluetooth HSP), and a Rode Video caster that claims to be a headset (again using HSP). Hypothetically, I can connect the two and have a bidirectional controlled audio link that I can use the Rode Video Caster's extensive audio mixer to manage the mix going to and from the radio.

Yes, the connection between the two establishes. This is where the good news ends.

The latency over bluetooh is... notable. Like, 200ms. Enough to make me question the connection. Radio to Caster audio path is .... sharp, and not in a good way. It's sort of vocoder / robotic sounding. Caster to Radio, however, there's some sort of buffering going on that's transmitting the wrong audio at the wrong time.

My best guess at the time of writing is that the Rode Caster's internal audio buffer for the bluetooth stack is filling up, but since the Radio doesn't want the data, because the PTT button isn't pressed, it's not accepting the stream. When the PTT gets pressed, the data flows from the Caster to the Radio, and you get whatever audio was sitting in buffer, probably from seconds to minutes ago, long before you pressed the PTT button. I further believe the buffer is a circular buffer of some sort, and as such, will forever be seconds behind your transmitting audio, and will never catch up.

Alternate bluetooth interface

As an experiment, in one directional monitoring, I found in my collection of parts, a Nokia puck that was designed to convert a pair of wired headphones into a bluetooth headset. Thus the puck speaks HSP as a headset, and produces analog audio out.

I had a free input on the Rode Caster Video, and thus, we now have an analog link in the path.

 flowchart LR 

    Anytone <--->|"bluetooth"| N
    N["Nokia puck"] --->|"Analog Audio"| R["Rode Caster Video"]

Shockingly, that works better, as a unidirectional way to monitor the audio. The audio is far less sharp, and comes across cleaner sounding. But this means the audio only flows out of the radio via bluetooth. And it consumes a valuable microphone input on the Rode Caster Video.

So, uh, that's not going to work. Time to go back to purely analog interfacing.

Analog interfacing

The Anytone 578 has two speaker out ports on the back. The top port drives a speaker that is attached to the 'selected band or function' and the bottom port drives a speaker attached to the current 'sub band'. That's not tracking the A or B side of the radio, but the current selection.

The ports are physically 3.5mm TR connections. These are specificially speaker ports, and are driven independently with no respect to power negative or ground. They are expected to be loaded with 8 Ohms of impedence.

The Anytone manual carefully tells you that you should never connect either of the RX Audio Output wires to a grounded line. This is because it's doing the standard thing where it drives both sides of it's audio out to get more drive without having to put an independent audio amplifier in line.

Also, a great way to destroy your radio's audio amplifier finals is to unplug that 3.5mm speaker out, while it's driving your speakers, because you will briefly short across that contact. So, uh, don't do that.

The Anytone also has a speaker out on the front 8P8C (wrongly called an RJ45 in many contexts ) connector. This is yet to be explored.

The speaker on most radios is crap, and that's to the advantage of the sound coming out of it, because it's not like audio on a fm or DMR channel is that good to start with. But if you feed the rx audio out into another system that's got even moderately good speakers, you start hearing all of the high end noise, the low end rumbles, and all sorts of garbage. So if you are going to relay your audio to something that's 'okay' quality, you need to dump all of the frequency ranges that the inbuilt speaker was disposing of for you.

To that end, the speaker audio out was passed through a stand alone, very old, 10 band graphic equalizer. It provides the input isolation, along with allowing me to cut all frequencies between 300 and 5000 hz. This produced a vastly more acceptable audio signal, which was presented to the Rode Caster Video's second analog input.

This worked acceptably, but still consumes the second, valuable, analog input on the Rode Caster Video.

Analog audio for monitoring only

Giving up on the two way desk radio for the moment, can I wire up the system to support dual channel audio monitoring. From the above experiments I've assembled the following system.

 flowchart LR 

    Anytone --->|"Main Speaker Out"| G1["Ground Loop lifter"]
    Anytone --->|"Sub channel Speaker Out"| G2["Ground Loop lifter"]
    G1 --->|"Left Analog Audio"| M["Mac Mini"]
    G2 --->|"Right Analog Audio"| M["Mac Mini"]

This works. The Ground Loop lifters isolate the speaker ports from the Line in input, and each other. When the shared signal reference re-establishes on the line-in connection on the mac mini, there is some bleed over. This is expected because even through the ground loop lifter, that's still an balanced signal being placed on an unbalanced input. I see about 30db of isolation between the two channels, which is enough, if not ideal.

The streaming software side of this migrates from being the Rode Caster Video to being OBS. OBS emits RTMP towards Youtube, and optionally, NDI to the local network.

OBS makes me sad

This is supposed to be a fully automated, headless, keyboardless, mouseless, machine that can recover to operational without me. Up to and including power failure and restoration. Well, OBS thinks that's not a thing they want to support.

https://github.com/obsproject/obs-studio/issues/12650


1403 Words - 5 min read

posted 2026-01-01

updated 2026-01-03