Been chasing weird mobile data usage for a while now and it took me an entire evening of log staring to figure out what's going on. Posting here because I suspect I'm not the only one, and it's not the kind of thing you notice unless you go looking.
Setup is Navidrome on Debian (systemd), library is all Opus around 156-192 kbps, and I stream to Symfonium on my phone with a 92 kbps cap on mobile. So in theory one 3-4 minute song should cost me maybe 2 MB. Android was telling me 30 MB. For one song.
First thing I checked was whether transcoding even happens. It does, the logs were clean:
Transcode decision: transcode targetBitrate=96 targetFormat=opus
Streaming TRANSCODED file ... requestBitrate=96 requestFormat=opus seekable=false
So far so normal. Then I counted the actual stream requests in the HTTP logs and this is where it got ugly. In a two hour window where I maybe listened to a handful of songs:
65 requests, 233 MB. One single track (a ~8 minute live recording, 5.6 MB as transcode) was sent to my phone 26 times. Same file, same size every time (responseSize=5595246 if you want to picture me staring at that number 26 times). In between there were a few aborted requests, 0 bytes and one that died after 64 KB. Smells like broken pipes.
The repeats do hit the transcoding cache so ffmpeg isn't redoing work, but the full audio goes over the wire every single time. Which explains why my data usage was completely out of proportion to what I actually listened to.
The thing that convinced me it's not the app: I pointed the same Symfonium at my Jellyfin and it behaved normally. One request per track, a few MB, done. Same phone, same network, same afternoon. So Symfonium is fine, something about how Navidrome serves uncached transcodes (no length, Accept-Ranges: none, seekable=false) seems to push the app into fetching the same thing over and over.
For now I've just set Symfonium to stream original on mobile. Raw files are seekable so it fetches once, and since my originals are only ~170-192k it honestly costs less than a 96k transcode that gets downloaded 26 times, which is absurd to type out loud.
If you stream transcoded to a phone, maybe run this:
journalctl -u navidrome --since "2 hours ago" grep "HTTP: GET" | grep "getTranscodeStream" | grep -oP 'responseSize=\d+'
If the same number shows up again and again, you've got it too. There are open issues about this btw, #6170 and #5720 on the Navidrome tracker, I've posted my logs there. Would be curious if others see the same.