ubuntu14.04
下载ffmpeg ffmpeg-4.2.1
http://ffmpeg.org/download.html
用android studio创建一个程序,再下载ndk
修改configure
由于编译生成动态库文件名的版本号在so的后面,android平台不能识别这样的动态库,因此需要修改一下
打开找到build settings,修对应的宏修改成下面那样
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
在解压根目录下创建 build.sh,用于编译
NDK路径为android studio下载的ndk路径 :/home/c2-1222/SoftWare/ndk-bundle
ndk在教程中使用的是ndk r9d
#!/bin/bash
# 清空上次的编译
make clean
#你自己的NDK路径。
# export NDK=/home/c2-1222/SoftWare/ndk-bundle
export NDK=/home/c2-1222/SoftWare/ndk-bundle
# 设置你的android平台编译器的版本 这里采用Android4.0
export SYSROOT=$NDK/platforms/android-21/arch-arm/
#编译使用的toolchain
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=android \
--prefix=$PREFIX --arch=arm \
--disable-doc \
--disable-shared \
--enable-static \
--disable-yasm \
--disable-symver \
--enable-gpl \
--enable-nonfree \
--enable-ffmpeg \
--enable-ffplay \
--enable-ffprobe \
--enable-ffserver \
--enable-doc \
--enable-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
--enable-bzlib
make clean
make
make install
安装环境:
下面的所有操作要注意权限问题,记得加上sudo
【1】安装yasm
wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar zxvf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure
make && sudo make install
【2】安装g++ cmake
apt install g++ cmake
【3】安装SDL2-2.0 (这里选择SDL2版本的),用于生成ffplay,否则不会生成ffplay
apt install libsdl2-2.0-0 libsdl2-dev libsdl2-doc
【4】安装fdk-acc
wget https://jaist.dl.sourceforge.net/project/opencore-amr/fdk-aac/fdk-aac-0.1.6.tar.gz
tar xvf fdk-aac-0.1.6.tar.gz
cd fdk-aac-0.1.6
./configure
make && sudo make install
【5】安装lame
wget http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz
tar -xzf lame-3.99.5.tar.gz
cd lame-3.99.5
./configure
make && sudo make install
【6】安装nasm
wget https://www.nasm.us/pub/nasm/releasebuilds/2.13.03/nasm-2.13.03.tar.gz
tar xvf nasm-2.13.03.tar.gz
cd nasm-2.13.03
./configure
make && sudo make install
【7】安装x264视频编解码库
git clone https://code.videolan.org/videolan/x264.git
cd x264
./configure --enable-static --enable-shared --disable-asm --disable-avs
make && sudo make install
【8】安装x265视频编解码库
wget -c http://mirror.yandex.ru/mirrors/ftp.videolan.org/x265/x265_2.6.tar.gz
tar -zxvf x265_2.6.tar.gz
cd /x265_v2.6/build/linux
./make-Makefiles.bash
make && make install
编译ffmpeg
sh build.sh
ubuntu 18.04
#!/bin/bash
#下面三个宏需要根据你的环境修改
NDK=/home/toby/Software/android-ndk-r7b
SYSROOT=$NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
build_one
make -j4
make install
在ubuntu本机上源码编译使用 ffmpeg
./configure --enable-shared --prefix=ubuntu/ --enable-gpl --disable-doc
sudo make -j
编译完成后,
发现没有编译到ffplay,它需要安装sdl包
执行命令,出现如下错误:
ffmpeg-2.0.2$ ./ubuntu/bin/ffmpeg
./ubuntu/bin/ffmpeg: error while loading shared libraries: libavdevice.so.55: cannot open shared object file: No such file or directory
发现依懒库没有找到
ldd bin/ffmpeg
linux-vdso.so.1 (0x00007ffe68b83000)
libavdevice.so.55 => not found
libavfilter.so.3 => not found
libavformat.so.55 => not found
libavcodec.so.55 => not found
libpostproc.so.52 => not found
libswresample.so.0 => not found
libswscale.so.2 => not found
libavutil.so.52 => not found
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f755e041000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f755de22000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f755da31000)
/lib64/ld-linux-x86-64.so.2 (0x00007f755e610000)
需要单独增加环境变量,或将其加入bashrc文件中
增加安装目录的动态链接库:
export LD_LIBRARY_PATH=ubuntu/lib:$LD_LIBRARY_PATH
如下可以使用了
toby@Toby:~/Code/FFMPEG_iOS/ffmpeg-2.0.2$ ./ubuntu/bin/ffmpeg
ffmpeg version 2.0.2 Copyright (c) 2000-2013 the FFmpeg developers
built on May 30 2020 16:10:06 with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
configuration: --enable-shared --prefix=ubuntu/ --enable-gpl --disable-doc
libavutil 52. 38.100 / 52. 38.100
libavcodec 55. 18.102 / 55. 18.102
libavformat 55. 12.100 / 55. 12.100
libavdevice 55. 3.100 / 55. 3.100
libavfilter 3. 79.101 / 3. 79.101
libswscale 2. 3.100 / 2. 3.100
libswresample 0. 17.102 / 0. 17.102
libpostproc 52. 3.100 / 52. 3.100
再查依懒库也找到了:
ldd bin/ffmpeg
linux-vdso.so.1 (0x00007ffdc7b92000)
libavdevice.so.55 => /home/toby/Code/FFMPEG_iOS/ffmpeg-2.0.2/ubuntu/lib/libavdevice.so.55 (0x00007f39f33e2000)
libavfilter.so.3 => /home/toby/Code/FFMPEG_iOS/ffmpeg-2.0.2/ubuntu/lib/libavfilter.so.3 (0x00007f39f30f2000)
libavformat.so.55 => /home/toby/Code/FFMPEG_iOS/ffmpeg-2.0.2/ubuntu/lib/libavformat.so.55 (0x00007f39f2d7a000)
libavcodec.so.55 => /home/toby/Code/FFMPEG_iOS/ffmpeg-2.0.2/ubuntu/lib/libavcodec.so.55 (0x00007f39f1e86000)
libpostproc.so.52 => /home/toby/Code/FFMPEG_iOS/ffmpeg-2.0.2/ubuntu/lib/libpostproc.so.52 (0x00007f39f1c67000)
libswresample.so.0 => /home/toby/Code/FFMPEG_iOS/ffmpeg-2.0.2/ubuntu/lib/libswresample.so.0 (0x00007f39f1a50000)
libswscale.so.2 => /home/toby/Code/FFMPEG_iOS/ffmpeg-2.0.2/ubuntu/lib/libswscale.so.2 (0x00007f39f17f0000)
libavutil.so.52 => /home/toby/Code/FFMPEG_iOS/ffmpeg-2.0.2/ubuntu/lib/libavutil.so.52 (0x00007f39f15ab000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f39f120d000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f39f0fee000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f39f0bfd000)
libXv.so.1 => /usr/lib/x86_64-linux-gnu/libXv.so.1 (0x00007f39f09f8000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f39f06c0000)
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f39f04ae000)
libsndio.so.6.1 => /usr/lib/x86_64-linux-gnu/libsndio.so.6.1 (0x00007f39f029e000)
libasound.so.2 => /usr/lib/x86_64-linux-gnu/libasound.so.2 (0x00007f39eff97000)
libSDL-1.2.so.0 => /usr/lib/x86_64-linux-gnu/libSDL-1.2.so.0 (0x00007f39efcff000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f39efae2000)
libva.so.2 => /usr/lib/x86_64-linux-gnu/libva.so.2 (0x00007f39ef8c1000)
/lib64/ld-linux-x86-64.so.2 (0x00007f39f3824000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f39ef699000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f39ef495000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f39ef28d000)
libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f39ef078000)
libpulse-simple.so.0 => /usr/lib/x86_64-linux-gnu/libpulse-simple.so.0 (0x00007f39eee73000)
libpulse.so.0 => /usr/lib/x86_64-linux-gnu/libpulse.so.0 (0x00007f39eec23000)
libcaca.so.0 => /usr/lib/x86_64-linux-gnu/libcaca.so.0 (0x00007f39ee95a000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f39ee756000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f39ee550000)
libpulsecommon-11.1.so => /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-11.1.so (0x00007f39ee2d2000)
libdbus-1.so.3 => /lib/x86_64-linux-gnu/libdbus-1.so.3 (0x00007f39ee085000)
libslang.so.2 => /lib/x86_64-linux-gnu/libslang.so.2 (0x00007f39edba3000)
libncursesw.so.5 => /lib/x86_64-linux-gnu/libncursesw.so.5 (0x00007f39ed974000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f39ed74a000)
libsystemd.so.0 => /lib/x86_64-linux-gnu/libsystemd.so.0 (0x00007f39ed4c6000)
libwrap.so.0 => /lib/x86_64-linux-gnu/libwrap.so.0 (0x00007f39ed2bc000)
libsndfile.so.1 => /usr/lib/x86_64-linux-gnu/libsndfile.so.1 (0x00007f39ed043000)
libasyncns.so.0 => /usr/lib/x86_64-linux-gnu/libasyncns.so.0 (0x00007f39ece3d000)
liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f39ecc17000)
liblz4.so.1 => /usr/lib/x86_64-linux-gnu/liblz4.so.1 (0x00007f39ec9fb000)
libgcrypt.so.20 => /lib/x86_64-linux-gnu/libgcrypt.so.20 (0x00007f39ec6df000)
libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007f39ec4c5000)
libFLAC.so.8 => /usr/lib/x86_64-linux-gnu/libFLAC.so.8 (0x00007f39ec24e000)
libogg.so.0 => /usr/lib/x86_64-linux-gnu/libogg.so.0 (0x00007f39ec045000)
libvorbis.so.0 => /usr/lib/x86_64-linux-gnu/libvorbis.so.0 (0x00007f39ebe1a000)
libvorbisenc.so.2 => /usr/lib/x86_64-linux-gnu/libvorbisenc.so.2 (0x00007f39ebb71000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f39eb956000)
libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007f39eb741000)
也可以用以下方法解决:
解决方法
vi /etc/ld.so.conf
tree /etc/ld.so.conf.d/
/etc/ld.so.conf.d/
├── fakeroot-x86_64-linux-gnu.conf
├── i386-linux-gnu_GL.conf -> /etc/alternatives/i386-linux-gnu_gl_conf
├── i686-linux-gnu.conf
├── libc.conf
├── x86_64-linux-gnu.conf
├── x86_64-linux-gnu_EGL.conf -> /etc/alternatives/x86_64-linux-gnu_egl_conf
├── x86_64-linux-gnu_GL.conf -> /etc/alternatives/x86_64-linux-gnu_gl_conf
├── zz_i386-biarch-compat.conf
├── zz_x32-biarch-compat.conf
└── zzzzz_ultrasec.conf
0 directories, 10 files
cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf
添加.so所在路径
/usr/local/lib
退出后执行
ldconfig