Tôi có một nhiệm vụ đơn giản để thực hiện. Tôi cần phải hợp nhất tập hợp các hình ảnh vào một video bằng cách sử dụng ffmpeg làm việc trong môi trường Android.Chạy ffmpeg làm thư viện trong android
Sau hơn một tuần chiến đấu với các hướng dẫn và ví dụ khác nhau giải thích cách chạy ffmpeg biên dịch tôi có, giả sử, thành công trung bình. Cuối cùng tôi đã biên dịch ffmpeg cho android.
Tôi đã làm theo ví dụ sau: https://github.com/appunite/AndroidFFmpeg phù hợp nhất với tôi.
Như một kết quả của việc xây dựng ffmpeg một cấu trúc thư mục có sau:
[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
Tôi cũng theo các ví dụ ndk vì vậy tôi đã chạy mã c từ java:
#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 !");
}
Câu hỏi của tôi là làm thế nào để chạy hàm từ ffmpeg từ tệp "hello-jni" của tôi. Tôi đã đọc Tôi cần phải viết một wrapper trên ffmpeg mà hello-jni của tôi là dự định được.
Đây là Android.mk của tôi mà có lẽ là phần nhập khẩu để đạt được mục tiêu của tôi, nhưng thành thật mà nói tôi không hiểu một số dòng được đặt trong tệp này. Hoặc đơn giản là tôi không biết cách làm cho mọi thứ hoạt động.
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)
Một điều nữa. Tôi đã tìm thấy một ví dụ làm thế nào để bọc chức năng chính của ffmpeg. Nó sẽ là cách dễ nhất để sử dụng ffmpeg cho tôi sinse Tôi không biết api ffmpeg của và tôi hy vọng nó có thể chạy ffmpeg theo cách này: Can FFmpeg be used as a library, instead of a standalone program?
Tóm lại, tôi nghĩ rằng vấn đề của tôi là do thiếu hoàn toàn của c/c + + kiến thức ở tất cả, đặc biệt là làm thế nào để sử dụng chạy bất kỳ chức năng từ thư viện .so.
Tôi hy vọng ai đó có thể giúp tôi :).
Bạn có thể thử các tệp nhị phân được nhóm trong [JavaCV] (http://code.google.com/p/javacv/). Ngoài ra còn có hướng dẫn về cách xây dựng chúng. –