音视频开发4-补充 FFmpeg 开发环境搭建 -- 配置环境 Ubuntu 22.04.2 LTS +FFmpeg 7.0

配置环境 Ubuntu 22.04.2 LTS +FFmpeg 7.0

参开如下的博客内容,但是实际build 中使用 FFmpeg 6.0 会有build error,网上查资料,需要使用7.0中的代码切换6.0中的一部分,因为嫌麻烦,直接换成7.0

【调试经验】Ubuntu FFmpeg开发环境搭建 - 知乎

Step 1 建立目录

希望存放项目的目录下创建三个文件夹(实际操作中就是放在home/hunandede 下,hunandede是你的用户名),分别是:

  • ffmpeg_sources:用于下载源文件
  • ffmpeg_build: 存储编译后的库文件
  • bin:存储编码解析库等(ffmpeg,ffplay,ffprobe,X264,X265等)

#在主目录下创建,这个可以自定义
cd ~
mkdir ffmpeg_sources  ffmpeg_build bin

Step 2 安装依赖库

在这之前若库不是最新的,通过sudo apt-get update更新一下软件列表。

在终端粘贴下列代码,安装需要的依赖库:

更新

sudo apt-get update

安装需要的组件

sudo apt-get -y install \autoconf \automake \build-essential \cmake \git-core \libass-dev \libfreetype6-dev \libsdl2-dev \libtool \libva-dev \libvdpau-dev \libvorbis-dev \libxcb1-dev \libxcb-shm0-dev \libxcb-xfixes0-dev \pkg-config \texinfo \wget \zlib1g-dev \libasound2-dev \libgl1-mesa-dev \libglew-dev\libglm-dev

Step 3 编译和安装

对于不需要用到的编码库可以直接跳过不安装,并在FFmpeg中删除相应的./configure选项。比如若不需要libvpx,则不安装libvpx编码库,然后从安装FFmpeg部分中删除 --enable-libvpx。

Tip:如果是多核系统,可以尝试使用 make -j 指令来加快编译速度(例如make -j4,使用4个内核协助编译)

NASM

部分库使用到汇编程序。在终端运行下列代码

使用源码进行安装

cd ~/ffmpeg_sources && \
wget https://www.nasm.us/pub/nasm/releasebuilds/2.16/nasm-2.16.tar.bz2 && \
tar xjvf nasm-2.16.tar.bz2 && \
cd nasm-2.16 && \
./autogen.sh && \
PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" && \
make && \
make install

说明

1. autogen.sh是一个脚本文件,通常用于生成configure脚本和Makefile

2. PATH="$HOME/ffmpeg/bin:$PATH"

这句话的意思是,给环境变量PATH重新赋值,将 /home/hunandede/ffmpeg/bin 加入到环境变量中。

:冒号是分隔符的意思

3.

./configure --prefix="$HOME/ffmpeg/ffmpeg_build" --bindir="$HOME/ffmpeg/bin"

configure    --prefix=PATH

PATH 为安装的路径,如/usr/local

--prefix是最常用的选项,制作出的makefile会查看此选项传递的参数,

configure   --bindir=DIR

指定二进制文件的安装位置,这里的二进制文件定义为可以被用户直接执行的程序

其中--prefix选项是配置安装的路径,如果不配置该选项,安装可执行文件默认放在/usr/local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc,其它的资源文件放在/usr/local/share,比较凌乱

