FFmpeg5.1.3编译动态库详细教程(基于Linux虚拟机)

news2024/9/27 19:23:25

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-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    

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

编译脚本

安装好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文件也赋权一下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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打包动态库:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1026299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis之增删查改功能

文章目录 一、创建各种类二、MyBatis的各种功能 1、查询<select>2、增加<insert>3、修改<update>4、删除<delete>三、总结 前言 在MyBatis项目中编写代码实现对MySql数据库的增删查改 一、创建各种类 1、在Java包的mapper文件下创建一个接口 我创建…

“毛细血管”的进化:华为分销业务如何让伙伴也有“高能级”

作者 | 曾响铃 文 | 响铃说 数字化蓬勃发展的大时代&#xff0c;除了那些中、大型企业&#xff0c;数量更为庞大的小微企业同样有借助数字化产品、服务来提升企业经营的需求&#xff0c;由此也带来了广袤的数字化分销市场。 这里处在聚光灯之外&#xff0c;很少被数字化时代…

PyCharm安装教程,新手详细

首先进入官网&#xff1a;https://www.jetbrains.com/pycharm/download/?sectionwindows#sectionwindows 然后选择版本&#xff0c;我下载的是社区版&#xff0c;一般学习是够了 然后点击Download进行下载。 双击exe运行 然后选择安装路径&#xff0c;建议放在D盘 然后这…

找不到msvcp140.dll的解决方法,以及msvcp140.dll丢失的原因

在计算机使用过程中&#xff0c;我们可能会遇到无法启动程序的问题&#xff0c;提示找不到 msvcp140.dll。这使得许多用户感到困扰&#xff0c;因为 msvcp140.dll 是 Microsoft Visual C Redistributable 的一个组件&#xff0c;它包含了 C 运行时库。这个库对于许多应用程序和…

SpringCLoud——RabbitMQ的消息模型

Work Queue工作队列 他的主要作用就是增加消费者的个数&#xff0c;可以提高消息处理速度&#xff0c;避免队列消息堆积。 案例 实现一个队列绑定多个消费者 首先修改一下之前的发送消息的代码&#xff0c;让他循环发送50次&#xff0c;但是不要一次性发完&#xff1a; Tes…

React(react18)中组件通信04——redux入门

React&#xff08;react18&#xff09;中组件通信04——redux入门 1. 前言1.1 React中组件通信的其他方式1.2 介绍redux1.2.1 参考官网1.2.2 redux原理图1.2.3 redux基础介绍1.2.3.1 action1.2.3.2 store1.2.3.3 reducer 1.3 安装redux 2. redux入门例子3. redux入门例子——优…

【算法】二分答案

文章目录 相关链接什么时候使用二分答案&#xff1f;题目列表最大化最小化相关题目列表&#x1f4d5;2439. 最小化数组中的最大值解法1——二分答案解法2——分类讨论O(n) 2513. 最小化两个数组中的最大值&#xff08;二分答案lcm容斥原理&#xff09;&#x1f402;好题&#x…

每日练习-8

目录 一、选择题 二、算法题 1.另类加法 2、走方格的方案数 一、选择题 1、 解析&#xff1a;当使用new运算符创建一个类的对象数组时&#xff0c;会调用该类的构造函数来初始化每个对象。因此&#xff0c;如果创建了5个对象&#xff0c;那么构造函数会被调用5次。 当使用delet…

[2023.09.20]:Yew的前端开发经历小结

今天基本上完成了一个操作闭环&#xff0c;即能够保存&#xff0c;拉取和删除数据。截个图 这个过程的前端和后端都是用Rust写的&#xff0c;前端使用的是Yew。 Yew是一种用于构建现代Web应用程序的Rust框架&#xff0c;其计目标是提供一种安全、高效、易用的方式来构建Web应…

智慧公厕:改变公共厕所管理与运营的未来

