Android FFMPEG音视频开发(三)

本文参考:https://blog.csdn.net/leixiaohua1020/article/details/47008825

3.第一个FFMPEG App

FFMPEG是用C语言实现的,所以在学习这一章时,需要对JNI和NDK有一定的了解,当然,C,C++也得会一点。

如果都不会的话,可以先看看我前面的文章,补充点基础知识:Android JNI与NDK(一)

本节不会涉及太多FFMPEG的知识,毕竟刚开始,本节只是跑通整个流程,剩下的就是学习FFMPEG框架,熟练使用。所以本节是很重要的,也是建立Android FFMPEG音视频开发自信的第一步。

public class MainActivity extends AppCompatActivity {

    private TextView mTextView;

    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("jni-start");
    }

    public native String stringFromJNI();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextView = findViewById(R.id.textView);
        mTextView.setText(stringFromJNI());
    }

}

Java代码在本节就这一点,剩下的都是C++代码。上面代码很简单,首先是在staic代码块中加载使用的so库,接着定义了一个native方法,最后再调用这个native方法。简洁,优雅,易懂。

Android FFMPEG音视频开发(三)_第1张图片
上图是jni文件夹的结构图。所有有关JNI的东西都在这个文件中,结构图中的文件可以分为4类。第一类是jni/include文件夹中的内容,这里面全是so库的h文件。第二类是我们编译出的FFMPEG的so库文件。第三类是mk文件,也就是编译规范,用来生成so库等文件,第四类是我们自己写的c++文件。

它们之间的关系应该很明显,我们根据h文件FFMPEG的so文件调用API编写c++文件,然后根据mk文件,编译出我们自己的so文件。

#include 
#include 
#include 

#ifdef __cplusplus
extern "C"{
#endif

#include "libavcodec/avcodec.h"

    jstring Java_com_xupt_will_ffmpegtest_MainActivity_stringFromJNI(JNIEnv *env,jobject thiz){
        char info[10000] = {0};
        sprintf(info, "%s\n", avcodec_configuration());
        return env->NewStringUTF(info);
    }

#ifdef __cplusplus
}
#endif
LOCAL_PATH := $(call my-dir)

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)

include $(CLEAR_VARS)
LOCAL_MODULE := jni-start
LOCAL_SRC_FILES := Start.cpp
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)
APP_ABI := armeabi-v7a

你可能感兴趣的:(Android)