configure 脚本中有大量的命令行选项,对于不同的软件包来说,这些可能有些变化。1、configure    --help输出帮助信息2、configure    --version输出产生的configure脚本的Autoconf的版本号3、configure    --prefix=PATHPATH 为安装的路径,如/usr/local--prefix是最常用的选项,制作出的makefile会查看此选项传递的参数,4、configure   --bindir=DIR指定二进制文件的安装位置,这里的二进制文件定义为可以被用户直接执行的程序5、configure   --libexecdir=DIR指定可执行支持文件的安装位置,与二进制文件相反,这些文件从来不直接由用户执行,可以被上面提到的二进制文件所执行6、configure   --datadir=DIR指定通用数据文件的安装位置7、configure   --sharedstatedir=DIR指定可以在多个机器上共享的可写数据的安装位置8、configure   --localstatedir=DIR指定只能在单机使用的可写数据的安装位置9、configure  --libdir=DIR指定库文件的安装位置10、configure  --includedir=DIR指定C头文件的安装位置,其他语言如c++的头文件也可以使用此选项11、configure   --oldincludedir=DIR指定除GCC外编译器安装的C头文件的安装位置12、configure   --mandir=DIR指定手册页的安装位置13、configure  --build=BUILD指定软件包安装的系统平台。如果没有指定,默认的值是--host选项的值14、configure   --disable-FEATURE禁用一些配置,例如 # ./configure  --disable-gui15、configure    --enable-FEATURE[=ARG]启用一些配置。例如 # ./configure  --enable-buffers=12316、configure   --with-tcl=/usr/local   --with-tk=/usr/local--with 依赖的安装包路径17、configure  --without-gnu-ld使编译器不使用GNU ld

Yasm

部分库使用到该汇编库

使用源码进行安装:

cd ~/ffmpeg_sources && \
wget -O yasm-1.3.0.tar.gz https://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz && \
tar xzvf yasm-1.3.0.tar.gz && \
cd yasm-1.3.0 && \
./configure   CFLAGS="-fPIC" CPPFLAGS="-fPIC"  --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" && \
make && \
make install

说明:

wget -O yasm-1.3.0.tar.gz https://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz

-O指定完整路径名,会下载到指定目录与文件

libx264

H.264视频编码器。更多信息和使用范例参考H.264 Encoding Guide
要求编译ffmpeg时配置:--enable-gpl --enable-libx264
使用源码进行编译:

cd ~/ffmpeg_sources && \
git -C x264 pull 2> /dev/null || git clone --depth 1 https://github.com/mirror/x264.git && \
cd x264 && \
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static --enable-pic && \
PATH="$HOME/bin:$PATH" make && \
make install

libx265

H.265/HEVC 视频编码器, 更多信息和使用范例参考H.265 Encoding Guide。
要求编译ffmpeg时配置:--enable-gpl --enable-libx265
使用源码进行编译:

sudo apt-get install mercurial libnuma-dev && \
cd ~/ffmpeg_sources && \if cd x265 2> /dev/null; then git pull && cd ..; else git clone https://gitee.com/mirrors_videolan/x265.git; fi && \
cd x265/build/linux && \
PATH="$HOME/bin:$PATH" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED=off ../../source && \
PATH="$HOME/bin:$PATH" make && \
make install

libvpx

VP8/VP9视频编解码器。 更多信息和使用范例参考VP9 Video Encoding Guide 。
要求编译ffmpeg时配置: --enable-libvpx
使用源码进行编译:

cd ~/ffmpeg_sources && \
git -C libvpx pull 2> /dev/null || git clone --depth 1 https://github.com/webmproject/libvpx.git && \
cd libvpx && \
PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm --enable-pic && \
PATH="$HOME/bin:$PATH" make && \
make install

libfdk-aac

注意:这里刚开始使用ubuntu16.04的时候,会build 不过,原因不明,猜测应该是版本兼容问题。在ubuntu22 上是可以build pass 的

AAC音频编码器. 更多信息和使用范例参考AAC Audio Encoding Guide。

要求编译ffmpeg时配置:--enable-libfdk-aac ( 如果你已经配置了 --enable-gpl则需要加上--enable-nonfree).

使用源码进行编译:

cd ~/ffmpeg_sources && \
git -C fdk-aac pull 2> /dev/null || git clone --depth 1 https://github.com/mstorsjo/fdk-aac && \
cd fdk-aac && \
autoreconf -fiv && \
./configure CFLAGS="-fPIC" CPPFLAGS="-fPIC" --prefix="$HOME/ffmpeg_build"   && \
make && \
make install