在现代社会中&#xff0c;公共厕所是城市建设的重要组成部分。然而&#xff0c;长期以来&#xff0c;公共厕所管理与运营一直是一个令人头疼的问题。由于各种原因&#xff0c;公共厕所常常陷入管理难、环境差、设备设施陈旧的状态&#xff0c;给人们的生活带来困扰。然而&#…

【性能优化下】组织结构同步优化二,全量同步/增量同步,断点续传实现方式

看到这一篇文章的 xdm &#xff0c;应该对组织结构同步有一些想法了吧&#xff0c;如果没有&#xff0c;可以看前面两篇文章&#xff0c;可以通过如下地址查看一下&#xff1a; 【性能优化上】第三方组织结构同步优化一&#xff0c;你 get 到了吗&#xff1f; 坑爹&#xff0c…

Java中synchronized:特性、使用、锁机制与策略简析

目录 synchronized的特性互斥性可见性可重入性 synchronized的使用方法synchronized的锁机制常见锁策略乐观锁与悲观锁重量级锁与轻量级锁公平锁与非公平锁可重入锁与不可重入锁自旋锁读写锁 synchronized的特性 互斥性 synchronized确保同一时间只有一个线程可以进入同步块或…

函数扩展之——内存函数

前言&#xff1a;小伙伴们又见面啦。 本篇文章&#xff0c;我们将讲解C语言中比较重要且常用的内存函数&#xff0c;并尝试模拟实现它们的功能。 让我们一起来学习叭。 目录 一.什么是内存函数 二.内存函数有哪些 1.memcpy &#xff08;1&#xff09;库函数memcpy &…

交换机端口镜像详解

交换机端口镜像是一种网络监控技术&#xff0c;它允许将一个或多个交换机端口的网络流量复制并重定向到另一个端口上&#xff0c;以便进行流量监测、分析和记录。通过端口镜像&#xff0c;管理员可以实时查看特定端口上的流量&#xff0c;以进行网络故障排查、安全审计和性能优…

已解决 Microservice Error: Circuit Breaker: Service is temporarily unavailable

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

【操作系统】聊聊磁盘IO是如何工作的

磁盘 机械磁盘 主要是由盘片和读写磁头组成。数据存储在盘片的的环状磁道上&#xff0c;读写数据前需要移动磁头&#xff0c;先找到对应的磁道&#xff0c;然后才可以访问数据。 如果数据都在同一磁道上&#xff0c;不需要在进行切换磁道&#xff0c;这就是连续IO&#xff0c;可…

离散数学之 一阶逻辑等值演算与推理

一阶逻辑等值式与置换规则 基本等值式 这里用到了量词辖域的收缩 未完待续

电工三级证(高级)实战项目:PLC控制步进电机正反转

实训目的 了解使用PLC代替传统继电器控制回路的方法及编程技巧&#xff0c;理解并掌握步进电动机的运行方式及其实现方法。通过实验进一步加深理解步进电机控制的特点以及在实际中的应用。 控制要求 PLC设备:Siemens S7-200 要求:打开开关K0(I0.0)得电&#xff0c;启动PLC程…

【xshell和xftp连接Ubuntu教程】

一、下载xshell和xftp 下载地址 https://www.xshell.com/zh/free-for-home-school/ 二、连接xshell 输入ip&#xff0c;端口号 输入用户名&#xff0c;密码 出现这个使用就行了 三、连接xftp 同上&#xff0c;输入ip&#xff0c;端口&#xff0c;用户名&#xff0c;密码 连接成…

拓扑关系如何管理?

在设备对接涂鸦的云端过程中&#xff0c;一部分设备由于自身资源或硬件配置&#xff0c;无法直接连接云端。而是需要通过网关进行中转&#xff0c;由网关代理实现和云端进行数据交互&#xff0c;间接实现设备接入云端。这样的设备也称为子设备。 要想实现网关代理子设备接入云…