www.cuiweiyou.com
www.gaohaiyan.com
本文参考:
http://www.roman10.net/2013/08/18/how-to-build-ffmpeg-with-ndk-r9/
http://blog.csdn.net/hejjunlin/article/details/52661331
http://blog.csdn.net/finewind/article/details/42214343
https://my.oschina.net/SunnyTime/blog/612612
一.安装MinGW
在windows下编译FFmpeg有MinGW、VS。这里用MinGW。
下载,https://sourceforge.net/projects/mingw/files/latest/download?source=files ,
安装到 D:\ProgramFiles\MinGW,
将Basic的项目全部右键 Mark,然后 Apply Changes 。
二.配置ffmpeg源码
下载源码,https://ffmpeg.org/download.html
使用winrar将这个bz2文件解压到本地,F:\space_android\sapce_ard\ffmpeg-3.3.1
1.修改configure文件
主要为了生成的so文件名符合习惯。
1 2 3 4 5 |
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)' LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"' SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)' SLIB_INSTALL_LINKS='$(SLIBNAME)' |
2.新建build_android.sh文件
注意第一行NDK路径,第二行平台选择,第三行工具集路径。
“--arch”和“cpu”的目标平台选择。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
NDK=D:/ProgramFiles/android-ndk-r11c-windows-x86_64 SYSROOT=$NDK/platforms/android-21/arch-arm TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64 function build_one { ./configure \ --prefix=$PREFIX \ --enable-shared \ --disable-static \ --disable-doc \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --disable-avdevice \ --disable-doc \ --disable-symver \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --target-os=linux \ --arch=arm \ --enable-cross-compile \ --sysroot=$SYSROOT \ --extra-cflags="-Os -fpic $ADDI_CFLAGS" \ --extra-ldflags="$ADDI_LDFLAGS" \ $ADDITIONAL_CONFIGURE_FLAG make clean make make install } CPU=arm PREFIX=$(pwd)/android/$CPU ADDI_CFLAGS="-marm" build_one |
3.在mingw中编译
运行D:\ProgramFiles\MinGW\msys\1.0\msys.bat,启动一个类linux控制台,切换路径,注意和win的不同。
继续,输入 ./build_android.sh 回车执行
这个过程比较长,完成后在目录下生成一个“android”文件夹
三.AndroidStudio中的编译
以上得到的还只是ffmpeg自己定义的方法的封装,为了简便一般还需进一步封装为自己容易使用的方法。以下即将自己的方法封装到新的so包中。
1.资源引入与自定义方法声明
AS创建项目,为了简单示例,直接在Aty里配置jni。使用“native”关键字声明调用ffmpeg功能的方法,在静态代码块引入用到的so包,注意so文件带有“lib”前缀,而引入时不带。
最后一行的“my-ffmpeg-test”是我们自定义的一个so文件名,即native声明的方法封装到的目标包。以下的努力都是为了生成这个包。
2.生成h文件
在Terminal面板,进入main目录,执行:
1 2 |
javah -d jni -encoding UTF-8 -classpath D:\ProgramFiles\android_sdk\platforms\android-21;java\ com.cuiweiyou.ffmpegtest.MainActivity |
-encoding UTF-8 防止编码错误
java\ 使用当前命令(javah)执行目录main下的java下的com.cuiweiyou.ffmpegtest.MainActivity作为生成h文件的源。
还是在main下,会生成一个jni目录,里面的h文件,文件名即java源文件点路径的规则改变。
app/src/main/jni/com_cuiweiyou_ffmpegtest_MainActivity.h
此时可以将之前生成的 F:\space_android\sapce_ard\ffmpeg-3.3.1\android\arm\ lib目录下的so文件放入,以及 include目录下的h文件。这里直接将include下的全部目录拷入。
3.实现c代码
使用h文件的文件名,创建一个c文件,并实现声明的方法。这里参考网络代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
#include "com_cuiweiyou_ffmpegtest_MainActivity.h" #include "libavcodec/avcodec.h" #include <stdio.h> #include <android/log.h> #ifdef __cplusplus extern "C" { #endif #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #ifdef __cplusplus } #endif /* * Class: com_cuiweiyou_ffmpegtest_MainActivity * Method: avcodecinfo * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_cuiweiyou_ffmpegtest_MainActivity_avcodecinfo (JNIEnv *env, jobject jobj) { char info[40000] = { 0 }; av_register_all(); // 这里是ffmpeg的so文件里的方法 AVCodec *c_temp = av_codec_next(NULL); // 这里是ffmpeg的so文件里的方法 while(c_temp!=NULL){ if (c_temp->decode!=NULL){ sprintf(info, "%s[Dec]", info); } else{ sprintf(info, "%s[Enc]", info); } switch (c_temp->type){ case AVMEDIA_TYPE_VIDEO: sprintf(info, "%s[Video]", info); break; case AVMEDIA_TYPE_AUDIO: sprintf(info, "%s[Audio]", info); break; default: sprintf(info, "%s[Other]", info); break; } sprintf(info, "%s[%10s]\n", info, c_temp->name); c_temp=c_temp->next; } return (*env)->NewStringUTF(env, info); } |
4.ndk配置
在gradle.properties文件下加入,防止ndk版本低错误(可选):
1 |
android.useDeprecatedNdk=true |
在local.properties配置ndk路径,可使用sdk默认内置的ndk(可选):
1 |
ndk.dir=D\:\\ProgramFiles\\android-ndk-r11c-windows-x86_64 |
在app主module的build.gradle文件下加入:
1 2 3 4 5 6 7 |
android { defaultConfig { // 目标so名称 ndk{ moduleName "my-ffmpeg-test" // Aty中定义的目标so文件名 } |
5.生成Android.mk文件
菜单栏,Build,Rebuild Project。
从app/build/intermediates/ndk/debug/Android.mk,拷贝到app/src/main/jni/下,需要修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
LOCAL_PATH := $(call my-dir) #必须的ffmpeg的so文件 include $(CLEAR_VARS) LOCAL_MODULE := avcodec LOCAL_SRC_FILES := libavcodec-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 := 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,自定义的目标so文件 include $(CLEAR_VARS) LOCAL_MODULE := my-ffmpeg-test LOCAL_SRC_FILES := com_cuiweiyou_ffmpegtest_MainActivity.c #头文件搜索路径,这里指定为本mk文件所在目录 LOCAL_C_INCLUDES += $(LOCAL_PATH) #附加的链接器选项 LOCAL_LDLIBS := -llog -lz LOCAL_SHARED_LIBRARIES := avcodec avfilter avformat avutil swresample swscale include $(BUILD_SHARED_LIBRARY) |
此时的jni目录
6.ndk编译
如果将NDK配置在了环境变量,可以直接调用ndk-build.cmd,否则就使用全路径
在main里生成libs和obj两个目录,libs里就是我们需要的so文件了。
四.使用
到这里可以将新生成的app/src/main/libs/armeabi目录放入到app/libs里,系统默认加载使用;或者配置app/build.gradle文件
1 2 3 4 5 6 7 8 9 10 |
android { // 指定动态库路径 sourceSets{ main{ jni.srcDirs = [] jniLibs.srcDir 'src/main/libs' } } } |
然后进行潇洒即可
1 2 3 4 5 6 7 8 |
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); avcodecinfo(); // 调用native定义的方法 } |
-end
本文由崔维友 威格灵 cuiweiyou vigiles cuiweiyou 原创,转载请注明出处:http://www.gaohaiyan.com/2163.html
承接App定制、企业web站点、办公系统软件 设计开发,外包项目,毕设