AndroidStudio环境编译FFmpeg

文末提供项目下载地址,可直接用

准备:

1.window10
2.cygwin(自行百度下载安装)
3.ffmpeg 3.3.9

1.切换到ffmpeg 3.3.9目录下,新建build_android_armeabi_armeabi-v7a.sh 和ffmpegtemp文件夹

build_android_armeabi_armeabi-v7a.sh内容如下:

#!/bin/bash
export TMPDIR=F:/ffmpeg/ffmpeg-3.3.9/ffmpeg-3.3.9/ffmpegtemp #这句很重要,不然会报错 unable to     create temporary       file in
# NDK的路径,根据自己的安装位置进行设置
NDK=D:/ndk/android-ndk-r14b-windows-x86_64/android-ndk-r14b
# 编译针对的平台,可以根据自己的需求进行设置
# 这里选择最低支持android-14, arm架构,生成的so库是放在
# libs/armeabi文件夹下的,若针对x86架构,要选择arch-x86
PLATFORM=$NDK/platforms/android-16/arch-arm
# 工具链的路径,根据编译的平台不同而不同
# arm-linux-androideabi-4.9与上面设置的PLATFORM对应,4.9为工具的版本号,
# 根据自己安装的NDK版本来确定,一般使用最新的版本
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64
function build_one
{

./configure \
--prefix=$PREFIX \
--target-os=linux \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--arch=arm \
--sysroot=$PLATFORM \
--extra-cflags="-I$PLATFORM/usr/include" \
--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
--disable-shared \
--enable-runtime-cpudetect \
--enable-gpl \
--enable-small \
--enable-cross-compile \
--disable-debug \
--enable-static \
--disable-doc \
--disable-asm \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-postproc \
--disable-avdevice \
--disable-symver \
--disable-stripping \
$ADDITIONAL_CONFIGURE_FLAG
sed -i '' 's/HAVE_LRINT 0/HAVE_LRINT 1/g' config.h
sed -i '' 's/HAVE_LRINTF 0/HAVE_LRINTF 1/g' config.h
sed -i '' 's/HAVE_ROUND 0/HAVE_ROUND 1/g' config.h
sed -i '' 's/HAVE_ROUNDF 0/HAVE_ROUNDF 1/g' config.h
sed -i '' 's/HAVE_TRUNC 0/HAVE_TRUNC 1/g' config.h
sed -i '' 's/HAVE_TRUNCF 0/HAVE_TRUNCF 1/g' config.h
sed -i '' 's/HAVE_CBRT 0/HAVE_CBRT 1/g' config.h
sed -i '' 's/HAVE_RINT 0/HAVE_RINT 1/g' config.h
make clean
make -j4
make install
$TOOLCHAIN/bin/arm-linux-androideabi-ld \
-rpath-link=$PLATFORM/usr/lib \
-L$PLATFORM/usr/lib \
-L$PREFIX/lib \
-soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o \
$PREFIX/libffmpeg.so \
libavcodec/libavcodec.a \
libavfilter/libavfilter.a \
libswresample/libswresample.a \
libavformat/libavformat.a \
libavutil/libavutil.a \
libswscale/libswscale.a \
-lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
$TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a
}
# arm v7vfp
CPU=armv7-a
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
PREFIX=./android/$CPU-vfp
ADDITIONAL_CONFIGURE_FLAG=
build_one
2.运行cygwin,cd到ffmpeg 3.3.9目录下,运行如下命令:
./build_android_armeabi_armeabi-v7a.sh
do.png

期间会报一个警告,但并不影响


warning.jpg

耐心等待。。。。。
脚本执行完后,会在ffmepg根目录下生成android文件夹和config.h文件,说明编译成功..

3.新建一个as项目,在main目录下新建文件夹jni
4.新建一个类FFmpegRun
public class FFmpegRun {
public native static int run(String[] commands);
}

生成.h文件:


1.png

没有这个选项的可以去set里面配置:

File->Settings->External Tools->+


3.png

4.png

也可以通过命令行:

javah com.zlx.firstffmeg.FFmpegRun (注意:自己类的包名位置)

执行完成以后,刷新一下,src/main/java下会生成一个文件(根据项目不同的包名生成的文件名字不一样)com_zlx_firstffmeg_FFmpegRun.h