libmp3lame

MP3音频编码器.

要求编译ffmpeg时配置:--enable-libmp3lame.

使用源码进行编译:

cd ~/ffmpeg_sources && \
git clone  --depth 1 https://gitee.com/hqiu/lame.git && \
cd lame && \
PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"  --enable-nasm --with-pic && \
PATH="$HOME/bin:$PATH" make && \
make install

libopus  

Opus音频编解码器.

要求编译ffmpeg时配置:--enable-libopus.

使用源码进行编译:

cd ~/ffmpeg_sources && \
git -C opus pull 2> /dev/null || git clone --depth 1 https://github.com/xiph/opus.git && \
cd opus && \
./autogen.sh && \
./configure --prefix="$HOME/ffmpeg_build"  -with-pic&& \
make && \
make install

FFmpeg

注意的是这里使用的7.0版本,在参考的博客中使用的是6.0,会有build error,换成7.0就OK了。


cd ~/ffmpeg_sources && \
wget -O ffmpeg-7.0.tar.bz2 https://ffmpeg.org/releases/ffmpeg-7.0.tar.bz2 && \
tar xjvf ffmpeg-7.0.tar.bz2 && \
cd ffmpeg-7.0 && \
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" CFLAGS="-O3 -fPIC" ./configure \--prefix="$HOME/ffmpeg_build" \--pkg-config-flags="--static" \--extra-cflags="-I$HOME/ffmpeg_build/include" \--extra-ldflags="-L$HOME/ffmpeg_build/lib" \--extra-libs="-lpthread -lm" \--bindir="$HOME/bin" \--enable-gpl \--enable-libass \--enable-libfdk-aac \--enable-libfreetype \--enable-libmp3lame \--enable-libopus \--enable-libvorbis \--enable-libvpx \--enable-libx264 \--enable-libx265 \--enable-pic \--enable-shared   \--enable-nonfree && \
PATH="$HOME/bin:$PATH" make && \
make install && \
hash -r

通过这段指令,在重新启动Ubuntu后可以识别新安装FFmpeg的位置:

source ~/.profile

Step 4 使用

确认ffmpeg版本

查看ffmpeg版本以及编译配置信息

ffmpeg -version

会发现有问题,

ffmpeg -versionffmpeg: error while loading shared libraries: libavdevice.so.61: cannot open shared object file: No such file or directory

原因是:找不到需要的libavdevice.so.61,实际上就是找不到动态库

执行的ffmpeg是一个可执行文件,我们在unbutn中随便打开一个窗口,执行ffmpeg这个可执行程序,能找到该程序,但是该程序找打不到所依赖的动态库。

那么这里有三个问题:

1.为什么能找到ffmpeg这个可执行程序?

        这是因为 我们在前面的 下载 FFmpeg并build ffmepg的时候,有添加 这一行PATH="$HOME/bin:$PATH"

因此可以通过环境变量PATH找到 ffmpeg这个命令。

2.所需要的动态库libavdevice.so.61在哪里?

仔细观察,我们实际上也是在build的时候,就执行了在HOME/ffmpeg_build/lib下  参考extra-ldflags="-L$HOME/ffmpeg_build/lib" \

3.如果将动态库让ffmpeg命令可以找到?

参考 之前的blog。https://blog.csdn.net/hunandede/article/details/129466014?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22129466014%22%2C%22source%22%3A%22hunandede%22%7D

也可以参考关键部分:

解决方案一:只在当前窗口起作用

LD_LIBRARY_PATH=/home/hunandede/ffmpeg_build/lib:$LD_LIBRARY_PATH

export LD_LIBRARY_PATH

解决方案二:永久生效
sudo -i   先切换到root下

