Mac 用NDK编译 x264库 2

注意:这里由于本人对mac 脚本命令不熟(先简单看了半天linux shell命令行,推荐大家看这本书, Linux 运维之道,半天就上手了),本篇只是自己操作的,仅仅是个走下流程的Demo说明。接着上篇笔记,来实现android 多平台编译(armeabi arm64-v8a armv7a x86 x86-64) 。

第一个脚本主要是用来具体编译某一个平台的, 先上脚本,我在说明!!

set -e
echo --------
echo ANDROID_NDK path is ok !
ANDROID_NDK=/Users/cievon/Documents/AndroidSDK/android-ndk-r10e
echo --------
echo ROOT_PREFIX Include and lib output paths ! You can set up your own path here
ROOT_PREFIX=$(pwd)/../build/x264
ROOT=$(pwd)
echo --------
echo 1.Check the NDK path
mkdir $ROOT_PREFIX
if [ -z "$ANDROID_NDK" ]; then
    echo "You must define ANDROID_NDK before starting."
    echo "They must point to your NDK directories.\n"
    exit 1
fi
#--------------------
echo --------
echo 2.Check and compile platform for android
FF_ARCH=$1
if [ -z "$FF_ARCH" ]; then
    echo "You must specific an architecture 'arm, armv7a, x86, ...'.\n"
    exit 1
fi
echo --------
echo 3.configure params for different platforms
FF_ANDROID_PLATFORM=android-9
#----- armv7a begin -----
if [ "$FF_ARCH" = "armv7a" ]; then
    PREBUILT=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.9/prebuilt
    export PATH=$PATH:$PREBUILT/darwin-x86_64/bin/
    PLATFORM=$ANDROID_NDK/platforms/$FF_ANDROID_PLATFORM/arch-arm
    CROSS_PREFIX=$PREBUILT/darwin-x86_64/bin/arm-linux-androideabi-
    HOST=arm-linux
    PREFIX=$ROOT_PREFIX/$FF_ARCH/
    FF_CFG_CONF="$FF_CFG_CONF --disable-asm"
elif [ "$FF_ARCH" = "armv5" ]; then
    PREBUILT=$ANDROID_NDK/toolchains/arm-linux-androideabi-4.9/prebuilt
    export PATH=$PATH:$PREBUILT/darwin-x86_64/bin/
    PLATFORM=$ANDROID_NDK/platforms/$FF_ANDROID_PLATFORM/arch-arm
    CROSS_PREFIX=$PREBUILT/darwin-x86_64/bin/arm-linux-androideabi-
    HOST=arm-linux
    PREFIX=$ROOT_PREFIX/$FF_ARCH/
    FF_CFG_CONF="$FF_CFG_CONF --disable-asm"
elif [ "$FF_ARCH" = "arm64" ]; then
    FF_ANDROID_PLATFORM=android-21
    PREBUILT=$ANDROID_NDK/toolchains/aarch64-linux-android-4.9/prebuilt
    export PATH=$PATH:$PREBUILT/darwin-x86_64/bin/
    PLATFORM=$ANDROID_NDK/platforms/$FF_ANDROID_PLATFORM/arch-arm64
    CROSS_PREFIX=$PREBUILT/darwin-x86_64/bin/aarch64-linux-android-
    HOST=aarch64-linux
    PREFIX=$ROOT_PREFIX/$FF_ARCH/
    FF_CFG_CONF="$FF_CFG_CONF --enable-asm"
elif [ "$FF_ARCH" = "x86" ]; then
    PREBUILT=$ANDROID_NDK/toolchains/x86-4.9/prebuilt
    export PATH=$PATH:$PREBUILT/darwin-x86_64/bin/
    PLATFORM=$ANDROID_NDK/platforms/$FF_ANDROID_PLATFORM/arch-x86
    CROSS_PREFIX=$PREBUILT/darwin-x86_64/bin/i686-linux-android-
    HOST=i686-linux
    PREFIX=$ROOT_PREFIX/$FF_ARCH/
    FF_CFG_CONF="$FF_CFG_CONF --disable-asm"
