重大公告:2023年阿里云双11服务器限时大降价(1核2G1年仅需49元+2核4G1年100元) 速度点击查看!!!

FFmpeg编译详细教程(Linux环境)

1,162次阅读
没有评论

FFmpeg编译详细教程

FFmpeg编译详细教程

本文原创:猿视野 ( 一家分享技术架构思路,扩展程序员视野的网站,遇到技术问题,可以加联系方式相互交流)
转载请注明出处和相关链接,否则追究其法律责任!
原文地址:https://developer.aliyun.com/article/1326862?source=5176.11533457

环境准备

  1. Window系统安装虚拟机 VMware® Workstation 17 Pro 这里没有选择其它路线,是因为在linux系统上编译FFmpeg更加方便。坑相对少一点。
  2. electerm ssh工具,我这里用的是electerm,一款功能强大的开源ssh连接工具,本文用它来ssh连接我的虚拟机。
  3. ffmpeg-5.1.3.tar.xz
  4. android-ndkc-linux.zip

如果你是window系统,在进行本文之前,请先安装Linux虚拟机。我虚拟机安装的是CentOS6.5 建议大家虚拟机上安装CentOS7系列镜像。CentOS6系列版本在2020年的时候,官方不在支持了。影响你yum的使用。

下载文件

下载ndk25

官网下载:ndk官网
网盘下载:android-ndk-r25c-linux.zip

注意,这是linux环境下的ndk。

下载FFmpeg 5.1.3

官网下载:FFmpeg官网
网盘下载:FFmpeg 5.1.3

下载electerm

网盘下载:electerm

ssh连接工具,用这个远程连接Linux虚拟机

下载VMware 17 pro

网盘下载:VMware 17 pro破解版

下载CentOS6.5镜像或CentOS7镜像

下载地址:

  • Centos系统镜像地址:http://archive.kernel.org/centos-vault/7.8.2003/isos/x86_64/
  • Centos系统镜像地址汇总:http://isoredirect.centos.org/centos/7/isos/x86_64/

    这是为了安装Linux虚拟机需要,推荐CentOS7系列版本

下载glibc-2.17

网盘下载:glibc-2.17.tar.gz

这个文件提前下载好,后文会用到

文件下载好了,把FFmpeg 5.1.3和android-ndk-r25c-linux.zip 文件

先上传到你Linux虚拟机自定义的文件夹目录中,如图所示:

FFmpeg编译详细教程(Linux环境)

解压文件

解压文件:

#解压ffmpeg-5.1.3.tar.xz 
tar -xf ffmpeg-5.1.3.tar.xz

#解压android-ndk-r25c-linux.zip 
unzip android-ndk-r25c-linux.zip 

编译检查

# 编译FFmpeg之前先检查下环境
[root@CentOS6 ffmpeg-5.1.3]# ./configure --disable-x86asm    
#报错,没有安装gcc编译器
gcc is unable to create an executable file.
If gcc is a cross-compiler, use the --enable-cross-compile option.
Only do this if you know what cross compiling means.
C compiler test failed.

If you think configure made a mistake, make sure you are using the latest
version from Git.  If the latest version fails, report the problem to the
ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.libera.chat.
Include the log file "ffbuild/config.log" produced by configure as this will help
solve the problem.

安装 gcc编译库

[root@CentOS6 yum.repos.d]# yum install -y  gcc

Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
 Eg. Invalid release/repo/arch combination/
removing mirrorlist with no valid mirrors: /var/cache/yum/x86_64/6/base/mirrorlist.txt
Error: Cannot find a valid baseurl for repo: base

yum源失效问题

根据日志得出,问题是由于CentOS 6.5 yum源失效导致的错误,我虚拟机安装的是CentOS6.5版本,官方已经不支持CentOS6系列了,所以需要更换yum源地址。

解决CentOS6 yum源失效的问题:

#先切换文件夹目录,找到目录下的文件CentOS-Base.repo
cd /etc/yum.repos.d

CentOS-Base.repo文件修改为如下:

我这里用的是阿里的镜像

# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the 
# remarked out baseurl= line instead.
#
#

[base]
name=CentOS-$releasever - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
#baseurl=https://vault.centos.org/6.10/os/x86_64/
#阿里云镜像
baseurl=http://mirrors.aliyun.com/centos-vault/6.5/os/x86_64/
gpgcheck=0
#enabled=0
gpgkey=https://vault.centos.org/6.10/os/x86_64/RPM-GPG-KEY-CentOS-6

