Ubuntu环境下编译FFmpeg的流程
不需要安装虚拟机,使用Window10自带的ubuntu引导程序安装ubuntu系统。
安装步骤:
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
可以事先把原来的内容做个备份,这里是更换的阿里的源,需要注意的是要根据ubuntu的不同版本,来替换。
sudo apt update
sudo apt upgrad
如果需要中文版,可以去安装中文语言包。如需图形界面,也要另外安装。
sudo apt install gcc
安装后,可以测试编译下HelloWorld.c,
如不能正常编译:
Ubuntu下,查看对应window的盘符:/mnt/d,/mnt/c
Window下查看ubuntu的文件系统:
C:\Users\jianlin\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\rootfs
Git clone https://github.com/FFmpeg/FFmpeg.git
因为要用NDK编译用于android平台的FFmpeg,要下载linux的android sdk
build_bash.sh
这里只编译了arm64-v8a平台的库。
脚本中的编译选择,如要支持那些格式的编解码,要编译静态库,还是动态库,都在FFmpeg目录下的configure文件中。
-extra-cflags
fPIC,编译共享库时,告诉编译器产生与位置无关的代码,
-mfpu=neon-vfp4 ARM平台的指令编译优化,NEON+VFP结构
-mfloat-abi=hard or softfp,
-marm
-O0~3 开启编译器优化,-O0为不优化,-O3为最高级别的优化
-mthumb 使编译器生成THUMB指令
-mthumb-interwork 使编译器生成支持ARM和Thumb指令集之间相互调用的代码,默认是-mno-thumb-interwork
以下是脚本代码:
#!/bin/bash
NDK=/home/jianlinwang/android-ndk/android-ndk-r21b
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
API=26
#--enable-debug=3 --disable-debug
function build_android
{
echo "Compiling FFmpeg for $CPU"
./configure \
--target-os=android \
--logfile=$FILE \
--prefix=$PREFIX \
--bindir=$DIR \
--enable-neon \
--enable-hwaccels \
--enable-gpl \
--disable-debug \
--disable-postproc \
--enable-shared \
--enable-static \
--enable-jni \
--enable-small \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-symver \
--cross-prefix=$CROSS_PREFIX \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fPIC -DANDROID -marm $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
echo "The Compilation of FFmpeg for $CPU is completed"
cp -avx $PREFIX/ /mnt/d/FFmpeg-build/$CPU
cp -avx $DIR/ /mnt/d/FFmpeg-build/$CPU
cp -f $FILE /mnt/d/FFmpeg-build/$CPU
}
#armv-7a
ARCH=arm
CPU=armv7-a
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mthumb -mfpu=neon -march=$CPU"
FILE=$(pwd)/android/config.log
DIR=$(pwd)/android/bin
build_android
#armv8-a
ARCH=arm64
CPU=armv8-a
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=hard -mfpu=neon-vfp4 -mthumb-interwork -march=$CPU"
FILE=$(pwd)/android/config.log
DIR=$(pwd)/android/bin
#build_android
Bin目录下是可执行文件(这个需要编译window平台下的版本才好用)
Include 项目中导入ffmpeg库时,需要导入的头文件
Lib 静态库,动态库
Share 使用范例代码
Config.log 编译log,从这里log可以看出,编译出的库对编解码格式的支持情况。