在Android上使用FFmpeg

Jag*_*Jag 202 android ffmpeg stagefright android-ffmpeg

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

  1. 你有关于在Android/StageFright上集成FFmpeg的步骤/程序/代码/示例吗?

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

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

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

yon*_*evy 107

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

  1. 为Android构建ffmpeg的静态库.这是通过使用Android Build System构建olvaffe的ffmpeg android端口(libffmpeg)来实现的.只需将信号源置于/外部和远离.您还需要从Android构建中提取仿生(libc)和zlib(libz),因为ffmpeg库依赖于它们.make
  2. 使用Android NDK创建包含ffmpeg功能的动态库.关于如何使用NDK,有很多文档.基本上你需要编写一些C/C++代码来将你需要的功能从ffmpeg导出到一个库中,java可以通过JNI进行交互.NDK允许您轻松链接到您在步骤1中生成的静态库,只需向Android.mk添加与此类似的行:LOCAL_STATIC_LIBRARIES := libavcodec libavformat libavutil libc libz

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

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

祝好运 :)

  • 这个答案有很多链接可以为Android构建ffmpeg.这仍然是最好的解决方案吗?Android Build System链接坏了 - 应该是什么?有一堆工具包可以帮助建立NDK.然而,它们都因为各种构建错误而失败,并且看起来有点老了.有没有理由为什么有人不能发布一个内置的静态ffmpeg库? (7认同)
  • 为了回答我自己的问题,我发现这个repo对于构建ffmpeg和JNI包装器最有用 - https://github.com/andynicholson/android-ffmpeg-x264 (7认同)

mk.*_*k.. 66

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

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

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

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

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

几个基础: 当我们说一个视频文件,例如AVI时,它是音频和视频的组合

视频文件=视频+音频


Video = Codec + Muxer + Demuxer

codec =编码器+解码器

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


Audio = Codec + Muxer + Demuxer

codec =编码器+解码器

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


编解码器(名称来自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)
Run Code Online (Sandbox Code Playgroud)

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

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

  • 当然..!!但我的在线状态有点低..除非非常需要,否则我不会登录到skype.你可以寄给我任何重要的事情.电子邮件:mantykuma@gmail.com (2认同)

Guy*_*Guy 13

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


Nic*_*ick 11

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

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

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


Ara*_*cem 9

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

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


jma*_*nso 6

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

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

  • 这个包装器非常非常非常慢.200个图像到视频需要50-60秒...但通常ffmpeg会在4-5秒内处理该任务. (3认同)