FFmpeg on Android

前端 未结 10 1776
谎友^
谎友^ 2020-11-22 03:09

I have got FFmpeg compiled (libffmpeg.so) on Android. Now I have to build either an application like RockPlayer or use existing Android multimedia framework to invoke FFmpeg

相关标签:
10条回答
  • 2020-11-22 03:18

    I've done a little project to configure and build X264 and FFMPEG using the Android NDK. The main thing that's missing is a decent JNI interface to make it accessible via Java, but that is the easy part (relatively). When I get round to making the JNI interface good for my own uses, I'll push that in.

    The benefit over olvaffe's build system is that it doesn't require Android.mk files to build the libraries, it just uses the regular makefiles and the toolchain. This makes it much less likely to stop working when you pull new change from FFMPEG or X264.

    https://github.com/halfninja/android-ffmpeg-x264

    0 讨论(0)
  • 2020-11-22 03:19

    Here are the steps I went through in getting ffmpeg to work on Android:

    1. Build static libraries of ffmpeg for Android. This was achieved by building olvaffe's ffmpeg android port (libffmpeg) using the Android Build System. Simply place the sources under /external and make away. You'll need to extract bionic(libc) and zlib(libz) from the Android build as well, as ffmpeg libraries depend on them.
    2. Create a dynamic library wrapping ffmpeg functionality using the Android NDK. There's a lot of documentation out there on how to work with the NDK. Basically you'll need to write some C/C++ code to export the functionality you need out of ffmpeg into a library java can interact with through JNI. The NDK allows you to easily link against the static libraries you've generated in step 1, just add a line similar to this to Android.mk: LOCAL_STATIC_LIBRARIES := libavcodec libavformat libavutil libc libz

    3. Use the ffmpeg-wrapping dynamic library from your java sources. There's enough documentation on JNI out there, you should be fine.

    Regarding using ffmpeg for playback, there are many examples (the ffmpeg binary itself is a good example), here's a basic tutorial. The best documentation can be found in the headers.

    Good luck :)

    0 讨论(0)
  • 2020-11-22 03:19

    Inspired by many other FFmpeg on Android implementations out there (mainly the guadianproject), I found a solution (with Lame support also).

    (lame and FFmpeg: https://github.com/intervigilium/liblame and http://bambuser.com/opensource)

    to call FFmpeg:

    new Thread(new Runnable() {
    
        @Override
        public void run() {
    
            Looper.prepare();
    
            FfmpegController ffmpeg = null;
    
            try {
                ffmpeg = new FfmpegController(context);
            } catch (IOException ioe) {
                Log.e(DEBUG_TAG, "Error loading ffmpeg. " + ioe.getMessage());
            }
    
            ShellDummy shell = new ShellDummy();
            String mp3BitRate = "192";
    
            try {
                ffmpeg.extractAudio(in, out, audio, mp3BitRate, shell);
            } catch (IOException e) {
                Log.e(DEBUG_TAG, "IOException running ffmpeg" + e.getMessage());
            } catch (InterruptedException e) {
                Log.e(DEBUG_TAG, "InterruptedException running ffmpeg" + e.getMessage());
            }
    
            Looper.loop();
    
        }
    
    }).start();
    

    and to handle the console output:

    private class ShellDummy implements ShellCallback {
    
        @Override
        public void shellOut(String shellLine) {
            if (someCondition) {
                doSomething(shellLine);
            }
            Utils.logger("d", shellLine, DEBUG_TAG);
        }
    
        @Override
        public void processComplete(int exitValue) {
            if (exitValue == 0) {
                // Audio job OK, do your stuff: 
    
                                // i.e.             
                                // write id3 tags,
                                // calls the media scanner,
                                // etc.
            }
        }
    
        @Override
        public void processNotStartedCheck(boolean started) {
            if (!started) {
                                // Audio job error, as above.
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-22 03:24

    The most easy to build, easy to use implementation I have found is made by theguardianproject team: https://github.com/guardianproject/android-ffmpeg

    0 讨论(0)
  • 2020-11-22 03:27

    For various reasons, Multimedia was and is never easy in terms of achieving the task without compromising on efficiency. ffmpeg is an effort in improving it day by day. It supports different formats of codecs and containers.

    Now to answer the question of how to use this library, i would say that it is not so simple to write it here. But i can guide you in following ways.

    1) Inside the ffmpeg directory of source code, you have output_example.c or api_example.c. Here, you can see the code where encoding/decoding is done. You will get an idea as to which API's inside ffmpeg you should call. This would be your first step.

    2) Dolphin player is a open source project for Android. Currently it is having bugs but developers are working continuously. In that project you have the whole setup ready which you can use to continue your investigation. Here is a link to the project from code.google.com or run the command "git clone https://code.google.com/p/dolphin-player/" in a terminal. You can see two projects named P and P86 . You can use either of them.

    Extra tip i would like to offer is that when you are building the ffmpeg code, inside build.sh you need to enable the muxers/demuxers/encoders/decoders of the formats you want to use. Else the corresponding code will not be included in the libraries. It took a lot of time for me to realize this. So thought of sharing it with you.

    Few Basics : When we say a video file, ex : avi, it is combination of both audio and video

    Video file = Video + Audio


    Video = Codec + Muxer + Demuxer

    codec = encoder + Decoder

    => Video = encoder + decoder + Muxer + Demuxer(Mpeg4 + Mpeg4 + avi +avi - Example for avi container)


    Audio = Codec + Muxer + Demuxer

    codec = encoder + Decoder

    => Audio = encoder + decoder + Muxer + Demuxer(mp2 + mp2 + avi + avi - Example for avi container)


    Codec(name is deriverd from a combination of en*co*der/*dec*oder) is just a part of format which defines the algorithms used to encode/decode a frame. AVI is not a codec, it is a container which uses Video codec of Mpeg4 and Audio codec of mp2.

    Muxer/demuxer is used to combine/separate the frames from a file used while encoding/decoding.

    So if you want to use avi format, you need to enable Video components + Audio components.

    Ex, for avi, you need to enable the following. mpeg4 Encoder, mpeg4 decoder, mp2 encoder, mp2 decoder, avi muxer, avi demuxer.

    phewwwwwww...

    Programmatically build.sh should contain the following code:

    --enable-muxer=avi --enable-demuxer=avi (Generic for both audio/video. generally Specific to a container)
    --enable-encoder=mpeg4 --enable-decoder=mpeg4(For video support)
    --enable-encoder=mp2 --enable-decoder=mp2 (For Audio support)
    

    Hope i idid not confuse you more after all this...

    Thanks, Any assistance needed, please let me know.

    0 讨论(0)
  • 2020-11-22 03:34

    I had the same issue, I found most of the answers here out dated. I ended up writing a wrapper on FFMPEG to access from Android with a single line of code.

    https://github.com/madhavanmalolan/ffmpegandroidlibrary

    0 讨论(0)
提交回复
热议问题