#released updates 
[updates]
name=CentOS-$releasever - Updates
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
#baseurl=https://vault.centos.org/6.10/updates/$basearch/
#阿里云镜像
baseurl=http://mirrors.aliyun.com/centos-vault/6.5/updates/x86_64/
gpgcheck=0
#enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
#baseurl=https://vault.centos.org/6.10/extras/$basearch/
#阿里云镜像
baseurl=http://mirrors.aliyun.com/centos-vault/6.5/extras/x86_64/
gpgcheck=0
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
#baseurl=https://vault.centos.org/6.10/centosplus/$basearch/
#阿里云镜像
baseurl=http://mirrors.aliyun.com/centos-vault/6.5/centosplus/x86_64/
gpgcheck=0
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6


#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib
#baseurl=http://mirror.centos.org/centos/$releasever/contrib/$basearch/
#baseurl=https://vault.centos.org/6.10/contrib/$basearch/
#阿里云镜像
baseurl=http://mirrors.aliyun.com/centos-vault/6.5/contrib/x86_64/
gpgcheck=0
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6


保存退出后,清除下缓存 yum clean all && yum makecache

其中gpgcheck改为 gpgcheck=0 否则会引发错误:GPG key retrieval failed: [Errno 14] problem making ssl connection

参考:CentOS 6停止维护更新后 yum源失效问题的解决

做完这一步,可以正确安装gcc了

# 安装gcc 编译库
yum install -y  gcc

确认您已经安装了正确版本的gcc和其他编译器工具。您可以使用以下命令来检查:

gcc --version make --version
 #执行命令之后,出现下图,没有报错的话,就可以进行下一步操作了。
 ./configure --disable-x86asm    

FFmpeg编译详细教程(Linux环境)

编译脚本

安装好gcc编译库之后,现在可以来新建编译脚本了

在FFmpeg目录下新建build_android.sh,想了解详细配置参数请前往这里

# touch 新建文件
[root@CentOS6 ffmpeg-5.1.3]# touch build_android.sh
# vim 编辑build_android.sh
[root@CentOS6 ffmpeg-5.1.3]# vim build_android.sh

写入脚本内容:

#!/bin/bash
#特别注意: 以下路径需要修改成自己Linux系统中的NDK目录!前面上传的ndk解压文件当中
TOOLCHAIN=/usr/local/src/android-ndk-r25b/toolchains/llvm/prebuilt/linux-x86_64
# 最低支持的android sdk版本
API=21
# --extra-cflags中添加'-DVK_ENABLE_BETA_EXTENSIONS=0', 防止引用vulkan_beta.h头文件
function build_android
{
echo "Compiling FFmpeg for $CPU"
./configure \
 --prefix=$PREFIX \
 --disable-neon \
 --disable-hwaccels \
 --disable-gpl \
 --disable-postproc \
 --enable-shared \
 --enable-jni \
 --disable-mediacodec \
 --enable-small \
 --enable-gpl \
 --disable-decoder=h264_mediacodec \
 --disable-static \
 --disable-doc \
 --disable-programs \
 --disable-ffmpeg \
 --disable-ffplay \
 --disable-ffprobe \
 --disable-avdevice \
 --disable-symver \
 --cross-prefix=$CROSS_PREFIX \
 --target-os=android \
 --arch=$ARCH \
 --cpu=$CPU \
 --cc=$CC \
 --cxx=$CXX \
 --enable-cross-compile \
 --sysroot=$SYSROOT \
 --extra-cflags="-DVK_ENABLE_BETA_EXTENSIONS=0 -mno-stackrealign -Os -fpic $OPTIMIZE_CFLAGS" \
 --extra-ldflags="$ADDI_LDFLAGS" \
 $ADDITIONAL_CONFIGURE_FLAG
make clean
make -j4
make install
echo "The Compilation of FFmpeg for $CPU is completed"
}

#armv8-a
ARCH=arm64
CPU=armv8-a
# r21版本的ndk中所有的编译器都在/toolchains/llvm/prebuilt/darwin-x86_64/目录下(clang)
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
# NDK头文件环境
SYSROOT=$TOOLCHAIN/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/llvm-
# so输出路径
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"
build_android

