欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android Ubuntu下FFmpeg的编译教程

程序员文章站 2022-07-13 13:30:33
...

在研究Ubuntu下编译FFmpeg的时候,参考过很多大神写的博客。虽然网上很多大神的教程,但是我还是自己整理一下,方便自己和朋友使用。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

我参考的文章步骤如下:

配置信息:

FFmpeg版本:ffmpeg-3.0.1 
ubuntu版本:ubuntu kylin 14.04 
Android NDK版本:android-ndk-r10b

一、配置编译环境和下载源码

a、安装Ubuntu14.04操作系统 
b、sudo passwd root 配置root权限 
c、sudo apt-get update 升级apt-get 
d、sudo apt-get install Git –y 安装git版本工具 
e、sudo apt-get install bison gcc-multilib g++-multilib -y 安装bison,gcc,g++编译工具 
f、mkdir /home/AndroidNDK 新建一个NDK目录 
https://developer.android.com/ndk/downloads/index.html#download网站上NDK下载下来,复制到AndroidNDK目录下解压。 
g、sudo apt-get install vim –y 安装vim文本编辑器 
h、Vim /home/主机名/.profile 配置ndk环境变量,在文件末尾加入:

export NDK_HOME=NDK所在位置
export PATH=$NDK_HOME:$PATH
  • 1
  • 2
  • 1
  • 2

保存退出

i、source /home/主机名/.profile 使修改文件生效 
j、Echo $NDK_HOME 如果输出环境变量值,则表示配置成功。

注:在FFmpeg官网下载FFmpeg源代码,复制到ndk的source目录下也可以使用git命令获取:git clone git://source.ffmpeg.org/ffmpeg.git /home/Hadoop/AndroidNDK/android-ndk-r10b/sources/FFmpeg

二、编译FFmpeg

A、第一种编译脚本 
(1)、首先,我们需要进入FFmpeg源代码中对configure文件进行修改,目的是为了不生成版本号,因为android平台识别不了! 
将:

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)'
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

修改为:

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

(2)、然后在FFmpeg源码目录下新建一个build_ffmpeg.sh脚本文件,将下面代码的复制进去。

#清除上次编译的东西
make clean
#配置NDK路径
export NDK=/home/hadoop/AndroidNDK/android-ndk-r10b
#配置工具链
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt
#配置平台
export PLATFORM=$NDK/platforms/android-8/arch-arm
#配置编译好了之后的文件输出目录,$(pwd)当前目录下
export PREFIX=$(pwd)/android/
build_one(){
  ./configure --target-os=linux --prefix=$PREFIX \
--enable-cross-compile \
--enable-runtime-cpudetect \
--disable-asm \
--arch=arm \
--cc=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-gcc \
--cross-prefix=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi- \
--disable-stripping \
--nm=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-nm \
--sysroot=$PLATFORM \
--enable-gpl --enable-shared --disable-static --enable-nonfree --enable-version3 --enable-small \
--enable-zlib --disable-ffprobe --disable-ffplay --disable-ffmpeg --disable-ffserver --disable-debug \
--extra-cflags="-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -marm -march=armv7-a" 
}
build_one

#4线程编译
make -j4
make install
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

之后打开命令行终端,输入以下命令:

chmod a+x build_ffmpeg.sh
./build_ffmpeg.sh
  • 1
  • 2
  • 1
  • 2

执行完必之后就会在你的当前android/lib目录下生成下列文件: 
Android Ubuntu下FFmpeg的编译教程
红色标记出来的文件是连接文件,可以删除掉。

B、第二种编译脚本

#清除上次编译的东西
make clean
#配置NDK路径
export NDK=/home/hadoop/AndroidNDK/android-ndk-r10b
#配置工具链
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt
#配置平台
export PLATFORM=$NDK/platforms/android-8/arch-arm
#配置编译好了之后的文件输出目录,$(pwd)当前目录下
export PREFIX=$(pwd)/android/
build_one(){
  ./configure --target-os=linux --prefix=$PREFIX \
--enable-cross-compile \
--enable-runtime-cpudetect \
--disable-asm \
--arch=arm \
--cc=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-gcc \
--cross-prefix=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi- \
--disable-stripping \
--nm=$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-nm \
--sysroot=$PLATFORM \
--enable-gpl --enable-static --disable-shared --enable-nonfree --enable-version3 --enable-small \
--enable-zlib --disable-ffprobe --disable-ffplay --disable-ffmpeg --disable-ffserver --disable-debug \
--extra-cflags="-fPIC -DANDROID -D__thumb__ -mthumb -Wfatal-errors -Wno-deprecated -mfloat-abi=softfp -marm -march=armv7-a" 
}
build_one

#4线程编译
make -j4
make install

$PREBUILT/linux-x86_64/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 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

这种脚本是将第一种方法中的各类so文件打包成了一个文件。并且也不需要修改configure文件中的配置,当然你改了也无妨,这种生成的文件是xxx.a文件,如下图: 
Android Ubuntu下FFmpeg的编译教程

在build_one()方法中倒数第三行,配置了–enable-static –disable-shared 与第一种不同的是将两个值进行了对调。当然你也可以说对两个值的修饰符进行了对调。

-----------------------------------------------------------------------------------------------------------------------------------------------------

总结:

按照上面的方法一确实是可以编译成功多个so文件。按照方法二 确实是可以变成成多个.a的文件,但是不能聚合方法一所有的so为一个so文件。我是个执着的人,于是有去研究怎么样生成一个单独的so的方法,功夫不负有心人,最后我还是找到了编译成一个单独的so文件的方法了。

生成一个单独so文件的编译脚本:

#!/bin/bash
NDK=/home/lx/Downloads/android-ndk-r13b
SYSROOT=$NDK/platforms/android-19/arch-arm
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64

CPU=arm
ARCH=arm
PREFIX=$(pwd)/android/$CPU

ADDI_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 \
    --disable-shared \
    --enable-static \
    --disable-doc \
    --disable-debug \
    --enable-small \
    --disable-programs \
    --disable-ffmpeg \
    --disable-ffplay \
    --disable-ffprobe \
    --disable-ffserver \
    $ADDITIONAL_CONFIGURE_FLAG

#编译
make clean

make -j4

make install

#打包
$TOOLCHAIN/bin/arm-linux-androideabi-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 \
    libavcodec/libavcodec.a \
    libavfilter/libavfilter.a \
    libswresample/libswresample.a \
    libavformat/libavformat.a \
    libavutil/libavutil.a \
    libswscale/libswscale.a \
    libavdevice/libavdevice.a \
    libpostproc/libpostproc.a \
    -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker \
    $TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a

#strip
$TOOLCHAIN/bin/arm-linux-androideabi-strip  $PREFIX/libffmpeg.so


总结:

如果编译提示文件目录找不到,可以检查ndk的配置是否正确。以下三行配置很重要,一定要仔细核对层级和文件是否都存在:

#配置NDK路径

export NDK=/home/hadoop/AndroidNDK/android-ndk-r10b

#配置工具链

export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt

#配置平台

export PLATFORM=$NDK/platforms/android-8/arch-arm


-------------------------------------------------------------------------------------------------------------------------------------------

欢迎关注公众号:

Android Ubuntu下FFmpeg的编译教程