#ffmpeg 编译android so库文件

ffmpeg是现在主流播放器和直播软件中常用的库,主要用于视频的编解码,下面主要介绍一下,ffmpeg如何在android平台上使用。ffmpeg想在android上使用,一般都是在官网下载源码,然后编译成相应的so库。

参考了好几篇网上的博客,利用其提供的shell脚本编译,总是报 文件找不到或者编译参数错误:

Unknown option "--disable-ffserver".See ./configure --help for available options.Makefile:2: ffbuild/config.mak: No such file or directoryMakefile:40: /tools/Makefile: No such file or directory...

最后老老实实下载老的版本的ffmpeg(3.0和3.3都编译通过)和ndk才解决。

运行环境

  1. 、ubuntu 16.04
  2. 、ffmpeg-3.3.tar.gz
  3. 、android-ndk-r13b-linux-x86_64.zip

ffmpeg 下载

 wget http://ffmpeg.org/releases/ffmpeg-3.3.tar.gz

通过改变版本号下载不同版本

android-ndk-r13b 下载:

https://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip

Node:注意下载对应版本和系统的ndk,之前直接把windows系统的ndk拷贝到ubantu下,导致后面编译找不到文件
##编译

1、下载ffmpeg后解压后,将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)'

2、在根目录添加编译的shell文件:build_android.sh:
注意修改NDK(ubuntu版本的ndk的目录)

#!/bin/bashexport NDK=/home/lammy/ffmpeg/android-ndk-r13bexport SYSROOT=$NDK/platforms/android-19/arch-arm/export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64export CPU=armARCH=armexport PREFIX=$(pwd)/android/$CPUADDI_CFLAGS="-marm"#注意下面的 \ 后面不要带空格./configure \--prefix=$PREFIX \--arch=$ARCH \--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \--extra-ldflags="$ADDI_LDFLAGS" \--sysroot=$SYSROOT \--extra-cflags="-Os -fpic $ADDI_CFLAGS" \--target-os=linux \--enable-cross-compile \--enable-gpl \--enable-shared \--disable-static \--disable-doc \--enable-small \--disable-programs \--disable-ffmpeg \--disable-ffplay \--disable-ffprobe \--disable-ffserver \$ADDITIONAL_CONFIGURE_FLAGmake cleanmakemake install

3、给shell脚本赋予权限并运行

chmod 777 build_android.sh./build_android.sh

成功运行后会生成android/arm文件存在include和lib文件
include目录:

lib目录:

可以看到生成了2种so库,带版本和不带版本的(android通常用到的是带版本号的库文件),我用的是window下的ubuntu下虚拟机编译的,为了方便使用我们将android这个文件夹压缩后,拷贝出来以便使用。(不压缩无法直接从虚拟机拷贝到windows下)。

这里给出编译好的so库和include文件,欢迎各位老铁下载。
下一篇讲如何在android studio中使用我们编译好的库和include文件。

2019-3-30号跟新

随着版本递增,ffmpeg的编译更简单
下面是
Ubuntu 18.04
android-ndk-14b
ffmpeg3.4

