Home > linux, software > Playing MP3 on Raspberry Pi with low latency

Playing MP3 on Raspberry Pi with low latency

One commercial project I was working on for Raspberry Pi involved playing various MP3 samples when a button is pushed. The original implementation used mplayer to play back the samples, however the issue is that there was up to 1500ms latency between mplayer was executed and start of playback.

I didn’t do detailed profiling, but I think two factors causing high latency of mplayer were that (i) just loading all the .so libraries mplayer depends on can take many hundreds of milliseconds (ii) the file is being scanned for whatever stuff, streams detected etc. and that can also take some extra time; perhaps I could force mplayer to realize this is a simple MP3 file, but (i) is still the much bigger factor.

I wanted to avoid recoding all the samples to wav. That would allow me to use aplay directly and the playback starts immediately, but it would also feel really silly; decoding of MP3 is not the bottleneck, just the latency of mammoth software loading and initializing itself is. I also didn’t try mpd as that might have been a bit painful to set up.

Another point worth noting is that I didn’t use the crappy on-board PWM audio but a $3 chinese USB soundcard (which is still much better than PWM audio). And using reasonably up-to-date Raspbian Wheezy. So I tried…

  • mplayer -slave -idle, started in parallel with my program and receiving commands via FIFO. It hangs after the first file (even though it works fine when ran without -slave).
  • cmus running in parallel with my program, controlled by cmus-remote. Convincing it to use ALSA device of my choice was really hard, but eventually I managed, only to hear my files sped up about 20x.
  • madplay I couldn’t convince about using a non-default ALSA device at all.
  • mpg123 started immediately and could play back the MP3 files on a non-default ALSA device. Somehow, the quality was very low though (telephone grade) and there was an intense high-pitched clip at the end of the playback.
  • mpg321 I couldn’t convince to produce any sound and anyway it had about 800ms latency before playback started, probably due to its libao dependency.
  • sox, or rather AUDIODEV=hw:1 play worked! (After installing a package with MP3 support for sox.) No latency, normal quality, no clips, no hangs. Whew.

Verdict: There still is a software on Linux that can properly and quickly play MP3 files on Raspberry Pi, though it was a challenge to find it. I didn’t think of sox at first and I was almost giving up hope. BTW, normally you would use sox and play for applying a variety of audio transformations and effects in a batch/pipeline fashion and it can do a lot of awesome magic.

Categories: linux, software Tags: , , , , , ,
  1. archarm on my pi
    May 28th, 2013 at 03:23 | #1

    i use arch (arm) on my pi, so i am not sure if this applies for raspbian–but probably does since debian has a vast library. I have moc (music on console) you can run mocp to get an ncurses player. its a bit more human friendly (IMHO) than mpd.

  2. June 8th, 2014 at 05:50 | #2

    Hi, I’m the actual digi user. The reason why recognized advertising merely valid till 31st september? Why not consider to prospects who pass up that possibility?

  3. August 20th, 2014 at 16:30 | #6

    Everything published was very reasonable. But, think on this, suppose
    you were to create a killer headline? I am not saying your content is not good., however suppose you added a post title that
    makes people desire more? I mean Pasky’s Log » Playing MP3 on Raspberry Pi with low latency is
    a little boring. You could peek at Yahoo’s home
    page and see how they create article headlines to grab people interested.
    You might try adding a video or a pic or two to grab readers interested about what you’ve written. In my opinion, it might bring
    your posts a little bit more interesting.

  1. No trackbacks yet.