首页 文章

在Android上使用FFmpeg

提问于
浏览
190

我在Android上编译了FFmpeg(libffmpeg.so) . 现在我必须构建像RockPlayer这样的应用程序或使用现有的Android多媒体框架来调用FFmpeg .

  • 您是否有关于在Android / StageFright上集成FFmpeg的步骤/程序/代码/示例?

  • 能否指导我如何使用此库进行多媒体播放?

  • 我有一个要求,我已经有音频和视频传输流,我需要将其提供给FFmpeg并进行解码/渲染 . 我怎么能在Android上这样做,因为IOMX API是基于OMX的,不能在这里插入FFmpeg?

  • 此外,我找不到需要用于播放的FFmpeg API的文档 .

9 回答

  • 2

    以下是我在使用ffmpeg在Android上工作时所采取的步骤:

    • 为Android构建ffmpeg的静态库 . 这是通过使用Android Build System构建olvaffe的ffmpeg android端口(libffmpeg)来实现的 . 只需将源放在/ external和 make 之外 . 您还需要从Android构建中提取仿生(libc)和zlib(libz),因为ffmpeg库依赖于它们 .

    • 使用Android NDK创建包装ffmpeg功能的动态库 . 有需要编写一些C / C代码来将你需要的功能从ffmpeg导出到一个库中,java可以通过JNI进行交互 . NDK允许您轻松链接到您在步骤1中生成的静态库,只需向Android.mk添加与此类似的行: LOCAL_STATIC_LIBRARIES := libavcodec libavformat libavutil libc libz

    • 使用java源中的ffmpeg-wrapping动态库 . 关于JNI的文档很多,你应该没问题 .

    关于使用ffmpeg进行回放,有很多例子(ffmpeg二进制本身就是一个很好的例子),here是一个基本的教程 . 最好的文档可以在 Headers 中找到 .

    祝好运 :)

  • 102

    由于各种原因,多媒体在实现任务方面并且从不容易实现,而不会影响效率 . ffmpeg是一项日益改进的努力 . 它支持不同格式的编解码器和容器 .

    现在回答 how to use this library 的问题,我想说在这里写它并不是那么简单 . 但我可以在 following ways 指导你 .

    1)在源代码的ffmpeg目录中,您有 output_example.capi_example.c . 在这里,您可以看到完成编码/解码的代码 . 您将了解应该调用ffmpeg中的哪个API . 这将是你的第一步 .

    2)Dolphin播放器是Android的开源项目 . 目前它有bug,但开发人员正在不断努力 . 在该项目中,您已准备好整个设置,可用于继续调查 . 以下是code.google.com中project的链接或在终端中运行命令“ git clone https://code.google.com/p/dolphin-player/ ” . 您可以看到两个名为P和P86的项目 . 你可以使用它们中的任何一个 .

    我想提供的额外提示是,当你构建ffmpeg代码时,在build.sh中你需要启用你想要使用的格式的复用器/解复用器/编码器/解码器 . 否则相应的代码将不包含在库中 . 我花了很多时间才意识到这一点 . 所以想与你分享 .

    Few Basics : 当我们说视频文件时,例如avi,它是音频和视频的组合

    Video file = Video + Audio


    Video = Codec Muxer Demuxer

    codec =编码器解码器

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


    Audio = Codec Muxer Demuxer

    codec =编码器解码器

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


    编解码器(名称来自en * co * der / * dec * oder的组合)只是定义用于编码/解码帧的算法的格式的一部分 . AVI不是编解码器,它是使用Mpeg4的视频编解码器和mp2的音频编解码器的容器 .

    Muxer / demuxer用于将帧与编码/解码时使用的文件组合/分离 .

    因此,如果要使用avi格式,则需要启用视频组件音频组件 .

    例如,对于avi,您需要启用以下功能 . mpeg4编码器,mpeg4解码器,mp2编码器,mp2解码器,avi muxer,avi demuxer .

    phewwwwwww ...

    以编程方式build.sh应包含以下代码:

    --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)
    

    希望我在这一切之后不要混淆你...

    谢谢,需要任何帮助,请告诉我 .

  • 1

    我发现最容易构建,易于使用的实现是由theguardianproject团队制作的:https://github.com/guardianproject/android-ffmpeg

  • 3

    我做了一个小项目来使用Android NDK配置和构建X264和FFMPEG . 该缺少的主要是一个体面的JNI接口,使其可以通过Java访问,但这是容易的部分(相对) . 当我开始使JNI接口适合我自己的用途时,我会推动它 .

    olvaffe的构建系统的好处是它不需要Android.mk文件来构建库,它只使用常规的makefile和工具链 . 这使得从FFMPEG或X264中获取新更改时停止工作的可能性大大降低 .

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

  • 10

    为了制作我的FFMPEG应用程序,我使用了这个项目(https://github.com/hiteshsondhi88/ffmpeg-android-java),所以,我不喜欢在我们的Android应用程序中使用FFMPEG的简单方法 .

    有关http://hiteshsondhi88.github.io/ffmpeg-android-java/的更多信息

  • 5

    受到许多其他关于Android实现的FFmpeg的启发(主要是guadianproject),我找到了一个解决方案(也支持Lame) .

    (跛脚和FFmpeg:https://github.com/intervigilium/liblamehttp://bambuser.com/opensource

    打电话给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();
    

    并处理控制台输出:

    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.
            }
        }
    }
    
  • 11

    奇怪的是这个项目没有被提及:AndroidFFmpeg from Appunite

    它有非常详细的逐步说明,可以复制/粘贴到命令行,对于像我这样的懒人))

  • 2

    经过大量的研究,现在这是我发现的最新的Android编译库:

    https://github.com/bravobit/FFmpeg-Android

  • 63

    我有同样的问题,我发现这里的大部分答案都是过时的 . 我最终在FFMPEG上编写了一个包装器,用一行代码从Android访问 .

    https://github.com/madhavanmalolan/ffmpegandroidlibrary

相关问题