FFmpeg5.1.3编译动态库踩坑之旅(基于Linux虚拟机)

news2024/11/17 6:50:48

准备工作

环境准备

1.Windows安装Oracle VM VirtualBox 7.0.10,安装ubuntu-22.04.3。

坑一:无法往虚拟机里拖放复制文件,解决办法:登录Ubuntu虚拟机时切换到xorg方式登录,参考地址:Ubuntu Desktop 22.04 无法实现拖放复制操作解决办法-CSDN博客

下载文件

下载ndk25

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

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

下载FFmpeg 5.1.3

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

解压文件

解压文件:


#解压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 

 ndk配置环境变量

配置环境变量命令:sudo gedit ~/.bashrc   注意:替换为你的ndk路径

export NDK_HOME=/你的ndk路径/android-ndk-r25c
export PATH=$NDK_HOME:$PATH  
输入命令 ndk-build查看配置环境变量成功没,只要没出command not found就证明环境变量配置成功,如果成功显示如下,

下载所需编译软件

首先更新包列表:

sudo apt update

然后下载需要的编译软件

sudo apt install autoconf \
automake \
build-essential \
cmake \
git-core \
libass-dev \
libfreetype6-dev \
libgnutls28-dev \
libmp3lame-dev \
libsdl2-dev \
libtool \
libva-dev \
libvdpau-dev \
libvorbis-dev \
libxcb1-dev \
libxcb-shm0-dev \
libxcb-xfixes0-dev \
meson \
ninja-build \
pkg-config \
texinfo \
wget \
yasm \
zlib1g-dev \
libunistring-dev \
libaom-dev \
libdav1d-dev \
pkg-config

配置root用户

注意:编译的时候用root用户,我用普通用户编译失败

普通用户登录成功后设置 root 用户的登录密码,然后 su 登录

$ sudo passwd root
[sudo] password for dummy:  			# 此处需输入普通用户的登录密码
New password:					# 此处输入 root 用户的登录密码(新设置密码)
Retype new password:				# 此处再次输入 root 用户的登录密码(确认与上面的密码输入一致)
passwd: password updated successfully
$ su
Password:					# 此处输入上面设置的 root 用户登录密码,回车即可登录至 root 用户
# exit						# 退出登录 root 用户,回到普通用户登录态

到这一步编译所需的准备工作就做完了,接下来终于可以开始编译了。

 编译FFmpeg

修改FFmpeg的configure文件,将文件中:

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

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 编译成功,可以看到已经生成了.so动态库文件。

坑二:最后强调:赋权限和执行build_android.sh  都使用root用户,我普通用户编了半天也不成功。

参考连接:

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

 【Android音视频开发】FFmpeg库编译详解(2022最新版)_android 编译ffmpeg_JesseAndroid的博客-CSDN博客

 【精选】ffmpeg编译参数详解_--disable-swscale-alpha-CSDN博客

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

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

相关文章

LLVM学习笔记(55)

4.1.3. 降级 在前面的章节里,我们展示了目标机器特定节点与目标机器无关节点共存的一个图。你可能会问,如果这是指令选择的一个输入,为什么在SelectionDAG类中已经有一些目标机器特定的节点?要理解这,我们首先在下图概…

Kafka - 3.x 图解Broker总体工作流程

文章目录 Zk中存储的kafka的信息Kafka Broker总体工作流程1. broker启动后向zk中注册2. Controller谁先启动注册,谁说了算3. 由选举出来的Controller监听brokers节点的变化4. Controller决定leader选举5. Controller将节点信息上传到Zk中6. 其他Controller从zk中同步…

numpy和字符串格式化,用*画田字形状

