版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Viiou/article/details/90523668
本文参考: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方法。简洁,优雅,易懂。
上图是jni文件夹的结构图。所有有关JNI的东西都在这个文件中,结构图中的文件可以分为4类。第一类是jni/include文件夹中的内容,这里面全是so库的h文件。第二类是我们编译出的FFMPEG的so库文件。第三类是mk文件,也就是编译规范,用来生成so库等文件,第四类是我们自己写的c++文件。
它们之间的关系应该很明显,我们根据h文件FFMPEG的so文件调用API编写c++文件,然后根据mk文件,编译出我们自己的so文件。
#include <jni.h>
#include <stdio.h>
#include <string.h>
#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