1.把该文件移动到jni目录下
2.把前面编译生成的libffmpeg.so移到jni目录下
3.复制FFmpeg源码文件 ffmpeg.h, ffmpeg.c, ffmpeg_opt.c, ffmpeg_filter.c,cmdutils.c, cmdutils.h, cmdutils_common_opts.h 到jni目录下。

在jni目录下手动创建三个文件
Android.mk
Application.mk
com_zlx_firstffmeg_FFmpegRun.c(根据项目不同的包名生成的文件名字不一样,对应上面的.h文件)

注意:部分文件需要需要改动:

修改ffmpeg.c和ffmpeg.h

1.找到ffmpeg.c,把int main(int argc, char argv) 改名为 int run(int argc, char argv)
2.找到ffmpeg.h, 在文件末尾添加函数申明: int run(int argc, char **argv);


2 (2).png

修改cmdutils.c 和 cmdutils.h

找到cmdutils.c中的exit_program函数,删掉函数中原来的内容, 添加 return ret;并修改函数的返回类型为int

修改前:
3.png

修改后:
4.png

找到cmdutils.h中exit_program的申明,也把返回类型修改为int。

修改前:
5.png

修改后:
6.png

Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := ffmpeg
LOCAL_SRC_FILES := libffmpeg.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeginvoke
LOCAL_SRC_FILES := com_zlx_firstffmeg_FFmpegRun.c ffmpeg.c ffmpeg_opt.c cmdutils.c ffmpeg_filter.c
LOCAL_C_INCLUDES := G:\ffmeg\ffmpeg-3.3.9
LOCAL_LDLIBS := -llog -lz -ldl
LOCAL_SHARED_LIBRARIES := ffmpeg

include $(BUILD_SHARED_LIBRARY)

LOCAL_C_INCLUDES的路径记得修改为你当前ffmepg文件夹的路径。
LOCAL_SRC_FILES第一个c文件的引用记得改为你当前jni下生成的c文件。

Application.mk:

APP_ABI := armeabi armeabi-v7a
APP_BUILD_SCRIPT := Android.mk
APP_PLATFORM := android-14

这里能够支持生成arm可用的so文件(不支持arm64)

com_zlx_firstffmeg_FFmpegRun.c:

#include "com_zlx_firstffmpeg_FFmpegRun.h"
#include "ffmpeg.h"
#include 
/*
 * Class:     com_example_ffmpeg_FFmpegKit
 * Method:    run
 * Signature: (Ljava/lang/String;)I
 */
JNIEXPORT jint JNICALL Java_com_zlx_firstffmpeg_FFmpegRun_run(JNIEnv *env,
    jclass obj, jobjectArray commands) {

int argc = (*env)->GetArrayLength(env, commands);
char *argv[argc];

int i;
for (i = 0; i < argc; i++) {
    jstring js = (jstring) (*env)->GetObjectArrayElement(env, commands, i);
    argv[i] = (char*) (*env)->GetStringUTFChars(env, js, 0);
}
return run(argc, argv);
}

第一行的include引用你当前jni下生成的.h文件
Java_com_zlx_firstffmpeg_FFmpegRun_run需要改成你项目对应的包名和方法名(聪明的你仔细看一下就知道这个规则)
上面就是jni目录所有的文件以及需要你手动改动的地方,一个都不能少,一个都不能错,如果出错,根据错误提示进行修改。

5.as打开terminal cd到jni目录下,执行:
ndk-build

注意在app gradle里面配置:

externalNativeBuild{
ndkBuild{
    path "src/main/jni/Android.mk"
}
}
5.png

出现如图所示,就说明编译成功!

来查看main目录下,会多出如下2个文件夹:

6.png

lib下的生成了对应框架下需要用到的so文件,把armeabi和armeabi-v7a两个文件夹考到jniLib或者main下面自己创建的libs文件夹下

使用notepad++同学注意右下角的编码,默认是window,要改成Unix

有些同学集成过程中可能会遇到各种问题,我也遇到过,我没把所有问题列举全,有遇到问题的欢迎提issue!
QQ群:633600411
第一天学习,希望共同进步!

下载地址

你可能感兴趣的:(AndroidStudio环境编译FFmpeg)