当前位置: 首页 > news >正文

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

准备工作

环境准备

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.lryc.cn/news/211256.html

相关文章:

  • 【语义分割】语义分割概念及算法介绍
  • 基于RK3568高性价比全国产EMS储能解决方案(一)概述
  • 3 Go的基础语法
  • Redis之Lua脚本讲解
  • redis archive github
  • 3台Centos7快速部署Kafka集群
  • 最小栈(C++解法)
  • Python 算法高级篇:堆排序的优化与应用
  • 视频下载软件 Downie4 mac中文介绍
  • 计算机操作系统重点概念整理-第一章 计算机系统概述【期末复习|考研复习】
  • 树莓派基金会近日发布了新版基于 Debian 的树莓派操作系统
  • Web项目如何做单元测试
  • MySQL主从复制(基于GTID--事务ID方式)
  • 3.72 Command Buffer及URP概述
  • 分布式理论和分布式锁知识点总结
  • IOC课程整理-17 Spring事件
  • 大数据Flink(一百零五):SQL性能调优
  • ESP8266,手机与电脑之间的TCP通讯
  • vue的数据监听是如何实现的?
  • 埋点日志解决方案——Golang+Gin+Sarama VS Java+SpringCloudGateway+ReactorKafka
  • LeetCode 541 反转字符串 II 简单
  • 从入门到精通:深入了解CSS中的Grid网格布局技巧和应用!
  • Android Studio Giraffe 添加 maven { url “https://jitpack.io“ }报错
  • Linux C/C++ 实现网络流量分析(性能工具)
  • python门牌制作,统计某个数字出现的次数
  • 轻量封装WebGPU渲染系统示例<7>-材质多pass(源码)
  • 0030Java程序设计-积分管理系统论文
  • H5游戏源码分享-考眼力游戏猜猜金币在哪
  • 2023 年值得关注的国外网络安全初创公司
  • 搞定蓝牙-第六篇(HID