当前位置: 首页 > 知识库问答 >
问题:

在android中以库形式运行ffmpeg

钱志强
2023-03-14

我有一个简单的任务要做。我需要合并到一个视频使用ffmpeg在android环境下工作的图片集。

[Project]/jni/ffmpeg-build/armeabi-v7a/libffmpeg.so
[Project]/jni/ffmpeg-build/armeabi/libffmpeg.so
[Project]/jni/ffmpeg-build/mips/libffmpeg.so
[Project]/jni/ffmpeg-build/x86/libffmpeg.so

我还遵循了ndk示例,所以我从Java运行了c代码:

#include <string.h>
#include <jni.h>
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>    
#include <android/log.h>    
#include <stdlib.h>
#include <stdbool.h>

bool initted = false;    
static JavaVM *sVm;

jstring Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv* env, jobject thiz) {

    char **argv;
    char *cmd;
    int argc;

//  cmd = "ffmpeg -version";
//  argv = parsedargs(cmd, &argc);
//  ffmpeg(argc, argv);

    return (*env)->NewStringUTF(env, "Hello from JNI !");

}

我的问题是如何从我的“hello-jni”c-文件从ffmpeg运行函数。我已经读到,我需要在ffmpeg上编写一个包装器,我的hello-jni就是要这样做的。

这里是我的Android.mk,它可能是实现我的目标的重要部分,但老实说,我不明白这个文件中设置的一些行。或者只是我不知道如何让事情运转起来。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg-prebuilt
LOCAL_SRC_FILES := ffmpeg-build/$(TARGET_ARCH_ABI)/libffmpeg.so
LOCAL_EXPORT_C_INCLUDES := ffmpeg-build/$(TARGET_ARCH_ABI)/include
LOCAL_EXPORT_LDLIBS := ffmpeg-build/$(TARGET_ARCH_ABI)/libffmpeg.so
LOCAL_PRELINK_MODULE := true
include $(PREBUILT_SHARED_LIBRARY)


include $(CLEAR_VARS)
LOCAL_ALLOW_UNDEFINED_SYMBOLS=true
LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/ffmpeg-build/$(TARGET_ARCH_ABI)/include
LOCAL_SHARED_LIBRARY := ffmpeg-prebuilt
#LOCAL_CFLAGS += -g -Iffmpeg-prebuilt -Ihello-jni -Wno-deprecated-declarations 
#LOCAL_LDLIBS += -llog -lz -landroid ffmpeg-build/$(TARGET_ARCH_ABI)/libffmpeg.so 

include $(BUILD_SHARED_LIBRARY)

我希望有人能帮助我:)。

共有1个答案

时恩
2023-03-14

https://github.com/halfninja/android-ffmpeg-x264/blob/master/project/jni/videokit/uk_co_halfninja_videokit_videokit.c

看看'jni_call...'在上面的链接中。这就是如何从Android中调用'ffmpeg.main()'的包装器。

https://github.com/halfninja/android-ffmpeg-x264/blob/master/project/jni/videokit/ffmpeg.c

使用上面的链接,在最后找到'main()'。这是对FFMPEG.c(记录器为Java/Android ndk而改变)略有改动的例子。

如果您研究了这些示例,您应该会了解如何在其他项目中包装FFMPEG.Main()如果您想使用它的话。记录器的问题在这一点上是没有意义的,所以git上更现代的[android-ffmpeg]项目可以将ffmpeg.c开箱即用,并与JNI一起使用。你唯一需要改变的就是main()末尾的exit()。

 类似资料:
  • systemd 方式 在 terminal 中执行以下命令: sudo vim /etc/systemd/system/gitea.service 接着拷贝示例代码 gitea.service 并取消对任何需要运行在主机上的服务部分的注释,譬如 MySQL。 修改 user,home 目录以及其他必须的初始化参数,如果使用自定义端口,则需修改 PORT 参数,反之如果使用默认端口则需删除 -p

  • 我一直试图将一个maven项目打包到一个jar文件中,但它无法运行,因为javafx似乎有一个问题,下面是我的构建路径、项目结构(使用JavaFX14)和依赖关系 我尝试了两种方式来运行,第一种方式是使用提供的vm参数运行我的主应用程序文件。在ide中工作很好,但当试图作为jar文件运行时,会出现以下错误... 下一件我厌倦的事情是创建一个独立的主并从它运行,就像这样 有什么想法吗?

  • 我有很多用Java编写的cucumber .feature文件。 看起来它们是并行运行的。 我如何以单线程的方式一个接一个地运行cucumber测试? 运行测试配置为:

  • 寻求步骤混淆我的web项目(以.war的形式),它使用了GlassFish4。我正在尝试使用proguard工具。它成功地创建了模糊war,但在glassfish上部署它时失败了。 错误:远程失败:部署期间出错:加载应用程序时出现异常:java.lang.IllegalStateException:ContainerBase.AddChild:Start:org.apache.catalina.L

  • 我在玩OpenGL ES2和浮动缓冲区。实际上,我试图将处理顶点数据的FloatBuffer保存到一个二进制文件中。它似乎起作用了,但在读取浮点并将它们一起放回浮点缓冲区后,对象就被搞乱了。 为了从缓冲区保存浮点数据,我使用以下代码: 阅读: FloatBuffers的创建方式如下: 有人知道为什么会这样吗? 更新:我已经比较了写入和读取的数据,它们是相等的。问题仍然存在,这只是更令人困惑。

  • 除了可以在浏览器中通过URL调用一个 控制器 外,也可以通过命令行接口(CLI)调用。 什么是CLI? 为什么使用这种方式? 它如何工作? 什么是CLI? 命令行接口是一种基于文本的和计算机交互的方式。 如果想查看更详细说明,请看Wikipedia article. 为什么使用命令行? 虽然不是必须的,但在某些情况下我们会用到命令行 使用 cron 定时运行任务而不需要使用 wget 或 curl