4

我被困在这个我根本不舒服的领域工作。

这是我到目前为止所做的:

  • 制作了一台 Ubuntu VirtualBox 机器
  • 下载最新的 ffmpeg 版本,即 2.3.3
  • 编译 ffmpeg 以与 armv7-a 兼容,所以最后我得到两个文件夹:include 和 lib。在包含我的头文件和库中 *.so 文件(就像在http://www.roman10.net/how-to-build-ffmpeg-with-ndk-r9/中一样)

在此处输入图像描述

我创建了一个新的 android 项目并创建了一个 jni 文件夹,这就是我走了多远......即使如此,所有的斗争都是 linux 的新手和编译,我花了将近一周的时间才达到。

在 ffmpeg 中添加水印我相信它是在 libavfilter 上完成的?我必须深入研究这个问题,但是我需要翻译成我的项目的原始 ffmpeg 是:

ffmpeg -i input.avi -i logo.png -filter_complex 'overlay=10:main_h-overlay_h-10' output.avi

就我现在正在学习而言,我需要在 jni 内部做:

  • 创建一个 add_watermark.c 文件,我需要在其中以某种方式调用执行过滤器覆盖调用的函数
  • 创建 Android.mk 来加载它和 ffmpeg 所需的库

    LOCAL_PATH := $(调用我的目录)

    包括 $(CLEAR_VARS)

    LOCAL_MODULE := 添加水印

    LOCAL_SRC_FILES := 添加水印.c

    LOCAL_LDLIBS := -llog -ljnigraphics -lz

    LOCAL_SHARED_LIBRARIES := libavformat libavcodec libswscale libavutil

    包括 $(BUILD_SHARED_LIBRARY)

    $(调用导入模块,ffmpeg-2.3.3/android/armv7-a)

  • 创建应用程序.mk

    APP_ABI := armeabi-v7a

    APP_PLATFORM := android-8

  • 运行 ndk-build 并在我的 android 项目中使用生成的库。

我真的需要帮助才能继续,所以每一个答案都得到了极大的关注和乐趣。

稍后编辑:是否有可能以某种方式将 ffmpeg.exe 构建为库并使用与原始 exe 完全相同的参数调用其 main ?我不想将 ffmpeg 作为独立的可执行文件运行,而是将其集成到项目中。http://www.roman10.net/how-to-port-ffmpeg-the-program-to-androidideas-and-thoughts/这种方法有什么缺点?

稍后编辑 2:如果可以通过使用 MediaMuxer 或 android 4.3 中添加的其他 API 来实现,我愿意为您提供示例代码。我确实查看了 MediaCodec 和 MediaMuxer 示例以及 Grafik,但没有找到合适的方法来做我想做的事。如果可行,我更喜欢 ffmpeg 方法

4

4 回答 4

1

ffmpeg 不是世界上最容易使用的库。一件事是使用他们的预编译可执行文件(正如您所做的那样,使用 ffmpeg),另一个完全不同的是使用他们的库在您自己的应用程序中包含多媒体支持。

我建议您遵循本教程:

http://dranger.com/ffmpeg/tutorial01.html

它已经很老了,有些功能已经被弃用或根本不存在,但谷歌搜索一下会告诉你哪些新功能是你需要的。

在本教程中,您将能够播放视频文件,包括音频和视频。本教程还需要 SDL 库,以便能够通过声卡播放声音。

一旦你能够做到这一点,那么你将需要将位图重叠在视频上,从你调用 ffmpeg 开始,我认为这可能是通过某种过滤器完成的(我不确定这一点)。

另外,既然你说你是 linux 新手,我建议你留在 Windows 上。有一些漂亮的库可以用 C++ 和 Android(即 Qt)开发,它们或多或少容易设置并将一些基本示例交叉编译到 Android。使用这些库,您可以为 Android 构建 ffmpeg 并告诉您的整个项目您的库在哪里,因此它们会自动包含在 .apk 中。

但此外,您也可以先为 PC 编译并查看结果,直到得到您期望的结果。只有这样,您才能进入 Android 世界并在那里进行最终测试。

总而言之,我的工作流程如下:

  1. 留在 Windows 中,因此您不会遇到与操作系统相关的问题。
  2. 使用一些允许您为 Android 编译 C / C++ 代码的 IDE / 库(我建议 Qt)
  3. 为 PC 和 Android 构建 ffmpeg 库。3b。为 PC 和 Android 构建 SDL 库(以便您可以看到和听到视频)。
  4. 浏览教程并在 PC 上设置基本的视频播放器。
  5. 添加您的位图修改等 PC。
  6. 交叉编译到 Android 并进行最终修改(如果需要)。
于 2014-09-11T18:02:31.853 回答
1

https://github.com/rowntreerob/android-ffmpeg/blob/master/Project/src/com/b2bpo/media/notes/RecorderActivity.java

您可以尝试从上面提取方法“onFfmpegButton()”,重置您想要用于 ffmpeg 的实际 CLI 参数,集成 JNI 调用 - 不是独立的 - 并查看它是否合并了您需要的照片。

如果您只想了解有关 ffmpeg 的 JNI 集成的信息,请参阅 git 上的 halfninja 项目和该项目中的“videokit”文件夹,以了解 ffmpeg.main() 调用与 android JNI 的集成。

于 2014-09-12T16:41:44.397 回答
1

我已经成功地实现了你所需要的。虽然理论很简单,但实现细节使得运行起来非常困难。

您的解决方案从这里开始:在此处下载 halfninja 的项目:https ://github.com/halfninja/android-ffmpeg-x264 并按照说明进行操作。

一些注意事项:

  • 它不适用于较新版本的 ffmpeg,例如,您必须使用 git 子模块指向的 ffmpeg 版本。
  • 它不适用于较新的ndks。您必须安装他列出的那个(r5c)。

成功编译后,您将得到一个具有“运行”方法的 .so 库,您可以调用该方法以使用与命令行中相同的参数运行 ffmpeg。

还:

  • 上面的代码包含一个 ffmpeg.c 文件,它运行“main”方法,但使用全局变量。这意味着您的代码不会重入。两次调用 ffmpeg::main 将不起作用。完成后您必须自己添加初始化代码,或者创建第二个库,在 C 中动态加载该库并在完成后卸载它。
  • 生成的库会很大,因为它包含所有 ffmpeg 组件,并且会使您的 apk 膨胀。您必须更改构建文件以仅包含您需要的 ffmpeg 组件。例如更改configure_ffmpeg为使用minimal_featureset,并且--enable仅使用您需要的编解码器。

编辑:对于带 aac 的 mp4,请使用以下 configure_ffmpeg 文件:

--enable-muxer=mp4 --enable-encoder=libx264 --enable-libx264 \
--enable-encoder=h264 --enable-decoder=h264 --enable-demuxer=h264 --enable-muxer=h264 --enable-parser=h264 \
--enable-protocol=file \
--enable-hwaccels \
--enable-demuxer=mov --enable-decoder=aac --enable-decoder=aac_latm --enable-encoder=aac --enable-parser=aac --enable-demuxer=aac --enable-bsf=aac_adtstoasc \
--enable-encoder=aac --enable-parser=aac \
--enable-decoder=mpeg4 --enable-encoder=mpeg4 --enable-parser=mpeg4video --enable-demuxer=m4v"
于 2014-09-13T17:11:44.293 回答
1

最后,这是唯一帮助我完成完整构建并为我的项目获取工作库的教程:

https://enoent.fr/blog/2014/06/20/compile-ffmpeg-for-android/

于 2014-09-18T19:28:54.067 回答