之前在投简历很多公司都做短视频相关的,都要求懂FFmpeg,抖音真的带动了一大波短视频相关岗位哈。下面就记录下使用的相关步骤:
1.编译环境
用的是我买的一个阿里云。也可以在Windows下安装VMWare搭建虚拟机。
可以参考我之前写的文章:VMware虚拟机搭建。
2. 准备 NDK
下载:
wget https://dl.google.com/android/repository/android-ndk-r15c-linux-x86_64.zip
解压:
unzip android-ndk-r15c-linux-x86_64.zip
这里下载的 ndk 要下载 r17 之前的版本。
3. 准备 FFmpeg
下载:
wget https://github.com/FFmpeg/FFmpeg/archive/n4.0.4.tar.gz
解压:
tar -zxvf n4.0.4.tar.gz
4. 编译x264
FFmpeg 只支持 mediacodec 解码,并不支持mediacodec编码,如果要使用 FFmpeg 进行编码的话需要引入x264,在 解压后的目录下下载 x264:
wget https://code.videolan.org/videolan/x264/-/archive/stable/x264-stable.tar.gz
解压:
tar -zxvf x264-stable.tar.gz
解压完生成如下目录:
修改文件名字:
mv x264-stable x264
修改后如下:
编译 x264:
在 x264 的文件夹目录下,新建 build.sh 文件:
#!/bin/bash
NDK=/root/workspace/ndk/android-ndk-r15c
configure()
{
CPU=$1
PREFIX=$(pwd)/android/$CPU
HOST=""
CROSS_PREFIX=""
SYSROOT=""
if [ "$CPU" == "armv7-a" ]
then
HOST=arm-linux
SYSROOT=$NDK/platforms/android-21/arch-arm/
CROSS_PREFIX=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
else
HOST=aarch64-linux
SYSROOT=$NDK/platforms/android-21/arch-arm64/
CROSS_PREFIX=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-
fi
./configure \
--prefix=$PREFIX \
--host=$HOST \
--enable-pic \
--enable-static \
--enable-neon \
--extra-cflags="-fPIE -pie" \
--extra-ldflags="-fPIE -pie" \
--cross-prefix=$CROSS_PREFIX \
--sysroot=$SYSROOT
}
build()
{
make clean
cpu=$1
echo "build $cpu"
configure $cpu
#-j<CPU核心数>
make -j4
make install
}
build arm64
build armv7-a
保存并退出,执行 chmod +x build.sh
赋予脚本执行权限,并运行脚本:
./build.sh
当运行结束后,在 x264 目录生成了android目录,可以分别在android/armv7-a/lib和android/arm64/lib目录下找到编译好的静态库libx264.a:
5. 编译 FFmpeg
在 FFmpeg 的目录下找到 config 文件,做如下的修改:
修改前:
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)'
这里末尾的空格记得删除。
在 FFmpeg 的目录下新建 build.sh:
#!/bin/bash
NDK=/root/workspace/ndk/android-ndk-r15c
ADDI_CFLAGS="-fPIE -pie"
ADDI_LDFLAGS="-fPIE -pie"
configure()
{
CPU=$1
PREFIX=$(pwd)/android/$CPU
x264=$(pwd)/x264/android/$CPU
HOST=""
CROSS_PREFIX=""
SYSROOT=""
ARCH=""
if [ "$CPU" == "armv7-a" ]
then
ARCH="arm"
HOST=arm-linux
SYSROOT=$NDK/platforms/android-21/arch-arm/
CROSS_PREFIX=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
else
ARCH="aarch64"
HOST=aarch64-linux
SYSROOT=$NDK/platforms/android-21/arch-arm64/
CROSS_PREFIX=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-
fi
./configure \
--prefix=$PREFIX \
--disable-encoders \
--disable-decoders \
--disable-avdevice \
--disable-static \
--disable-doc \
--disable-ffplay \
--disable-network \
--disable-doc \
--disable-symver \
--enable-neon \
--enable-shared \
--enable-libx264 \
--enable-gpl \
--enable-pic \
--enable-jni \
--enable-pthreads \
--enable-mediacodec \
--enable-encoder=aac \
--enable-encoder=gif \
--enable-encoder=libopenjpeg \
--enable-encoder=libmp3lame \
--enable-encoder=libwavpack \
--enable-encoder=libx264 \
--enable-encoder=mpeg4 \
--enable-encoder=pcm_s16le \
--enable-encoder=png \
--enable-encoder=srt \
--enable-encoder=subrip \
--enable-encoder=yuv4 \
--enable-encoder=text \
--enable-decoder=aac \
--enable-decoder=aac_latm \
--enable-decoder=libopenjpeg \
--enable-decoder=mp3 \
--enable-decoder=mpeg4_mediacodec \
--enable-decoder=pcm_s16le \
--enable-decoder=flac \
--enable-decoder=flv \
--enable-decoder=gif \
--enable-decoder=png \
--enable-decoder=srt \
--enable-decoder=xsub \
--enable-decoder=yuv4 \
--enable-decoder=vp8_mediacodec \
--enable-decoder=h264_mediacodec \
--enable-decoder=hevc_mediacodec \
--enable-hwaccel=h264_mediacodec \
--enable-hwaccel=mpeg4_mediacodec \
--enable-ffmpeg \
--enable-bsf=aac_adtstoasc \
--enable-bsf=h264_mp4toannexb \
--enable-bsf=hevc_mp4toannexb \
--enable-bsf=mpeg4_unpack_bframes \
--enable-cross-compile \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--sysroot=$SYSROOT \
--extra-cflags="-I$x264/include $ADDI_CFLAGS" \
--extra-ldflags="-L$x264/lib"
}
build()
{
make clean
cpu=$1
echo "build $cpu"
configure $cpu
make -j4
make install
}
build arm64
build armv7-a
赋予脚本执行权限:
chmod +x build.sh
执行编译:
./build.sh
接下来经过一段时间的等待后,在以下路径下生成了多个 so 文件:
参考:
https://blog.youkuaiyun.com/bobcat_kay/article/details/88843778
https://blog.youkuaiyun.com/bobcat_kay/article/details/80889398