我已经在Android上编译了FFmpeg (libffmpeg.so)。现在我必须构建一个应用程序,如RockPlayer或使用现有的Android多媒体框架来调用FFmpeg。

你有在Android / StageFright上集成FFmpeg的步骤/过程/代码/示例吗? 你能指导我如何使用这个库来播放多媒体吗? 我有一个需求,我已经有音频和视频传输流,我需要将其馈送到FFmpeg并将其解码/渲染。我怎么能在Android上做到这一点,因为IOMX api是基于OMX的,不能在这里插件FFmpeg ? 我也找不到FFmpeg api的文档,需要用于回放。


当前回答

我做了一个小项目,使用Android NDK配置和构建X264和FFMPEG。主要缺少的是一个像样的JNI接口,可以通过Java访问它,但这是比较容易的部分(相对而言)。当我腾出时间使JNI接口适合我自己使用时,我将把它推进去。

与olvaffe的构建系统相比,它的优势在于不需要Android。Mk文件来构建库,它只使用常规的makefiles和工具链。这使得当你从FFMPEG或X264中做出新的改变时,它不太可能停止工作。

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

其他回答

由于各种原因,多媒体在不影响效率的情况下完成任务从来都不容易。Ffmpeg每天都在努力改进它。它支持不同格式的编解码器和容器。

现在要回答如何使用这个库的问题,我想说在这里编写它并不是那么简单。但我可以用以下方法指导你。

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

2) Dolphin player是一个面向Android的开源项目。目前它有bug,但开发人员正在持续工作。在该项目中,您已经准备好了整个设置,您可以使用它继续您的调查。这里有一个来自code.google.com的项目链接,或者在终端中运行命令“git clone https://code.google.com/p/dolphin-player/”。您可以看到两个名为P和P86的项目。你可以用它们中的任何一个。

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

基本要素: 当我们说一个视频文件,例如:avi,它是音频和视频的组合

视频文件=视频+音频


视频=编解码器+ Muxer + Demuxer

codec =编码器+解码器

=>视频=编码器+解码器+ Muxer + Demuxer(Mpeg4 + Mpeg4 +avi +avi - avi容器的示例)


音频=编解码器+ Muxer + Demuxer

codec =编码器+解码器

=>音频=编码器+解码器+ Muxer + Demuxer(mp2 + mp2 + avi + avi - avi容器示例)


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

Muxer/demuxer用于在编码/解码时从文件中合并/分离帧。

所以如果你想使用avi格式,你需要启用视频组件+音频组件。

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

噗嗤...

以编程方式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)

希望在这之后我没有让你更困惑…

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

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

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

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

https://github.com/madhavanmalolan/ffmpegandroidlibrary

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

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. 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 Use the ffmpeg-wrapping dynamic library from your java sources. There's enough documentation on JNI out there, you should be fine.

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

祝你好运。

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