# 交叉编译工具目录,对应关系如下
# armv8a -> arm64 -> aarch64-linux-android-
# armv7a -> arm -> arm-linux-androideabi-
# x86 -> x86 -> i686-linux-android-
# x86_64 -> x86_64 -> x86_64-linux-android-

# CPU架构
#armv7-a
ARCH=arm
CPU=armv7-a
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$TOOLCHAIN/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/llvm-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
build_android

# #x86
# ARCH=x86
# CPU=x86
# CC=$TOOLCHAIN/bin/i686-linux-android$API-clang
# CXX=$TOOLCHAIN/bin/i686-linux-android$API-clang++
# SYSROOT=$TOOLCHAIN/sysroot
# CROSS_PREFIX=$TOOLCHAIN/bin/i686-linux-android-
# PREFIX=$(pwd)/android/$CPU
# OPTIMIZE_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
# build_android

# #x86_64
# ARCH=x86_64
# CPU=x86-64
# CC=$TOOLCHAIN/bin/x86_64-linux-android$API-clang
# CXX=$TOOLCHAIN/bin/x86_64-linux-android$API-clang++
# SYSROOT=$TOOLCHAIN/sysroot
# CROSS_PREFIX=$TOOLCHAIN/bin/x86_64-linux-android-
# PREFIX=$(pwd)/android/$CPU
# OPTIMIZE_CFLAGS="-march=$CPU -msse4.2 -mpopcnt -m64 -mtune=intel"
# 方法调用
# build_android


赋权限755

在FFmpeg目录下的ffbuild目录中,将图中sh文件权限改为755,否则编译过程中可能报错无权限执行该文件。build_android.sh文件也赋权一下。

FFmpeg编译详细教程(Linux环境)

chmod 755  build_android.sh

执行脚本

./ build_android.sh

发生报错:

/usr/local/src/ffmpeg5.1.3/android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang is unable to create an executable file.
C compiler test failed.

编译失败日志(日志信息位于ffbuild目录下的config.log文件):

BEGIN /tmp/ffconf.YxWX1yPS/test.c
    1   int main(void){ return 0; }
END /tmp/ffconf.YxWX1yPS/test.c
/usr/local/src/ffmpeg5.1.3/android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi21-clang --sysroot=/usr/local/src/ffmpeg5.1.3/android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/sysroot -DVK_ENABLE_BETA_EXTENSIONS=0 -mno-stackrealign -Os -fpic -mfloat-abi=softfp -mfpu=vfp -marm -march=armv7-a -march=armv7-a -c -o /tmp/ffconf.YxWX1yPS/test.o /tmp/ffconf.YxWX1yPS/test.c
/usr/local/src/ffmpeg5.1.3/android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/bin/clang: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /usr/local/src/ffmpeg5.1.3/android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/bin/clang)
/usr/local/src/ffmpeg5.1.3/android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/bin/clang: /lib64/libc.so.6: version `GLIBC_2.15' not found (required by /usr/local/src/ffmpeg5.1.3/android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/bin/clang)
/usr/local/src/ffmpeg5.1.3/android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/bin/clang: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /usr/local/src/ffmpeg5.1.3/android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib64/libc++.so.1)
/usr/local/src/ffmpeg5.1.3/android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/bin/clang: /lib64/libc.so.6: version `GLIBC_2.17' not found (required by /usr/local/src/ffmpeg5.1.3/android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib64/libc++.so.1)
C compiler test failed.

这个错误的原因是未安装2.17版本的glibc库。

而在CentOS6上,使用yum install glibc命令,只能更新到2.12版本。需要手动下载编译安装。

查看当前版本:

[root@CentOS6 ffmpeg-5.1.3]# rpm -qa | grep glibc
glibc-common-2.12-1.132.el6.x86_64
glibc-devel-2.12-1.132.el6.x86_64
glibc-2.12-1.132.el6.x86_64
glibc-headers-2.12-1.132.el6.x86_64

升级glibc到2.17版本

升级教程参考:Linux中提示:/lib64/libc.so.6: version `GLIBC_2.17′ not found 的解决办法

编译成功

再次编译FFmpeg:

./ build_android.sh

编译成功,可以看到已经生成了.so动态库文件。接下来需要做动态库的裁剪,我们不需要这么大的文件。

FFmpeg编译详细教程(Linux环境)

裁剪编译

裁剪FFmpeg打包动态库:

arison
版权声明:本站原创文章,由arison2023-09-13发表,共计13827字。
转载提示:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)