How to Port ffmpeg (the Program) to Android–Ideas and Thoughts
Why ffmpeg for Android and The App
I was working on a project that requires transcoding of video files and then play these files on Android device. The definite tool to do this is ffmpeg. I can do it on Desktop and transfer the files to Android, but why not just transcode on Android itself?
Then I searched for ffmpeg and transcoding tools on Android, but cannot find any. And since I’ve built ffmpeg libraries for Android before, I believe it is also doable to port the ffmpeg command line utility to Android. So I started doing it.
Below is the screen capture of the Android app (I released it as ffmpeg for Android Beta),
Figure 1. Screenshots of ffmpeg for Android
Currently it only supports armv7 processor, the one that my Nexus One device uses.
How did I Port it?
The main design goal is to change as few lines of code as possible for ffmpeg.c file. To meet this goal, I decoupled the UI and ffmpeg processing into two processes.
Running ffmpeg on a separate processes has a few advantages,
- ffmpeg uses a lot of exit function, which will terminate the process. Use a separate process for ffmpeg will ensure the termination of ffmpeg won’t affect the front UI.
- ffmpeg is processing intensive, running it on a separate process will not affect the responsiveness of front UI.
There’s inter-process communication problem to solve (IPC) so the two processes can communicate with each other. The UI will be able to start and stop ffmpeg, and ffmpeg will send output message to UI.
From UI to ffmpeg is simple, I implement a service that will call ffmpeg. And we start the service using Intent. It’s the same for stop command.
From ffmpeg to UI, there’re a few choices. pipe, socket, etc. But since it requires only a very simple one way communication channel (ffmpeg write, UI read), I just use text files. ffmpeg dump all outputs to text files, and UI read it every second or two (you can also use file observer and update the UI only when the text files changes).
What are the Changes for ffmpeg.c
With the design above, the change for ffmpeg.c is simple.
- Change the main(int argc, char **argv) function prototype to a java JNI interface prototype that Android java code can call.
- Change the output to stdout to the text files we created.
- Comment out a few lines that cause the compilation error.
A little More Thoughts
I’m thinking this method can be used to port lots of other applications to Android too. Two processes, running the background processing utility as a service, change the main method to an native interface so Java code can call, use intents and text files for communication, etc.
If you would like to try out this app, go to https://market.android.com/developer?pub=roman10. Note that it’s for armv7 processor only.
30 comments on “How to Port ffmpeg (the Program) to Android–Ideas and Thoughts”
Leave a Reply Cancel reply
40% Discount on My Book — Android NDK Cookbook
Android NDK Cookbook ebook 40% discount with promotion code MREANC40 at Packt Publishing The promotion code is valid until 15th June.Categories
- Android Apps (18)
- Android Audio Editor (1)
- TS 2 (3)
- Video Converter Android (8)
- Video2Gif (1)
- Android Tutorial (26)
- Android Dev Tools (1)
- API illustrated (8)
- Multimedia API (3)
- ffmpeg on Android (4)
- NDK (6)
- UI (5)
- Animation (1)
- Code Snippet (2)
- Coding Beyond Technique (18)
- a word, a world (4)
- Bug Rectified (4)
- Programming Habit (1)
- Software as a Career (1)
- Software as User Experience (1)
- Compilers and Related (2)
- ELF (2)
- Computer Languages (31)
- C/C++ (13)
- Java (9)
- JavaScript (2)
- PHP (1)
- Python (8)
- Data Structure & Algorithms (29)
- Bits (1)
- Data Structure (5)
- Integers (10)
- BigInteger (1)
- Prime (4)
- Search (3)
- Sorting (5)
- Strings (5)
- Database (1)
- SQLite (1)
- Digital Signal Processing (33)
- Distributed Systems (17)
- Apache Cassandra (6)
- Apache Hadoop (8)
- Apache Avro (3)
- Apache Nutch (3)
- Apache Solr (1)
- Linux Study Notes (40)
- crontab (1)
- Linux Kernel Programming (8)
- Linux Programming (12)
- IPC (2)
- Linux Network Programming (5)
- Linux Signals (2)
- Linux Shell Scripting (1)
- ssh (3)
- Machinery (30)
- misc (1)
- My Ideas (1)
- My Project (3)
- Mobile Caching (1)
- Selective Decoding (2)
- My Publication (1)
- My Readings (1)
- Networking (15)
- Program for Performance (8)
- Uncategorized (1)
- Virtual Machine (2)
- Web Dev (8)
- web components (3)
- Android Apps (18)
Recent Comments
Archives
- May 2013 (1)
- April 2013 (1)
- March 2013 (4)
- December 2012 (2)
- November 2012 (6)
- October 2012 (6)
- September 2012 (3)
- August 2012 (13)
- July 2012 (15)
- June 2012 (3)
- May 2012 (8)
- April 2012 (4)
- March 2012 (13)
- February 2012 (19)
- January 2012 (9)
- December 2011 (11)
- November 2011 (12)
- October 2011 (4)
- September 2011 (12)
- August 2011 (16)
- July 2011 (15)
- June 2011 (6)
- May 2011 (10)
- April 2011 (13)
- March 2011 (20)
- February 2011 (4)
- November 2010 (2)
- May 2010 (1)
- April 2010 (1)
- February 2010 (1)





ffmpeg.c:4624: error: no previous prototype for ‘Java_utm_fcim_BlaBlaActivity_mainn’
What this mean? how to do your that?Please reply me
please read about JNI
Hi,
I would like to capture current screen. I think use ffmpeg command is convenient.
Could you give me the source code of this examples?
My email is kephxwx@gmail.com
Thanks.
What did you comment out in the ffmpeg.c to let it works with Android. Are you using the NDK to compile ffmpeg.c? I used the NDK to compile but i met some compile errors? Could you say more detail for what you commented out, please?
Thanks
Hi,
Could you give me the source code of this examples?
My email is chetanansel24@gmail.com
Thanks.
The code is avaiable at http://roman10.net/src/affmpeg.zip.
Please note that I haven’t updated the code for a long time and don’t provide support for the code.
Hey, thx roman very much!
It’s very helpful that you also uploaded the code, but for some reason, when I tried it, it says “Error while opening encoder for output stream #0.1″
I also tries the same cmd line (the default one) in the app from the play store and it’s work ok.
Are there is any updates that you made?
thx again.
Hey, thx roman very much!
It’s very helpful that you also uploaded the code, but for some reason, when I tried it, it says “Error while opening encoder for output stream #0.1″
I also tries the same cmd line (the default one) in the app from the play store and it’s work ok.
Are there is any updates that you made?
thx again.
Hi,
i m using your code and able to run ffmpg commands, but i want to get callback that the command has been completed so that i can execute another command.
i want to perform a sequence of commands one after another..
please help me..
thanks