How to make Android to play raw AAC files (streams) ?
I've spent many hours by it and I want to save other's time to public what I found.
I tried to:
- invoke MediaPlayer on raw AAC http:// URL (error)
- invoke MediaPlayer on raw AAC file (error in emulator, OK on HTC Desire)
- pass a NetSocket FileHandle to MediaPlayer (error)
- filter the stream using local ServerSocket and:
- discard HTTP header (error)
- change content-type to several possibilities like audio/mpeg (error)
- sync ADTS header (icecast does not do it) (error)
- split the AAC stream into small file chunks (OK, but not excellent)
- use 3rd party native library (FAAD2) to decode AAC (OK on HTC Desire, working on emulator - but slow)
Using FAAD2 library works on my HTC Desire phone without problems. I tried 32kbit AAC stream served by www.play.cz (the exact URL you can find in the sources). It failed when trying 128kbit AAC stream served by the same server - but it also failed when using mplayer or when I saved it to a file and tried the internal HTC Desire's AAC player.
On the emulator it works, but it is not smooth (performance problems).
I tried Android 1.5 (cupcake) and Android 2.1 (Eclair) versions - both with the same results (working, but not perfect).
So the result is that playing raw AAC on Android devices (er even on the emulator) is possible, but there are several "buts":
- although Android contains AAC decoder, you cannot use it / access it natively
- if you create your own AAC decoder, then as a developer you must obtain a license from the patent holders - and you must pay for it
The sources you can find here:
I've added OpenCORE aacdec library/decoder and rewrote both Java and C parts of the player. Now I am able to play streams smoothly even on the emulator (using no more than 60% of my host CPU)!
You can download the sources and compiled shared libraries from the Downloads section (aacplayer-android-r20.zip).
How to compile it ? Just unzip the archive, edit local.properties, copy sample.ant.properties to .ant.properties (oh, yes in rev20 you must change the name of the property "loglevel" to "jni.loglevel") and run Apache Ant (beginners please consult Android SDK and NDK documentation - you need to have installed Apache Ant and GNU Make - Windows users also Cygwin). Or read the README file :-)
I've created a follow-up project "AACDecoder" which uses only OpenCORE aacdec library and allows using the working library in other 3rd party Android projects.
Thank you all for your feedback!