zoukankan      html  css  js  c++  java
  • ffmpeg 编译Android

    环境 macOS 10.15.4    NDK 21.3.6528147   ffmpeg 4.2.3

    1.执行sudo xcodebuild -license,防止编译的时候找不到一些文件报错

    2.下载ffmpeg(4.2.3),解压后进入主目录,修改configure文件,找到

    SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
    LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
    SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
    SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR)$(SLIBNAME)'

    改为:

    SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
    LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
    SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
    SLIB_INSTALL_LINKS='$(SLIBNAME)'

    3.下载NDK,我这里直接在Android Studio上下载,路径在~/Library/Android/sdk/ndk/21.3.6528147 ,将NDK路径加入path

    编辑~/.bash_profile:

    NDK_HOME=~/Library/Android/sdk/ndk/21.3.6528147
    PATH=${PATH}:${NDK_HOME}
    
    export PATH
    export NDK_HOME

    执行source ~/.bash_profile,使得路径实时生效

    编译脚本android_llvm.sh

    #!/bin/sh
    # 测试通过 sh android_llvm.sh armv8-a   sh android_llvm.sh armv7a sh android_llvm.sh i686 sh android_llvm.sh x86-64

    NDK=${NDK_HOME}
    ANDROID_API=29
    # armv8-a armv7a aarch64 i686 x86_64
    CPU=armv8-a
    # arm aarch64 i686 x86_64
    ARCH=arm64
    PLATFORM=darwin-x86_64
    TOOLCHAIN=${NDK}/toolchains/llvm/prebuilt/${PLATFORM}


    #OPTIMIZE_CFLAGS="-march=$CPU"
    if [ "$#" -lt 1 ]; then
        CPU=armv8-a
    else
        CPU=$(tr [A-Z] [a-z] <<< "$1")
    fi
    case ${CPU} in
        arm|armv5|armv6|armv7|armeabi)
        echo ${CPU}
        ;;
        armv7a|armeabi-v7a)
        ARCH=arm
        CC=${TOOLCHAIN}/bin/armv7a-linux-androideabi${ANDROID_API}-clang
        CXX=${TOOLCHAIN}/bin/armv7a-linux-androideabi${ANDROID_API}-clang++
        CROSS_PREFIX=${TOOLCHAIN}/bin/arm-linux-androideabi-
        TOOLNAME_BASE=arm-linux-androideabi
        ;;
        hard|armv7a-hard|armeabi-v7a-hard)
        echo ${CPU}
        ;;
        neon|armv7a-neon)
        ;;
        armv8|armv8-a|aarch64|arm64|arm64-v8a)
        # 验证成功
        ARCH=arm64
        CC=${TOOLCHAIN}/bin/aarch64-linux-android${ANDROID_API}-clang
        CXX=${TOOLCHAIN}/bin/aarch64-linux-android${ANDROID_API}-clang++
        CROSS_PREFIX=${TOOLCHAIN}/bin/aarch64-linux-android-
        TOOLNAME_BASE=aarch64-linux-android
        ;;
        mips|mipsel)
        echo ${CPU}
        ;;
        mips64|mipsel64|mips64el)
        echo ${CPU}
        ;;
        i686)
        ARCH=x86
        CC=${TOOLCHAIN}/bin/i686-linux-android${ANDROID_API}-clang
        CXX=${TOOLCHAIN}/bin/i686-linux-android${ANDROID_API}-clang++
        CROSS_PREFIX=${TOOLCHAIN}/bin/i686-linux-android-
        TOOLNAME_BASE=i686-linux-android
        ;;
        x86-64|x64)
        ARCH=x86_64
        CC=${TOOLCHAIN}/bin/x86_64-linux-android${ANDROID_API}-clang
        CXX=${TOOLCHAIN}/bin/x86_64-linux-android${ANDROID_API}-clang++
        CROSS_PREFIX=${TOOLCHAIN}/bin/x86_64-linux-android-
        TOOLNAME_BASE=x86_64-linux-android
        ;;
    esac
    echo "CPU:${CPU}"
    echo "ARCH:${ARCH}"
    # mac下是darwin-x86_64,Windows是windows-x86_64

    #TARGET=${CPU}-linux-androideabi
    PREFIX=$(pwd)/android/$CPU
    SYSROOT=${TOOLCHAIN}/sysroot
    PREFIX=$(pwd)/android/$CPU
    CFFLAGS="-Os -fpic -march=${CPU}"
    LDFLAGS="-marm"
    #--target-os=android          #目标系统,新版支持Android
    #--arch=arm                 #目标平台架构
    #--sysroot=$SYSROOT         #交叉编译环境
    #--prefix : 安装目录,指编译后的存放路径
    #--enable-small : 优化大小
    #--disable-programs : 不编译ffmpeg程序(命令行工具),我们是需要获得静态(动态)库。
    #--disable-avdevice : 关闭avdevice模块,此模块在android中无用
    #--disable-encoders : 关闭所有编码器 (播放不需要编码)
    #--disable-muxers :  关闭所有复用器(封装器),不需要生成mp4这样的文件,所以关闭
    #--disable-filters :关闭视频滤镜
    #--enable-cross-compile : 开启交叉编译(ffmpeg比较**跨平台**,并不是所有库都有这么happy的选项 )
    #--cross-prefix: 交叉编译链,看右边的值应该就知道是干嘛的,gcc的前缀 xxx/xxx/xxx-gcc 则给xxx/xxx/xxx-
    #disable-shared 生成动态库(共享库)
    # disable-static 禁止生成静态库,开启的话生成的是.a库,禁止的话生成的是.so库
    #--extra-cflags="-I${MP3LAME}/include" –extra-cflags 和 –extra-ldflags  额外需要的头文件和库,如h264、libmp3lame等第三方库,由于开启 mp3 编码需要引入 libmp3lame 库,所以需要指定编译好的 libmp3lame 头文件和库文件的路径,这样在编译时才能正确引用到 libmp3lame
    #--extra-ldflags="-L${MP3LAME}/lib" 额外需要的库

    function build_android
    {
        ./configure
        --prefix=${PREFIX}
        --cross-prefix=${CROSS_PREFIX}
        --target-os=android
        --arch=${ARCH}
        --cpu=${CPU}
        --sysroot=${SYSROOT}
        --extra-cflags="-Os -fpic -march=${CPU}"
        --extra-ldflags=${LDFLAGS}
        --cc=${CC}
        --cxx=${CXX}
        --disable-doc
        --disable-ffplay
        --disable-ffprobe
        --disable-symver
        --disable-avdevice
        --disable-static
        --enable-ffmpeg
        --enable-cross-compile
        --enable-jni
        --enable-neon
        --enable-hwaccels
        --enable-gpl
        --enable-postproc
        --enable-shared
        $ADDITIONAL_CONFIGURE_FLAG
        make clean
        make
        make install
    }
    build_android

    #合并
    #${CROSS_PREFIX}ld -rpath-link=${SYSROOT}/usr/lib -L${SYSROOT}/usr/lib -L${PREFIX}/lib -soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o ${PREFIX}/libffmpeg.so
    #    ${PREFIX}/lib/libavcodec.a
    #    ${PREFIX}/lib/libavfilter.a
    #    ${PREFIX}/lib/libavresample.a
    #    ${PREFIX}/lib/libswresample.a
    #    ${PREFIX}/lib/libavformat.a
    #    ${PREFIX}/lib/libavutil.a
    #    ${PREFIX}/lib/libswscale.a
    #    ${PREFIX}/lib/libpostproc.a
    #    ${PREFIX}/lib/libavdevice.a
    #    -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker
    #    ${TOOLCHAIN}/lib/gcc/${TOOLNAME_BASE}/4.9.x/libgcc.a



     常见编译问题:

    1.nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.
    升级yasm

    2.

  • 相关阅读:
    Mysql子查询、关联查询
    Mysql 注意细节
    IE和FF区别关于css和js
    php 使用curl模拟登录人人(校内)网
    解析php mysql 事务处理回滚操作
    《Linux内核设计的艺术》学习笔记(二)INT 0x13中断
    《Linux内核设计的艺术》学习笔记(一)从开机加电到加载三个汇编源码
    CSS笔记(一)CSS规则
    HTML笔记(七)head相关元素<base> & <meta>
    HTML笔记(六)文档类型
  • 原文地址:https://www.cnblogs.com/wenrisheng/p/13111791.html
Copyright © 2011-2022 走看看