Android上的FFmpeg

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

  1. 你有没有在Android / StageFright上集成FFmpeg的步骤/过程/代码/例子?

  2. 你可以请指导我如何使用这个库进行多媒体播放?

  3. 我有一个要求,我已经有audio和video传输stream,我需要饲料到FFmpeg并获得解码/渲染。 我怎样才能在Android上做到这一点,因为IOMX API是OMX的基础,不能在这里插入FFmpeg?

  4. 另外,我无法find需要用于播放的FFmpeg API的文档。

以下是我在获得ffmpeg在Android上的工作所经历的步骤:

  1. 为Android构buildffmpeg的静态库。 这是通过使用Android构build系统构buildolvaffe的ffmpeg android端口( libffmpeg )来实现的。 只需将来源放在/外部, make放开。 您需要从Android构build中提取仿生(libc)和zlib(libz),因为ffmpeg库依赖于它们。
  2. 使用Android NDK创build一个包装ffmpegfunction的dynamic库。 关于如何使用NDK有很多文档。 基本上你需要编写一些C / C ++代码来将你需要的function从ffmpeg导出到一个库中,Java可以通过JNI与之交互。 NDK允许您轻松链接您在步骤1中生成的静态库,只需在Android.mk中添加一行类似于此的代码: LOCAL_STATIC_LIBRARIES := libavcodec libavformat libavutil libc libz

  3. 使用Java源代码中的ffmpeg-wrappingdynamic库。 在那里有足够的JNI文档,你应该没问题。

关于使用ffmpeg进行播放,有很多例子(ffmpeg二进制本身就是一个很好的例子), 这里是一个基本的教程。 最好的文档可以在标题中find。

祝你好运 :)

出于各种原因,多媒体在不牺牲效率的情况下实现任务并不容易。 ffmpeg是一项日复一日的努力。 它支持不同格式的编解码器和容器。

现在回答如何使用这个库的问题 ,我想说在这里写它并不那么简单。 但我可以通过以下方式引导你。

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

2)海豚玩家是Android的开源项目。 目前它有bug,但开发人员正在不断的工作。 在那个项目中,您已经准备好了整个设置,您可以继续调查。 这是从code.google.com 项目的链接,或者在terminal运行命令“ git clone https://code.google.com/p/dolphin-player/ ”。 你可以看到两个名为P和P86的项目。 你可以使用其中任何一个。

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

很less的基础:当我们说一个video文件,例如AVI,它是audio和video的结合

video文件=video+audio


video=编解码器+ Muxer + Demuxer

编解码器=编码器+解码器

=> video=编码器+解码器+ Muxer +分路器(Mpeg4 + Mpeg4 + avi + avi – avi容器示例)


audio=编解码器+ Muxer +分离器

编解码器=编码器+解码器

=> audio=编码器+解码器+复用器+分离器(mp2 + mp2 + avi + avi – avi容器示例)


编解码器(名称来自en * co * der / * dec * oder的组合)仅仅是定义用于对帧进行编码/解码的algorithm的格式的一部分。 AVI不是一个编解码器,它是使用Mpeg4的video编解码器和mp2的audio编解码器的容器。

复用器/解复用器用于组合/分离来自编码/解码时使用的文件的帧。

所以,如果你想使用AVI格式,你需要启用video组件+audio组件。

例如,对于AVI,你需要启用以下。 mpeg4编码器,mpeg4解码器,mp2编码器,mp2解码器,avi muxer,avi分路器。

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) 

希望我白痴不要混淆你这一切…

谢谢,需要任何帮助,请让我知道。

我发现最容易构build,易于使用的实现是由guardianproject团队完成的: https : //github.com/guardianproject/android-ffmpeg

我做了一个小项目,使用Android NDKconfiguration和构buildX264和FFMPEG。 缺less的主要是一个体面的JNI接口,使它可以通过Java访问,但这是相当容易的部分。 当我把JNI接口转化为自己的用途时,我会把它推入。

与olvaffe的构build系统相比,它不需要Android.mk文件来构build库,它只是使用常规的makefile和工具链。 这使得从FFMPEG或X264进行新的更改时停止工作的可能性更小。

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

为了使我的FFMPEG应用程序,我用这个项目( https://github.com/hiteshsondhi88/ffmpeg-android-java )所以,我不必编译任何东西。 我认为这是在我们的Android应用程序中使用FFMPEG的简单方法。

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

受到其他Android平台(主要是guadianproject )FFmpeg的启发,我find了一个解决scheme(也支持Lame)。

(跛脚和FFmpeg: https : //github.com/intervigilium/liblame和http://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: // ie // write id3 tags, // calls the media scanner, // etc. } } @Override public void processNotStartedCheck(boolean started) { if (!started) { // Audio job error, as above. } } } 

奇怪的是,这个项目还没有提到: 来自Appunite的AndroidFFmpeg

它有相当详细的分步说明复制/粘贴到命令行,像我这样的懒惰的人))

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

https://github.com/madhavanmalolan/ffmpegandroidlibrary