elif [ "$FF_ARCH" = "x86_64" ]; then
    FF_ANDROID_PLATFORM=android-21
    PREBUILT=$ANDROID_NDK/toolchains/x86_64-4.9/prebuilt
    export PATH=$PATH:$PREBUILT/darwin-x86_64/bin/
    PLATFORM=$ANDROID_NDK/platforms/$FF_ANDROID_PLATFORM/arch-x86_64
    CROSS_PREFIX=$PREBUILT/darwin-x86_64/bin/x86_64-linux-android-
    HOST=x86_64-linux
    PREFIX=$ROOT_PREFIX/$FF_ARCH/
    FF_CFG_CONF="$FF_CFG_CONF --disable-asm"
else
echo --------
    echo "unknown architecture $FF_ARCH";
    exit 1
fi
echo --------
mkdir $PREFIX
echo Enter your x264 source directory ! You have to modify it into your own source path
cd $ROOT/../x264-$FF_ARCH
echo --------
echo Build the necessary and other attributes for configure
FF_CFG_CONF="$FF_CFG_CONF --prefix=$PREFIX"
# FF_CFG_CONF="$FF_CFG_CONF --enable-shared" 
FF_CFG_CONF="$FF_CFG_CONF --enable-static"
FF_CFG_CONF="$FF_CFG_CONF --disable-cli"
# FF_CFG_CONF="$FF_CFG_CONF --disable-opencl"
FF_CFG_CONF="$FF_CFG_CONF --disable-thread"
# FF_CFG_CONF="$FF_CFG_CONF --enable-pic"
# FF_CFG_CONF="$FF_CFG_CONF --enable-strip"
# FF_CFG_CONF="$FF_CFG_CONF --disable-avs"
# FF_CFG_CONF="$FF_CFG_CONF --disable-swscale"
# FF_CFG_CONF="$FF_CFG_CONF --disable-lavf"
# FF_CFG_CONF="$FF_CFG_CONF --disable-ffms"
FF_CFG_CONF="$FF_CFG_CONF --disable-gpac"
FF_CFG_CONF="$FF_CFG_CONF --disable-lsmash"
FF_CFG_CONF="$FF_CFG_CONF --host=$HOST"
FF_CFG_CONF="$FF_CFG_CONF --cross-prefix=$CROSS_PREFIX"
FF_CFG_CONF="$FF_CFG_CONF --sysroot=$PLATFORM"
echo --------
echo configure: $FF_CFG_CONF
echo
./configure $FF_CFG_CONF
echo --------
echo make
make
sudo make install
echo --------
echo finish ! ! !
echo --------

NDK编译工具要配置3个路径 :android ndk 目录;ndk 下面的 platforms 和 toolchains ,剩下的就是android 支持的平台参数配置不同了,看下这两个目录 对比下一目了然,D:\android-sdk\ndk-bundle\platforms\android-21 和 D:\android-sdk\ndk-bundle\toolchains。
x264源码编译的配置,流程如下,配置configure 参数,执行 ./configure ....参数内容 ,然后 make ,再 make install ,就得到你要的 include 和lib 目录了!!!脚本里面的配置 有三个必要的配置,这里呢!!!我这里贴图 ,到源码目录下,有个configure文件,这就是总开关了,打开里面,如下图:


image

是不是懵逼了!!! 我建议先按照我的配置来,先编出来!! 有时间,可以仔细看这个脚本配置。
首先NDK 交叉编译 这单个是必须的:

FF_CFG_CONF="$FF_CFG_CONF --host=$HOST"
FF_CFG_CONF="$FF_CFG_CONF --cross-prefix=$CROSS_PREFIX"
FF_CFG_CONF="$FF_CFG_CONF --sysroot=$PLATFORM"!

然后是你要的格式要动态库还是静态库 :

# FF_CFG_CONF="$FF_CFG_CONF --enable-shared" // 编译成动态库 .so
FF_CFG_CONF="$FF_CFG_CONF --enable-static"//编译成静态库.a !!!

