Ubuntu编译调用FFmpeg so库Api方法例子

发表于

t0124cf926ea9205e45

作者:谭东

时间:2016年8月19日

环境: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项目,名字自己随意。

主要就是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 <string.h>
#include <jni.h>
#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

然后在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");
    }
}

运行即可。


文章评论
共收到 0 条评论