numpy的字符型元素矩阵,可以方便画;直接python字符串手撕,也可以轻巧完成。 (本笔记适合熟悉循环和列表的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《…

鸿蒙ArkUI-X跨端应用开发,一套代码构建多平台应用

文章目录 一、项目介绍二、技术架构三、Gitee仓库地址四、ArkUI-X开发者文档五、快速开始——环境准备1、下载DevEco Studio,版本V4.0 Beta2以上2、打开DevEco,下载相关环境配置3、配置开发环境3.1、OpenHarmony SDK3.2、安装ArkUI-X SDK3.2、Android SD…

科聪协作(复合)移动机器人整体解决方案

协作(复合)移动机器人(AGV/AMR)相较传统工业机器人具有更加安全和简单的工作优势,具备较强的发展潜力。协作(复合)移动机器人安全性和操作的简洁性、灵活性不断提高,优势得到了充分发挥,在越来越…

浏览器事件循环 (event loop)

进程与线程 进程 进程的概念 进程是操作系统中的一个程序或者一个程序的一次执行过程,是一个动态的概念,是程序在执行过程中分配和管理资源的基本单位,是操作系统结构的基础。 简单的来说,就是一个程序运行开辟的一块内存空间&a…

Windows-Oracle19c 安装详解-含Navicate远程连接配置 - 同时连接Oracle11g和Oracle19c

文章目录 0 说明1 下载链接2 安装:一定要以管理员身份运行,不然后面有可能会报错。3 启动监听4. 登录Oracle4 Navicate远程连接-配置监听4.1 修改监听文件4.2 网络配置助手-配置本地监听端口4.3 Navicate连接成功 5 Navicate同时连接两个Oracle数据库 0 …

读高性能MySQL(第4版)笔记21_读后总结与感想兼导读

1. 基本信息 高性能MySQL:经过大规模运维验证的策略(第4版) High Performance MySQL, Fourth Edition [美] Silvia Botros(西尔维亚博特罗斯);Jeremy Tinley(杰里米廷利) 电子工业出版社,2022年10月出版 1.1. 读薄率 书籍总字…

窗帘布艺经营配送小程序商城的效果如何

窗帘布艺覆盖生活中多个使用场景,可以说是必需品,由于需要客户提供尺寸乃至上门安装等,因此传统客户购买此类产品,一般会选择线下亲自购买,包括质感、论价、挑选等。 但随着互联网电商深入,线上销售和客户…

Java NIO 高并发开发

Java NIO 高并发开发 前言 Java NIO(New I/O)相比于传统的Java I/O(BIO)在高并发开发方面具有以下优势: 非阻塞模式:Java NIO使用非阻塞的I/O操作,允许一个线程管理多个通道(Channe…

<多线程章节十> 定时器的使用方法以及定时器的模拟实现

文章目录 💐专栏导读💡Java标准库中的定时器类💡模拟实现定时器 💐专栏导读 本篇文章收录于多线程,也欢迎翻阅博主的其他文章,可能也会让你有不一样的收获😄 🍂JavaSE🌷多…

Studio One6.5新版本功能介绍及下载图文教程

studio one6更新了。studio one终于迎来了期待已久的6.5版本,增加了杜比全景声环绕声等混音模式,让我们混音更加方便!Studio One 6破是一个功能完整的工作站,不止于专业的音乐制作和编辑,Studio One也是一个直播表演工…

计算机视觉 激光雷达结合无监督学习进行物体检测的工作原理

一、简述 激光雷达是目前正在改变世界的传感器。它集成在自动驾驶汽车、自主无人机、机器人、卫星、火箭等中。该传感器使用激光束了解世界,并测量激光击中目标返回所需的时间,输出是点云信息,利用这些信息,我们可以从3D点云中查找障碍物。 从自动驾驶汽车的角度看激光雷达…

MySQL启动后反复重新启动故障

MySQL版本为5.6.45 系统为Ubuntu 20.04 LTS 该服务器重启后,MySQL需要手动执行启动。 运行执行脚本后发现异常,如下图: 提示MySQL服务在不停重复启动。 反复使用ps -ef |grep mysql命令查看,发现mysql进程号一直在变化&#x…

ChatGLM推出第三代基座大模型在论文阅读、文档摘要和财报分析等方面提升超过50%推理成本降低一半...

“ 智谱AI发布了第三代基座大模型ChatGLM3,在模型性能、功能支持、开源序列等方面进行了全面升级。ChatGLM3在语义、数学、推理、代码、知识等不同角度的数据集上测评显示,具有在10B以下的基础模型中最强的性能。同时,ChatGLM3还支持多模态理…

数据库的概念和sql语句

数据:数字信息 据:就是属性 对一系列对象的具体属性的描述的集合 数据库:数据库就是用来组织(各个数据之间是有关联。是按照规则组织起来的),存储和管理(对数据的增删改查)的仓库 …

推荐一本书《变速领导力》

大家好,这里是大话硬件。 今天想再给大家推荐一本书《变速领导力》。前段时间推荐的《横向领导力》在国庆假期内已经全部读完了,目前在进行二刷,边刷边做思维导图笔记。 就在二刷横向领导力的同时,假期还带了一本书回来《变速领导力》。这本书是在公司无意中看到其他组的…

【C语言_文件_进程_进程间通讯 常用函数/命令 + 实例】.md_update:23/10/27

目录: 文件相关命令进程相关命令getpid(); fork(); vfork();exit(6);wait(status); WEXITSTATUS(status);exec组函数 对比 system popen :精彩博文跳转: 进程间通讯精彩博文跳转pipe 无名管道mkfifo 有名管道消息队列共享内存_映射信号编程查…

139.【JUC并发编程-04】

JUC-并发编程04 (八)、共享模型之工具1.线程池(1).自定义线程池_任务数小于队列容量(2).自定义线程池_任务数大于队列容量(3).自定义线程池_拒绝策略 2.ThreadPoolExecutor(1).线程池状态(2).构造方法(3).newFixedThreadPool (固定大小线程池)(4).newCachedThreadPool (缓存线程…

企业内部IM即时聊天软件WorkPlus,自主可控的信创即时通讯IM

随着国家的发展发展,很多技术因为一些原因越来越受制于人,尤其是上游核心技术。为了解决这个问题,我国明确了“数字中国”建设战略,强调“自主”、“安全”、“可控”,不被“卡脖子”。在信创产业链的各环节中&#xf…