注意的是:你可以在源码目录下面,打开shell 执行 ./configure --help 上面有队每个配置的说明,也不多好像就20多个!!


下面还有个脚本,主要为了方便 ,先看脚本

UNI_BUILD_ROOT=`pwd`
FF_TARGET=$1
set -e
set +x
FF_ACT_ARCHS_32="armv5 armv7a x86"
FF_ACT_ARCHS_64="armv5 armv7a arm64 x86 x86_64"
FF_ACT_ARCHS_ALL=$FF_ACT_ARCHS_64
echo_archs() {
    echo "===================="
    echo "[*] check archs"
    echo "===================="
    echo "FF_ALL_ARCHS = $FF_ACT_ARCHS_ALL"
    echo "FF_ACT_ARCHS = $*"
    echo ""
}
echo_usage() {
    echo "Usage:"
    echo "  compile-x264.sh armv5|armv7a|arm64|x86|x86_64"
    echo "  compile-x264.sh all|all32"
    echo "  compile-x264.sh all64"
    echo "  compile-x264.sh clean"
    echo "  compile-x264.sh check"
    exit 1
}
echo_nextstep_help() {
    #----------
    echo ""
    echo "--------------------"
    echo "[*] Finished"
    echo "--------------------"
    echo "# to continue to build ffmpeg, run script below,"
    echo "sh compile-ffmpeg.sh "
    echo "# to continue to build ijkplayer, run script below,"
    echo "sh compile-ijk.sh "
}
#----------
case "$FF_TARGET" in
    "")
        echo_archs armv7a
        sh tools/do-compile-x264.sh armv7a
    ;;
    armv5|armv7a|arm64|x86|x86_64)
        echo_archs $FF_TARGET
        sh tools/do-compile-x264.sh $FF_TARGET
        echo_nextstep_help
    ;;
    all32)
        echo_archs $FF_ACT_ARCHS_32
        for ARCH in $FF_ACT_ARCHS_32
        do
            sh tools/do-compile-x264.sh $ARCH
        done
        echo_nextstep_help
    ;;
    all|all64)
        echo_archs $FF_ACT_ARCHS_64
        for ARCH in $FF_ACT_ARCHS_64
        do
            sh tools/do-compile-x264.sh $ARCH
        done
        echo_nextstep_help
    ;;
    clean)
        echo_archs FF_ACT_ARCHS_64
        for ARCH in $FF_ACT_ARCHS_ALL
        do
            if [ -d x264-$ARCH ]; then
                cd x264-$ARCH && cd -
            fi
        done
        rm -rf ./build/x264-*
    ;;
    check)
        echo_archs FF_ACT_ARCHS_ALL
    ;;
    *)
        echo_usage
        exit 1
    ;;
esac

这个脚本也是仿照ijkplayer 里面的脚本写的,很简单 一句命令:

sh tools/do-compile-x264.sh armv7a

注意一点,就是这个脚本会调用第一个脚本路径一定要配对!!!还有一个脚本就更简单了!!


export ANDROID_NDK=/Users/cievon/Documents/AndroidSDK/android-ndk-r10e/
cd  contrib
FF_ARCH=$1
./compile-x264.sh $FF_ARCH

把这几行生成一个脚本,里面会去调用上面第二个脚本,后面可以指定参数!如我的这个脚本名字 compile.sh
到这个目录下面执行 :结果会编译出所有五个平台的 include 和 lib

 ./compile.sh  all   ```
 ./compile.sh  all32   或者  ./compile.sh  arm64 

很简单! !! 其实这三个脚本只是为了方便编译多平台的时候参数配置麻烦,如果大家一下子不明白,可以参考我的上篇日记 https://www.jianshu.com/p/67b733fcded0, 每一个平台搞一套源码目录,里面新建对应的平台脚本,然后执行: ./(你的脚本名称),也能生成你的 头文件,库文件,pc文件,都在源码的当前目录下,用的时候,你需要手动copy到你用的地方去!!! 容易理解,但是效率太低!!!!
欢迎FFmpeg大神 戳我liugstick@163.com!!!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容