在android中运行ffmpeg作为库

前端之家收集整理的这篇文章主要介绍了在android中运行ffmpeg作为库前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个简单的任务要做.我需要使用在 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版本略有改动的例子(logger改为java / android ndk).

如果您研究这些示例,如果要使用它,您应该感觉如何在其他项目中包装ffmpeg.main().记录器问题在这一点上没有实际意义,因此git上更现代的[android-ffmpeg]项目可以使ffmpeg.c开箱即用并与JNI一起使用.您可能仍需要更改的唯一事情是main()最后的’exit()’.

猜你在找的Android相关文章