Android音视频一开篇-FFmpeg的编译

一、环境的搭建

  • linux环境
    我用的是阿里云的服务器,centos7系统,用ubuntu系统的基本操作也是一样。

    1. 下载ndk,我这里用的是 android-ndk-r10e,也可以在linux系统上吗直接下载,也可以下载以后传到服务器上面。下载了以后将文件解压到指定的文件夹,然后记住文件的路径,如果是zip的就用unzip命令,如果后缀是gz,就用tar -xzvf xx.tar.gz
    2. 配置NDK的环境变量

      export NDKROOT=/usr/ndk/android-ndk-r10e
      export PATH=$NDKROOT:$PATH
    3. 配置java的环境变量

       77 #set java environment
       78 JAVA_HOME=/usr/java/jdk1.8.0_72
       79 JRE_HOME=$JAVA_HOME/jre
       80 CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
       81 PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
       82 export JAVA_HOME JRE_HOME CLASS_PATH PATH
      

二、编译生成多个库

  1. 上ffmpeg的官网下载源文件,下载以后上传到服务器上面的制定文件夹,我这里面是usr/shixin。上传以后解压。
  2. 接下来就是编写shell脚本。使用vim新建一个文件,然后编写shell脚本,命令如下vim build_android.sh
  3. 脚本如下

    
    #!/bin/bash
    
    
    #全局变量,多个shell脚本都可以使用 注意这里的路径要换上自己的路径
    
    export ANDROID_NDK_HOME=/usr/ndk/android-ndk-r10e
    export PLATFORM_VERSION=android-9 #android的版本
    
    function build_ffmpeg
    {
        echo "start build ffmpeg $ARCH"
        ./configure --target-os=linux \
        --prefix=$PREFIX \   #编译放到哪一个目录下面
        --arch=$ARCH \       #指定CPU的架构
        --enable-shared \    #代表生成的是动态库
        --disable-static \   #不生成静态库
        --disable-yasm \     #不需要这个
        --disable-ffmpeg \   #下面这几个都不需要生成
        --disable-ffplay \   
        --disable-ffprobe \
        --disable-ffserver \ #流媒体服务器推流的,不生成
        --disable-doc \      
        --enable-cross-compile \  #交叉编译,在linux下编译arm指令 就是交叉编译,所以要指定ndk下的arm路径。还有就是在win下面编译linux。
        --cross-prefix=$CROSS_COMPILE \  #配置这个选项,需要一些工具,在ndk里面。
        --sysroot=$PLATFORM \ 
        --extra-cflags="-fpic" #可以让动态库加入使用
        make clean  #makefile的指令
        make
        make install
    
        echo "build finished $ARCH"
    }
    
    
    #arm  编译arm指令
    
    ARCH=arm
    CPU=arm
    PREFIX=$(pwd)/android/$CPU 
    TOOLCHAIN=$ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
    CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi-
    PLATFORM=$ANDROID_NKD_HOME/platforms/$PLATFORM_VERSION/arch-$ARCH
    build_ffmpeg
    
    
    #x86
    
    ARCH=x86
    CPU=x86
    PREFIX=$(pwd)/android/$CPU
    TOOLCHAIN=$ANDROID_NDK_HOME/toolchains/x86-4.9/prebuilt/linux-x86_64
    CROSS_COMPILE=$TOOLCHAIN/bin/i686-linux-android-
    PLATFORM=$ANDROID_NKD_HOME/platforms/$PLATFORM_VERSION/arch-$ARCH
    build_ffmpeg
  4. 修改configure文件,在ffmpeg的文件夹下面

    2861行
    #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)' #shixin SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)' LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
    SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
    SLIB_INSTALL_LINKS='$(SLIBNAME)'
  5. 执行命令

    给文件权限
    chmod 777 -R ffmpeg-2.6.9
    chmod u+x build_android.sh
    
    ./build_android.sh
    

    运行的时间大概是半个小时,如果服务器的性能比较高的话,速度会快一些。运行完成以后会在ffmpeg文件夹下面生成一个android的文件夹,在那里会生成一些动态库来给我们调用。

  6. 生成调试版本的动态库

#!/bin/bash
make clean
export NDK=/usr/ndk/android-ndk-r10e
export SYSROOT=$NDK/platforms/android-9/arch-arm/
export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
export CPU=arm
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-marm"

./configure --target-os=linux \
--prefix=$PREFIX --arch=arm \
--disable-doc \
--enable-shared \
--disable-static \
--disable-yasm \
--disable-symver \
--enable-gpl \
--enable-debug \ #debug版本
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install

注意事项

  1. 首先要给ffmpeg文件执行权限,如果没有权限没法执行,直接简单粗暴一点chmod 777 -R ffmpeg-2.6.9
  2. 还要给予shell脚本的执行权限chmod u+x build_android.sh,否则没有办法编译通过。
  3. shell脚本语法特别严谨,其中\后面不能有空格,同样的--前面也不能有空格。
  4. \符号相当于换行符。
  5. 编写shell脚本是可以用./configure --help查看帮助。

三、编译生成一个库

这个脚本文件是借鉴雷神的博客。

  1 #!/bin/bash
  2 make clean
  7 export cpu=arm
  8 export PREFIX=$(pwd)/as/$cpu
  1 #!/bin/bash
  2 make clean  
  7 export cpu=arm
  8 export PREFIX=$(pwd)/as/$cpu
  9 build_one(){  
 10 ./configure --target-os=linux --prefix=$PREFIX \
 11 --enable-cross-compile \
 12 --enable-runtime-cpudetect \
 13 --disable-asm \
 14 --arch=arm \
 15 --cc=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-gcc \
 16 --cross-prefix=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi- \
 17 --disable-stripping \
 18 --nm=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-nm \
 19 --sysroot=$PLATFORM \
 20 --enable-gpl --enable-static --disable-shared --enable-nonfree --enable-version3 --enable-small \
 21 --enable-zlib --disable-ffprobe --disable-ffplay --disable-ffmpeg --disable-ffserver --disable-debug \
 22 --extra-cflags="-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -marm -march=armv7-a"
 23 }
 24 
 25 makeclean
 26   
 27 build_one  
 28   
 29 make  
 30 make install  
 31   
 32 $PREBUILT/linux-x86_64/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -L$PREFIX/lib -soname libffmpeg.so -shar    ed -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 libpostproc/libpostproc.a libavdevice/libavdevice.a -    lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker $PREBUILT/linux-x86_64/lib/gcc/arm-linux-androideabi/4.8/libgcc.a

资源位置:shell脚本下载
传送门

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值