2013-02-25 24 views
7

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 :).

+0

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. –

Trả lời

5

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

Nhìn vào 'JNI_Call ...' trong liên kết ở trên. Đó là cách gọi trình bao bọc cho 'ffmpeg.main()' từ Android.

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

liên kết sử dụng ở trên và tìm 'main()' ở cuối cùng. Đây là ví dụ về phiên bản thay đổi rất nhỏ của ffmpeg.c (logger thay đổi cho java/android ndk).

Nếu bạn nghiên cứu các mẫu này, bạn sẽ có cảm giác về cách bao bọc ffmpeg.main() trong một trong các dự án khác nếu bạn muốn sử dụng nó. Vấn đề logger là tranh luận vào thời điểm này vì vậy các dự án [android-ffmpeg] hiện đại hơn trên git chỉ có thể làm cho ffmpeg.c ra khỏi hộp và sử dụng nó với JNI. Điều duy nhất bạn có thể vẫn phải thay đổi là 'exit()' ở cuối main().

+0

Xin chào Robert, tôi đang cố gắng biên dịch phiên bản LGPL của ffmpeg cho android và đang theo dõi bài đăng này. Tuy nhiên, tôi không hiểu lý do tại sao bạn đã đề cập rằng tôi vẫn phải thay đổi là exit() ở cuối của chính(). Trong dự án halfninja họ vẫn có exit_program (0) ở đó, phải không? Tại sao nó được yêu cầu để thực hiện thay đổi và những gì tôi nên thay đổi nó để ?? – scooby

+0

phiên bản halfninja của mô-đun con ffmpeg là 'd0A2 ...' là u dùng cam kết đó ... KHÔNG. vì vậy nhận xét sẽ không áp dụng cho bạn và ffmpeg của bạn. –

+0

Thực ra tôi đang cố gắng sử dụng ffmpeg để nén video. Nhưng kể từ khi bạn đã đề cập rằng tôi cần phải thay đổi lối ra vào cuối của chính(), đó là lý do tôi tự hỏi tại sao tôi cần phải làm như vậy? những gì có thể là hậu quả nếu tôi sử dụng chính ffmpeg.c() như nó được. ?? – scooby