美文网首页
AndroidStudio环境编译FFmpeg

AndroidStudio环境编译FFmpeg

作者: ana生 | 来源:发表于2018-12-05 12:08 被阅读0次

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

    准备:

    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 <string.h>
    /*
     * 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

          本文链接:https://www.haomeiwen.com/subject/czpicqtx.html