My goal was to record little snippets on both iPhone and Android, and share those files between users, on Facebook. As usual, I want old Android users (2.2+) and iPhone (3+) users to participate in this app.
I originally recorded in iPhone CAF, then realized the file size was ginormous. So I downgraded the sample rate. That worked fine. Then, realized Android could do nothing with this. I know, lack of planing, ya di ya di. I thought briefly of setting up a server to re-encode the CAF files for Android. Turns out, on banane.com (hosted by TigerTech) the FFMPEG installation is very vanilla and doesn’t use the right libraries.
But let’s look at Android- what can it do? So, using the AMR (THREE_GPP) format, I used MediaRecorder and that worked great. Nice small files, OK quality. Android is a pretty open architecture, so you can use another library, AudioRecorder (vs. MediaRecorder) to record in almost any format you want. Problem is, there are a lot of bells and whistles built into MediaRecorder that make it a simpler choice. With AudioRecorder, if you want to record in WAV, you have to -no joking- go bit by bit through the files and build your own audio file, with headers and data. It’s a lot of code. I went down this road for an hour than realized, I wanted to stay in the happy MediaRecorder world. So now- what can I do with AMR files? Turns out, not a helluva lot. New Android operating systems handle MP3, but the iPhone doesn’t record in that, and I wanted to support older Android versions.
Long story short- I finally figured out a solution:
1. Build Amazon EC2 instance
2. Install FFMPEG with AMR libraries
3. Record iPhone with PCM_16 audio format, and give it the “wav” file extension.
4. Upload to Amazon’s S3 service.
5. Record Android with AMR, and do conversion script:
a) Kick off, asynchronously, a conversion script on my EC2 instance
b) Script converts .3gp to .wav
c) Upload to Amazon’s S3 service.
Now, file is available as *.wav for both Android and iPhone users.
Setting up the Amazon EC2 server with FFMPEG and enable it with just the libraries I need (AMR). That took about 4-5 hours. And it’s not because I did anything wrong, I was actually pretty flawless (yay!) in my Linux installation. I can’t find the awesome tutorial I used to install FFMPEG (should have written this blog post weeks ago) but this one looks good: Justin Hartman’s Install FFMPEG
I made a few tactical changes to my apps. If you’re interested in doing this kind of thing, I recommend thinking about these things beforehand.
– What phones and operating systems you want to support, historically (old phones?)
– Playback vs. recording – is recording absolutely necessary?
– Streaming vs. simple file loading and playback
– Audio quality (speech is lower than, say, music)