android - 在 android 中将 ffmpeg 作为库运行

标签 android c android-ndk ffmpeg dynamic-linking

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

在与不同的教程和示例进行了一个多星期的斗争之后,这些教程和示例解释了如何运行编译 ffmpeg,可以说,我取得了中等成功。我终于为 android 编译了 ffmpeg。

我按照这个例子: https://github.com/appunite/AndroidFFmpeg 哪个最适合我。

作为构建 ffmpeg 的结果,具有以下目录结构:

[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)

还有一件事。我找到了一个如何包装 ffmpeg 的主要功能的示例。这对我来说是使用 ffmpeg 的最简单方法,因为我不知道 ffmpeg 的 api,我希望可以这样运行 ffmpeg: Can FFmpeg be used as a library, instead of a standalone program?

总而言之,我认为我的问题是由于完全缺乏 c/c++ 知识,尤其是如何使用运行 .so 库中的任何函数。

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

最佳答案

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()”。

关于android - 在 android 中将 ffmpeg 作为库运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15065931/

相关文章:

c - 这段代码的复杂度(Big O)顺序是多少

Windows 7 上的 Android NDK 环境变量

c - 为什么索引从 'C' 中的零开始?

c++ - 内核驱动程序读取内存未发送整个字符串

c - ndk 文件名或扩展名太长

c++ - 为 FBReader 编译 NDK 库时出错

java - ImageView 填充空白 ViewPager Android

android - 如何将语音识别与我的相机应用程序集成?

java - 我尝试使用 Retrofit 将 JSON 解析为 Java

java - 如何在android中的字符串中添加@符号?