编译方法:
下载ffmpeg后,在根目录创建build_android.sh(3.4版本后不需要更改configure文件内容
里面内容:

echo "进入编译ffmpeg"export NDK=/root/ff/android-ndk-r14b#架构下的so库和头文件export PLATFORM=$NDK/platforms/android-21/arch-arm#交叉编译工具 谁来用,用在哪export TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64export CPU=armv7-a#输出路径export PREFIX=./android/$CPUfunction buildFF{echo "开始编译...."./configure \    --prefix=$PREFIX \    --target-os=android \    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \    --arch=arm \    --cpu=armv7-a  \    --sysroot=$PLATFORM \    --extra-cflags="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=neon -mfloat-abi=softfp " \    --cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \    --nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \    --enable-shared \    --enable-runtime-cpudetect \    --enable-gpl \    --enable-small \    --enable-cross-compile \    --enable-asm \    --enable-neon \    --enable-jni \    --enable-mediacodec \    --enable-decoder=h264_mediacodec \    --enable-hwaccel=h264_mediacodec \    --disable-debug \    --disable-static \    --disable-doc \    --disable-ffmpeg \    --disable-ffplay \    --disable-ffprobe \    --disable-ffserver \    --disable-postproc \    --disable-avdevice \    --disable-symver \    --disable-stripping make -j8make installecho "编译完毕"}buildFF

当然根据是否支持软解码,我们可以编写个函数,同时编译出支持 硬解码和不支持的库

echo "进入编译ffmpeg"NDK=/root/ff/android-ndk-r14b#架构下的so库和头文件PLATFORM=$NDK/platforms/android-21/arch-arm#交叉编译工具 谁来用,用在哪TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64CPU=armv7-a#输出路径PREFIX=./android/$CPUfunction buildFF{echo "开始编译...."./configure \    --prefix=$PREFIX \    --target-os=android \    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \    --arch=arm \    --cpu=$CPU  \    --sysroot=$PLATFORM \    --extra-cflags="$CFLAGS" \    --cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \    --nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \    --enable-shared \    --enable-runtime-cpudetect \    --enable-gpl \    --enable-small \    --enable-cross-compile \#   --enable-asm \#    --enable-neon \#    --enable-jni \#    --enable-mediacodec \#    --enable-decoder=h264_mediacodec \#    --enable-hwaccel=h264_mediacodec \    --disable-debug \    --disable-static \    --disable-doc \    --disable-ffmpeg \    --disable-ffplay \    --disable-ffprobe \    --disable-ffserver \    --disable-postproc \    --disable-avdevice \    --disable-symver \    --disable-stripping \$ADDmake -j8make installecho "编译完毕"}buildFF###############################echo "编译支持neno和硬解码"CPU=armv7-aPREFIX=./android/armv7-a-neon-hardCFLAGS="-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=neon -mfloat-abi=softfp "ADD="--enable-asm \    --enable-neon \    --enable-jni \    --enable-mediacodec \    --enable-decoder=h264_mediacodec \    --enable-hwaccel=h264_mediacodec "buildFF###############################echo "编译不支持neno和硬解码"CPU=armv7-aPREFIX=./android/$CPUCFLAGS"-I$PLATFORM/usr/include -fPIC -DANDROID -mfpu=vfp -mfloat-abi=softfp "ADD=buildFF

node
1、 ubuntu写成shell文件,则不需要加export,如果直接执行命令则要加export
2、在执行build_android.sh 之前,需要给权限,若执行了没给,然后再给可能会出现一些库找不到,这时候最好换个文件夹,重新解压压缩包,make clean 然后重新执行 build文件。
3、上面的两种编译有时候 会只编译第一种,第二种就不编译了,因此最好一次只使用一种
执行后如下:

更多相关文章

  1. AndroidX
  2. 【错误问题系列】android sdk content loader has encountered a
  3. Run c++ program with boost on Android
  4. Windows下Android(安卓)NDK r9 + OpenCV2.4.9开发环境搭建
  5. Android(安卓)R文件丢失或R cannot be resolved to a variable
  6. (1) Android(安卓)Junit 安卓单元测试
  7. android:string.xml文件中的整型和string型代替
  8. Android(安卓)APK系列4-------Android编译APK后的系统结构
  9. 2014年开源夏令营-android下编译libusb和libhackrf

随机推荐

  1. android发送http请求—-URLConnection、H
  2. [必藏]Android(安卓)最棒的开源集合库
  3. Android动画开发——Animation动画效果(
  4. Android设置Button字母大小写
  5. Android(安卓)JSON
  6. Android在外接物理键盘时,如何强制调用系
  7. Pro Android学习笔记(五八):Preferences(2):Che
  8. Android(安卓)普通权限、危险权限、运行
  9. Android之UI- listview特别的属性
  10. 自定义View组件