天天看點

linux下ffmpeg編譯成so檔案,Ubuntu編譯調用FFmpeg so庫Api方法例子

環境:Ubuntu 16.04 LTS最新版

NDK版本:android-ndk-r12b

FFMPEG版本:FFmpeg 3.0.2 “Einstein”

配置好Ubuntu的Android Studio後,我們接下來啟動和建立我們的FFMPEG程式吧。

Ctrl+Alt+T 啟動指令終端,跳轉到android-studio/bin目錄下,然後執行:$./studio.sh即可啟動我們的Android Studio了。

建立FFMPEG項目,名字自己随意。

linux下ffmpeg編譯成so檔案,Ubuntu編譯調用FFmpeg so庫Api方法例子

主要就是jni目錄了。include裡面包含我們的功能需要調用的.h和.c的頭檔案和源檔案。我們可以把之前編譯後的源碼裡的include拷貝進去即可。如果有其他的功能調用,可以加入對應的目錄的缺少的.h和.c檔案。

之後,将編譯好的ffmpeg的so庫放到jni目錄下。接下來在Jni目錄下建立ffmpeg-jni.c檔案,供我們寫自己的需求方法,調用ffmpeg,編譯另外的需要的so庫。

我這裡的ffmpeg-jni.c功能就是輸出ffmpeg相關配置資訊。

//

// Created by tandong on 16-8-19.

//

#include

#include

#include "libavcodec/avcodec.h"

jstring

Java_com_tandong_ffmpeg_MainActivity_stringFromJNI( JNIEnv* env,

jobject thiz )

{

char info[10000] = { 0 };

sprintf(info, "%s\n", avcodec_configuration());

return (*env)->NewStringUTF(env, info);

}

之後,建立Android.mk和Application.mk。

内容分别為:

LOCAL_PATH := $(call my-dir)

# FFmpeg library

include $(CLEAR_VARS)

LOCAL_MODULE := avcodec

LOCAL_SRC_FILES := libavcodec-57.so

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := avdevice

LOCAL_SRC_FILES := libavdevice-57.so

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := avfilter

LOCAL_SRC_FILES := libavfilter-6.so

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := avformat

LOCAL_SRC_FILES := libavformat-57.so

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := avutil

LOCAL_SRC_FILES := libavutil-55.so

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := postproc

LOCAL_SRC_FILES := libpostproc-54.so

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := swresample

LOCAL_SRC_FILES := libswresample-2.so

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := swscale

LOCAL_SRC_FILES := libswscale-4.so

include $(PREBUILT_SHARED_LIBRARY)

# Program

include $(CLEAR_VARS)

LOCAL_MODULE := ffmpeg-jni

LOCAL_SRC_FILES := ffmpeg-jni.c

LOCAL_C_INCLUDES += $(LOCAL_PATH)/include

LOCAL_LDLIBS := -llog -lz

LOCAL_SHARED_LIBRARIES := avcodec avdevice avfilter avformat avutil postproc swresample swscale

include $(BUILD_SHARED_LIBRARY)

有些人對.mk文法,不熟悉。請看谷歌文檔。

Application.mk内容:

APP_ABI=armeabi

linux下ffmpeg編譯成so檔案,Ubuntu編譯調用FFmpeg so庫Api方法例子

然後在Android Studio的Terminal下輸入指令。跳轉到jni所在目錄。輸入$NDK/ndk-build。前提你的ndk已經環境變量配置好。

這樣就編譯好so庫了。

把so庫拷貝到jniLibs目錄armeabi下。

MainActivity裡調用So庫。

package com.tandong.ffmpeg;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

private TextView tv_ffmpeg;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

tv_ffmpeg=(TextView)this.findViewById(R.id.tv_ffmpeg);

tv_ffmpeg.setText(stringFromJNI());

}

public native String  stringFromJNI();

static {

System.loadLibrary("avutil-55");

System.loadLibrary("avcodec-57");

System.loadLibrary("avformat-57");

System.loadLibrary("avdevice-57");

System.loadLibrary("swresample-2");

System.loadLibrary("swscale-4");

System.loadLibrary("postproc-54");

System.loadLibrary("avfilter-6");

System.loadLibrary("ffmpeg-jni");

}

}

運作即可。