1. 配置文件/etc/ld.so.conf/etc/ld.so.conf.d/*.conf

需要root 权限,在 ubuutun22上,切换root 命令为 sudo -i

2. 将库文件的路径添加到这些配置文件中,然后运行

sudo ldconfig

ffmpeg代码调试 暂时未测试


生成的可执行程序中,ffmpeg 不包含调试信息,调试信息在 ffmpeg_g 中,Debug 要选择 ffmpeg_g。
除此之外,./config选项是确定调试信息的核心,需在config中添加:

- –enable-debug=3:开启debug调试
- –disable-asm:禁用 asm 优化
- –disable-optimizations:禁用优化,以便调试时按函数顺序执行。
- –disable-stripping:禁用剥离可执行程序和共享库,即调试时可以进入到某个函数进行单独调试。
将configure生成的文件清空一下:
make clean

然后重新配置config

./configure \
  --prefix="$HOME/ffmpeg_build" \
  --pkg-config-flags="--static" \
  --extra-cflags="-I$HOME/ffmpeg_build/include" \
  --extra-ldflags="-L$HOME/ffmpeg_build/lib" \
  --extra-libs="-lpthread -lm" \
  --bindir="$HOME/bin" \
  --enable-gpl \
  --enable-libass \
  --enable-libfdk-aac \
  --enable-libfreetype \
  --enable-libmp3lame \
  --enable-libopus \
  --enable-libvorbis \
  --enable-libvpx \
  --enable-libx264 \
  --enable-libx265 \
  --enable-pic \
  --enable-shared   \
  --enable-nonfree \
  --enable-debug=3 \
  --disable-optimizations \
  --disable-asm \
  --disable-stripping && \
PATH="$HOME/bin:$PATH" make && \
make install && \
hash -r

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

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

相关文章

【网站项目】SpringBoot379儿童疫苗接种管理系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

Python自学之路--004:Python使用注意点(原始字符串‘r’\字符转换\‘wb’与‘w区别’\‘\‘与‘\\’区别)

目录 1、原始字符串‘r’ 2、字符转换问题 3、open与write函数’wb’与’w’区分 4、Python里面\与\\的区别 1、原始字符串‘r’ 以前的脚本通过Python2.7写的,通过Python3.12去编译发现不通用了,其实也是从一个初学者的角度去看待这些问题。 其中的\…

解放双手,批量自动上传视频到微信视频号

文件夹里面有很多视频,一个个手工上传到视频号很麻烦,可以借助AI来自动化。 先把视频号上传流程熟悉一遍,把一些按钮截图,记录一些屏幕坐标。 然后,在deepseek的代码助手中输入提示词: 你是一个Python编程…

机器学习-SVM预测

本文使用机器学习SVM对数据进行预测。仅供参考 1、数据 1.1 训练数据集: medol.xlsx文件示例 otv3015-1.9153622093018-1.9634097763021-1.7620284083024-1.789477583 1.2 预测数据集 test.xlsx文件示例 ot35163519 2、模型训练 train.py import pandas as …

软件工程期末复习(8)需求的表达方法和状态转换图

需求的表达方法 系统模型 需求分析的任务就是借助于当前系统的逻辑模型导出目标系统的逻辑模型,解决目标系统 “做什么” 的问题 通常软件开发项目是要实现目标系统的物理模型。目标系统的具体物理模型是由它的逻辑模型经实例化,即具体到某个业务领域而…

韵搜坊 -- java爬虫抓取数据

文章目录 三种抓取方式数据抓取的流程获取文章具体操作 获取用户获取图片jsoup操作 三种抓取方式 直接调用请求接口(最方便,这里使用该方法) HttpClient,OKHttp,RestTemplate,Hutool等网页渲染出明文内容后,从前端页面的内容抓取有些网站可能是动态请求…

第三十二天 | 46.全排列 47.全排列||

终于进入排列!(之前都是组合) 排列和组合的区别:在数学上的区别都懂,主要是看在代码实现上有什么区别 题目:46.全排列 树型结构比较简单 用used标记某一元素是否使用过。在组合问题中,其实是…

【制作100个unity游戏之26】unity2d横版卷轴动作类游戏7(附带项目源码)

最终效果 系列导航 文章目录 最终效果系列导航前言血条 能量条UI配置画布绘制血条 能量条UI 头像框 延迟虚血源码完结 前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第26篇中,我们将探索如何…

数据库设计大题详解

大题一:画E-R图(概念结构设计) 实体就是具体的物品,关系就是实体之间的关系,属性就是特征,内涵的意思 简单的小栗子: 1对1,1对n,n对m,自己考虑两者存在这个关…

PatterNodes 3 mac矢量图设计 ,色彩与图案的完美融合!

PatterNodes 3 for Mac是一款功能强大的矢量图形模式创建软件,专为Mac用户设计。它采用基于节点的界面,支持创建形状、线条、曲线或文本,以构建复杂的矢量图形模式。该软件还具备灵活的参数调整功能,允许用户实时预览结果并进行无…

根据参考风格进行矢量图绘制

摘要 利用机器学习根据给定的文本描述生成图像的技术已经取得了显著的进步,例如CLIP图像-文本编码器模型的发布;然而,当前的方法缺乏对生成图像风格的艺术控制。我们提出了一种方法,用于为给定的文本描述生成指定风格的绘图&…

Spring框架学习笔记(三):AOP编程

1 动态代理 1.1 通过案例理解动态代理 (1)需求说明: 1. 有 Vehicle接口(交通工具接口, 有一个 run 方法), 下面有两个实现类 Car 和 Ship 2. 当运行 Car 对象 的 run 方法和 Ship 对象的 run 方法时,输入如下内容, 注意观察前后…

HTML静态网页成品作业(HTML+CSS+JS)——在线购物商城网页设计制作(4个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,使用Javacsript代码实现图片轮播切换,共有4个页面。 二、…

手机图片恢复不求人:手动找回丢失的照片!

无论是外出旅行、聚会还是日常点滴,我们总是习惯用手机记录下来,让美好的瞬间定格在一张张照片中。然而,有时因为误删、清空缓存或是更换手机,那些珍贵的照片突然消失了。手机图片恢复有什么简单易行、容易上手的方法吗&#xff1…

容器组件:角标组件,纵向拖动组件(HarmonyOS学习第四课【4.2】)

Badge(角标组件) 可以附加在单个组件上用于信息标记的容器组件。 说明 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 支持单个子组件。 说明 子组件类型:系统组件…

Online RL + IL : Active Policy Improvement from Multiple Black-box Oracles

ICML 2023 paper code 紧接上一篇MAMBA,本文在同种问题设定下的在线模仿学习方法。 Intro 文章提出了一种新的模仿学习算法,名为 MAPS(Max-aggregation Active Policy Selection)和其变体 MAPS-SE(Max-aggregation A…

SSL证书对于网络安全的重要作用

SSL证书是一种数字证书,它通过加密技术确保了客户端(如浏览器)与服务器之间的数据传输安全。当一个网站安装了SSL证书后,用户在浏览器地址栏中可以观察到HTTPS(超文本传输安全协议)前缀和挂锁图标&#xff…

点量云流分享:关于实时渲染云推流技术

提到云串流或者云推流很多人可能和游戏关联起来,其实这个技术的应用领域不仅仅是游戏,还有云上旅游、考古、智慧园区、智慧城市、虚拟仿真等等行业。其解决的问题是将一些大型的3D应用程序放在云端,程序在运行的时候也是在云端,这…

可视化大屏C位图:生产线,状态一目了然。

在可视化大屏中,将生产线作为C位图(核心位图)具有以下价值: 实时监控 生产线作为C位图可以实时展示生产线上的各个环节和工艺的运行状态。通过C位图,操作员可以直观地了解生产线的整体运行情况,及时发现异…

数仓建模理论 之 维度建模

说起维度建模,你不得不知道以下几个概念:事实表、维度表、星型模型、雪花模型、星座模型 维度建模 Ralph Kimball推崇数据集市的集合为数据仓库,同时也提出了对数据集市的维度建模,将数据仓库中的表划分为事实表、维度表两种类型…