2013-02-25 63 views
7

我有一個簡單的任務來完成。我需要在Android環境中使用ffmpeg將一組圖片合併到視頻中。運行的ffmpeg作爲圖書館在android系統

了一個多星期的戰鬥與不同的教程和例子,說明如何運行編譯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這可能是importat部分實現我的目標,但老實說,我有些不明白,行此文件中設置。或者只是我不知道如何使事情發揮作用。

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我sinse我不知道的ffmpeg的API,我希望它可以運行的ffmpeg這種方式最簡單的方法: Can FFmpeg be used as a library, instead of a standalone program?

綜上所述,我想我的問題是由於完全缺乏的c/C++知識,尤其是如何使用.so庫運行任何函數。

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

+0

你可以嘗試在[JavaCV(http://code.google.com/p/javacv/)捆綁在一起的二進制文件。還有關於如何構建它們的說明。 – 2013-03-09 01:52:30

回答

5

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

使用上面的鏈接,找到 '主()' 在最後。這是ffmpeg.c的一個非常輕微改變的版本(對於java/android ndk改變的記錄器)的例子。

如果你研究這些樣品,你應該得到的感覺,如果你想用它如何包裝器ffmpeg.main()中的其他項目之一。 logger的問題目前尚無定論,所以git上更現代的[android-ffmpeg]項目可以使ffmpeg.c開箱即用,並且可以與JNI一起使用。唯一可能需要改變的是main()最後的'exit()'。

+0

嗨羅伯特,我想編譯android的ffmpeg的LGPL版本,我正在關注這篇文章。但是,我不明白你爲什麼提到我仍然需要改變main()的最後的exit()。在halfninja項目中,他們仍然在那裏有exit_program(0),對嗎?爲什麼需要進行更改,我應該將其更改爲? – scooby 2016-05-10 13:56:43

+0

fnmpeg子模塊的halfninja版本是'd0A2 ...'是否使用該提交... NO。所以評論不適用於你和你的ffmpeg。 – 2016-05-10 14:27:26

+0

其實我試圖使用ffmpeg進行視頻壓縮。但是既然你提到我需要改變main()的最後一個出口,這就是我想知道爲什麼我需要這麼做的原因嗎? 如果我按照原樣使用ffmpeg.c的main(),可能會有什麼後果。 ?? – scooby 2016-05-11 08:22:32