Channel downmixing in MPlayer

Recently I have been playing with downmixing in MPlayer.  When I bought new speakers, I decided to go with stereo instead of surround since I mostly listen to music. As anyone using mplayer or any “derived” players such as vlc have discovered, there is a incredible annoying problem that the voices of the actors are very low, actually in general the sound is very low. It appears that when mixing to two speakers, the center channels is put very low in the mix. The same could be said about the subwoofer although it’s naturally not as easily recognized.

A quick google revealed that MPlayer has several tricks (audio filters) that might potentially work: volume, volnorm, pan, hrtf. I quickly discarded volume and volnorm since I don’t want to just boost the sound, I want it to distribute the channels properly. hrtf seemed like a good simple choice, since pan looked very complex. Sadly in the middle of Harry Potter I had to turn it off because it was making lots of clipping of the sound. So I was left with pan. It took a while to get a good default, but a bit of googling around revealed one with a decent default. I first just tried turning sub + center up to one but in one or the other movie introduced the dreaded clipping. So I had to keep it down a bit while still retaining decent boost of center and sub. After an afternoon of testing I came to the following “magic” formula:

-channels 6 -af pan=2:0.4:0:0:0.4:0.2:0:0:0.2:0.3:0.3:0.1:0.1

Please do note that one needs to add a -channels 6 in order for mplayer to decode all 6 channels so that it can mix it down to two. One can read more about the pan filter here.


Streaming media between two linux boxes

I was wondering why it wasn’t possible to playback a movie over a ssh connection using remote X11 forwarding and mplayer. It seems that the latency is simply just too high. I’m not exactly sure if it’s a ssh or a X problem. This was on a wireless link, which might be part of the problem. While researching the problem I found this pretty cool patch for openssh that should give better transfer speeds. It’s in gentoo as the hpn use flag (even a patch for openssh 5.2). Sadly it did not seem to solve the problem. The movie was still very laggy. Then I tried adding a -C to add compression. This help a bit, but it was still painfully slow and uses quite a bit more cpu on the server side. Also the sounds will come out on the server end, so this might not work very well if you’re not in the same machine as the server 🙂

Back to the drawing board it seems… I found this excellent post on how to stream movies from a server to a Nokia 800 tablet with size conversion done on the fly at the server end. This script is pretty clever and truly UNIX style. It uses netcat to pipe the data from the server to the client, and just sticks a ffmpeg in front to scale the movie first. What is perfect about this solution is that it uses very little cpu (very good for small devices like the Nokia tablets) and it streams the sound to the client. The only downside seems to be that the data is not encrypted. But of course there are ways around that too if you really care.

On the client (mine is do this:

nc -l -p 5000 | mplayer –

And on the server side to this:

cat /movies/nice-movie.avi | nc 5000