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

Ubuntu编译ffmpeg并添加cmake工程

文章目录

  • 前言
    • 前提须知
    • 为什么要自己编译 FFmpeg
    • 前提软件包与工具的安装
    • 编译ffmpeg
    • 写CMakeList.txt包含ffmpeg到我们项目中
  • 总结


前言

FFmpeg 是一个领先的多媒体框架,能够解码、编码、转码、复用、解复用、流化、过滤和播放几乎所有人类和机器创造的内容。FFmpeg 包含 libavcodec,这是一个可以用来处理音频和视频数据的强大库。本文将介绍如何在 Ubuntu 上编译 FFmpeg,并创建一个使用 CMake 的示例项目,以验证 FFmpeg 库的正确安装和配置。


前提须知

其实我们不必自己编译ffmpeg,如果你的ubuntu已经安装了ffmpeg的话,你可以在/usr/include/x86_64-linux-gnu找到ffmpeg的头文件。在/usr/lib/x86_64-linux-gnu里面可以找到.a静态库

如果你使用这种方式,你可以有下面这个CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.10)
project(ffmpeg_test)# 设置C标准
set(CMAKE_C_STANDARD 99)# 查找FFmpeg库
find_package(PkgConfig REQUIRED)
pkg_check_modules(AVFORMAT REQUIRED libavformat)
pkg_check_modules(AVCODEC REQUIRED libavcodec)
pkg_check_modules(AVUTIL REQUIRED libavutil)# 包含FFmpeg头文件路径
include_directories(${AVFORMAT_INCLUDE_DIRS})
include_directories(${AVCODEC_INCLUDE_DIRS})
include_directories(${AVUTIL_INCLUDE_DIRS})# 添加可执行文件
add_executable(ffmpeg_test main.c)# 链接FFmpeg库
target_link_libraries(ffmpeg_test ${AVFORMAT_LIBRARIES} ${AVCODEC_LIBRARIES} ${AVUTIL_LIBRARIES})

并有这样的main文件:

#include <stdio.h>
#include "include/libavcodec/avcodec.h"
#include "include/libavformat/avformat.h"
#include "include/libavutil/avutil.h"int main() {printf("FFmpeg version: %s\n", av_version_info());return 0;
}

我们可以通过cmake ..+make的操作来得到可执行文件:

ubuntu@ubuntu-virtual-machine:~/MyFFMPEG/template_c$ ls
build  CMakeLists.txt  include  lib  main.c
ubuntu@ubuntu-virtual-machine:~/MyFFMPEG/template_c$ cd build/
ubuntu@ubuntu-virtual-machine:~/MyFFMPEG/template_c/build$ cmake ..
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ubuntu/MyFFMPEG/template_c/build
ubuntu@ubuntu-virtual-machine:~/MyFFMPEG/template_c/build$ make
Consolidate compiler generated dependencies of target ffmpeg_test
[100%] Built target ffmpeg_test
ubuntu@ubuntu-virtual-machine:~/MyFFMPEG/template_c/build$ ./ffmpeg_test 
FFmpeg version: 7.0.1
ubuntu@ubuntu-virtual-machine:~/MyFFMPEG/template_c/build$ 

为什么要自己编译 FFmpeg

自己编译 FFmpeg 而不是使用预编译包,有几个主要原因:

  1. 最新版本

    • 预编译包通常与发行版的发布周期一致,可能并不是最新的。通过自己编译,可以确保使用最新的 FFmpeg 版本,获取最新的特性和修复。
  2. 自定义配置

    • 编译 FFmpeg 时可以指定各种配置选项,例如启用或禁用特定的编码器、解码器、滤镜或其他组件。这对于需要定制功能的项目尤为重要。
  3. 优化性能

    • 可以根据目标硬件的架构进行特定的编译优化,例如启用高级的 CPU 指令集(如 AVX、SSE)以提高性能。
  4. 减少依赖

    • 预编译包可能包含不需要的功能和依赖项,通过自己编译,可以仅包含项目所需的功能,从而减少不必要的依赖和潜在的安全风险。
  5. 集成第三方库

    • 有时需要与其他第三方库集成,例如 NVIDIA CUDA、Intel Quick Sync Video 等,通过自己编译可以轻松实现这些集成。

通过自己编译 FFmpeg,可以更好地控制其功能和性能,满足特定项目的需求。

前提软件包与工具的安装

首先,你需要在ffmpeg code download下载ffmpeg源码,如果你需要其他版本可以在More releases里面找到
在这里插入图片描述
然后你需要使用下面这个命令安装SDL2:

sudo apt install libsdl2-dev

之后,你需要安装aptitude

sudo apt install aptitude

yasmnasm是两个汇编器,编译 FFmpeg 需要用到。

sudo aptitude install yasm nasm

最后,你需要安装这些:
FFmpeg 的安装依赖许多库(如,音频编码库,音频解码库,视频编解码库等),这里不介绍每个库的具体作用,按照命令安装即可。

sudo apt-get install libgmp3-dev
sudo apt install pkg-config
sudo apt install gnutls-bin
sudo aptitude install libaom-dev
sudo aptitude install libass-dev
sudo aptitude install libbluray-dev
sudo aptitude install libfdk-aac-dev
sudo aptitude install libmp3lame-dev
sudo aptitude install libopencore-amrnb-dev
sudo aptitude install libopencore-amrwb-dev
sudo aptitude install libopenmpt-dev
sudo aptitude install libopus-dev
sudo aptitude install libshine-dev
sudo aptitude install libsnappy-dev
sudo aptitude install libsoxr-dev
sudo aptitude install libspeex-dev
sudo aptitude install libtheora-dev
sudo aptitude install libtwolame-dev
sudo aptitude install libvo-amrwbenc-dev
sudo aptitude install llibvpx-dev
sudo aptitude install libwavpack-dev
sudo aptitude install libwebp-dev
sudo aptitude install libx264-dev
sudo aptitude install libx265-dev
sudo aptitude install libxvidcore-dev
sudo aptitude install liblzma-dev

编译ffmpeg

首先,你需要先新建一个文件夹,用来保存编译后存放的内容

然后终端打开ffmpeg源码文件夹

./configure --prefix=/home/ubuntu/runffmpeg/FFMPEG --enable-shared

输出:

ubuntu@ubuntu-virtual-machine:~/runffmpeg/ffmpeg-7.0.1$ ./configure --prefix=/home/ubuntu/runffmpeg/FFMPEG --enable-shared
install prefix            /home/ubuntu/runffmpeg/FFMPEG
source path               .
C compiler                gcc
C library                 glibc
ARCH                      x86 (generic)
big-endian                no
runtime cpu detection     yes
standalone assembly       yes
x86 assembler             nasm
MMX enabled               yes
MMXEXT enabled            yes
3DNow! enabled            yes
3DNow! extended enabled   yes
SSE enabled               yes
SSSE3 enabled             yes
AESNI enabled             yes
AVX enabled               yes
AVX2 enabled              yes
AVX-512 enabled           yes
AVX-512ICL enabled        yes
XOP enabled               yes
FMA3 enabled              yes
FMA4 enabled              yes
i686 features enabled     yes
CMOV is fast              yes
EBX available             yes
EBP available             yes
debug symbols             yes
strip symbols             yes
optimize for size         no
optimizations             yes
static                    yes
shared                    yes
postprocessing support    no
network support           yes
threading support         pthreads
safe bitstream reader     yes
texi2html enabled         no
perl enabled              yes
pod2man enabled           yes
makeinfo enabled          yes
makeinfo supports HTML    yes
xmllint enabled           noExternal libraries:
alsa                    libxcb_shape            lzma                    xlib
iconv                   libxcb_shm              sdl2                    zlib
libxcb                  libxcb_xfixes           sndio
//省略.....................................
External libraries providing hardware acceleration:
libdrm                  v4l2_m2m                vaapi                   vdpauLibraries:
avcodec                 avfilter                avutil                  swscale
avdevice                avformat                swresamplePrograms:
ffmpeg                  ffplay                  ffprobe
//省略............................................
Enabled indevs:
alsa                    kmsgrab                 oss                     v4l2
fbdev                   lavfi                   sndio                   xcbgrabEnabled outdevs:
alsa                    oss                     sndio                   xv
fbdev                   sdl2                    v4l2License: LGPL version 2.1 or later

紧接着,你需要使用:

sudo make-jxx

其中xx是你Ubuntu cpu核心数
比如我是12,则是sudo make-j12
如果不这样写,就会编译的很慢
在这里插入图片描述

最后使用:

sudo make install

即可完成

ubuntu@ubuntu-virtual-machine:~/runffmpeg/FFMPEG$ tree -L 2
.
├── bin
│   ├── ffmpeg
│   ├── ffplay
│   └── ffprobe
├── include
│   ├── libavcodec
│   ├── libavdevice
│   ├── libavfilter
│   ├── libavformat
│   ├── libavutil
│   ├── libswresample
│   └── libswscale
├── lib
│   ├── libavcodec.a
│   ├── libavcodec.so -> libavcodec.so.61.3.100
│   ├── libavcodec.so.61 -> libavcodec.so.61.3.100
│   ├── libavcodec.so.61.3.100
│   ├── libavdevice.a
│   ├── libavdevice.so -> libavdevice.so.61.1.100
│   ├── libavdevice.so.61 -> libavdevice.so.61.1.100
│   ├── libavdevice.so.61.1.100
│   ├── libavfilter.a
│   ├── libavfilter.so -> libavfilter.so.10.1.100
│   ├── libavfilter.so.10 -> libavfilter.so.10.1.100
│   ├── libavfilter.so.10.1.100
│   ├── libavformat.a
│   ├── libavformat.so -> libavformat.so.61.1.100
│   ├── libavformat.so.61 -> libavformat.so.61.1.100
│   ├── libavformat.so.61.1.100
│   ├── libavutil.a
│   ├── libavutil.so -> libavutil.so.59.8.100
│   ├── libavutil.so.59 -> libavutil.so.59.8.100
│   ├── libavutil.so.59.8.100
│   ├── libswresample.a
│   ├── libswresample.so -> libswresample.so.5.1.100
│   ├── libswresample.so.5 -> libswresample.so.5.1.100
│   ├── libswresample.so.5.1.100
│   ├── libswscale.a
│   ├── libswscale.so -> libswscale.so.8.1.100
│   ├── libswscale.so.8 -> libswscale.so.8.1.100
│   ├── libswscale.so.8.1.100
│   └── pkgconfig
└── share├── doc├── ffmpeg└── man15 directories, 31 files

这里面是我们需要的东西了,我们需要includelib(*.a)里面的东西

写CMakeList.txt包含ffmpeg到我们项目中

下面就是我们的CMakeLists.txt文件了,你需要把includelib文件夹放到CMakeLists.txt同级目录下

cmake_minimum_required(VERSION 3.10)
project(ffmpeg_test C)# 设置 C 标准
set(CMAKE_C_STANDARD 99)# 指定 FFmpeg 的头文件和库文件目录
set(FFMPEG_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/include)
set(FFMPEG_LIB_DIR ${CMAKE_SOURCE_DIR}/lib)# 包含 FFmpeg 头文件目录
include_directories(${FFMPEG_INCLUDE_DIR})# 查找 FFmpeg 库
link_directories(${FFMPEG_LIB_DIR})# 添加可执行文件
add_executable(ffmpeg_test main.c)# 链接 FFmpeg 库
target_link_libraries(ffmpeg_testavcodecavformatavutil
)# 为了支持动态库,可以添加 `-Wl,-rpath=${FFMPEG_LIB_DIR}` 选项
set_target_properties(ffmpeg_test PROPERTIESLINK_FLAGS "-Wl,-rpath,${FFMPEG_LIB_DIR}"
)

总结

通过本文的步骤,我们成功地在 Ubuntu 系统上编译并安装了 FFmpeg。我们还创建了一个简单的 CMake 项目,使用 FFmpeg 库实现了一个基础的应用程序,验证了库的安装和配置。本文提供的方法不仅适用于 FFmpeg,也可以作为其他 C/C++ 库的编译和集成的参考。通过这样的实践,开发者能够更好地掌握库的使用和项目构建的技巧,为后续开发打下坚实的基础。

相关文章:

Ubuntu编译ffmpeg并添加cmake工程

文章目录 前言前提须知为什么要自己编译 FFmpeg前提软件包与工具的安装编译ffmpeg写CMakeList.txt包含ffmpeg到我们项目中 总结 前言 FFmpeg 是一个领先的多媒体框架&#xff0c;能够解码、编码、转码、复用、解复用、流化、过滤和播放几乎所有人类和机器创造的内容。FFmpeg 包…...

Vue.js[组件(Component)]

什么是: 拥有专属的HTML&#xff0c;CSS&#xff0c;数据的&#xff0c;可重用的页面独立区域 一个页面由多个组件聚合而成一个大型的页面 在代码层面上&#xff0c;一个组件就是一个可反复使用的自定义标签。 vs jq插件 vs boot组件 boot插件: 虽然可重用&#xff0c;但仍需…...

基于微信小程序+SpringBoot+Vue的校园自助打印系统(带1w+文档)

基于微信小程序SpringBootVue的校园自助打印系统(带1w文档) 基于微信小程序SpringBootVue的校园自助打印系统(带1w文档) 管理信息可以处理复杂的信息从而提高用户的工作效率&#xff0c;减少失误。所以本基于Vue和微信小程序的校园自助打印系统的开发非常有意义&#xff0c;本系…...

qt设置过滤器

1.创建事件过滤器类&#xff0c;在主窗口中安装事件过滤器 class PasteFilter : public QObject {Q_OBJECTpublic:PasteFilter(QObject *parent nullptr) : QObject(parent) {}protected:bool eventFilter(QObject *obj, QEvent *event) override {if (event->type() QEv…...

线上环境服务器CPU飙升排查

前因 收到线上服务器CPU使用率100%的告警信息。 环境 jdk1.8CentOS Linux &#xff1b;CentOS Linux 排查 查看服务器CPU使用率 果然cpu已经达到了100%了 命令 top 使用arthas工具 使用方式 arthas 执行命令java -jar arthas-boot.jar 然后执行命令 thread 看到有两个…...

unity文字||图片模糊

一.文字模糊 1、增大字体大小后等比缩放 快捷键R 2、更改字体渲染模式 二.图片模糊 1、更改过滤模式 2、更改格式或者压缩 3、如果只是图片边缘看不清&#xff0c;可以增加canvas/图片的每单位参考像素...

香薰学习笔记

1 喷香水的方法 ChatGPT-4o 学习使用香水是提升个人形象的一个好方法。 喷香水的方法如下&#xff1a; 皮肤吸收&#xff1a;香水最好喷在皮肤上&#xff0c;因为皮肤的温度能帮助香水散发出更好的香味。喷在衣服上可能会影响香水的原始味道。脉搏点&#xff1a;将香水喷在脉搏…...

iOS ------ weak的基本原理

1.weak的基本概念 weak弱引用&#xff0c;所引用的对象的引用计数不会加一&#xff0c;引用对象被释放的时候会自动设置为nil多用于解决对象间的相互引用造成内存泄露的循环引用的问题 2.实现原理 Person *object [[Person alloc] init]; id __weak objc object;Runtime维…...

实时更新UI界面

1.处理实时通信&#xff0c;几种方案 1&#xff1a;当一个用户发送一条需要实时更新的信息&#xff0c;我可以直接查找在线用户&#xff0c;通过在线用户来进行判断条件&#xff0c;发送更新请求 2&#xff1a;用户在一个需要实时更新的界面时&#xff0c;就不断的向服务端发…...

为什么Spring不推荐@Autowired用于字段注入

背景 Spring是Java程序员常用的框架之一。官方从Spring 4.0开始不推荐使用Autowired进行字段注入。 Spring注入方式 基于构造器注入&#xff1a;在构造器上使用Autowired。 优点&#xff1a;可以声明字段为final&#xff0c;确保字段在构造时被初始化。 基于setter方法注入&…...

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十九章 Linux MISC驱动

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…...

基于MobileNetv2的垃圾分类函数式自动微分-昇思25天打卡

基于MobileNetv2的垃圾分类 本文档主要介绍垃圾分类代码开发的方法。通过读取本地图像数据作为输入&#xff0c;对图像中的垃圾物体进行检测&#xff0c;并且将检测结果图片保存到文件中。 1、实验目的 了解熟悉垃圾分类应用代码的编写&#xff08;Python语言&#xff09;&a…...

STM32CubeIDE(CAN)

目录 一、概念 1、简述 2、CAN 的几种模式 二、实践 1、环回模式轮询通信 1.1 软件配置 1.2 代码编写 2、环回模式中断通信 2.1 软件配置 2.2 代码编写 一、概念 1、简述 STM32微控制器系列包含多个型号&#xff0c;其中一些型号集成了CAN&#xff08;Controller Are…...

GO Channel使用详解(各种场景下的最佳实践)

GO Channel使用详解(各种场景下的最佳实践) 一个知识点:通过反射的方式执行 select 语句,在处理很多的 case clause,尤其是不定长的 case clause 的时候,非常有用。而且,在后面介绍任务编排的实现时,我也会采用这种方法,所以,我先带你具体学习下 Channel 的反射用法…...

SwiftUI 5.0(iOS 17)滚动视图的滚动目标行为(Target Behavior)解惑和实战

概览 在 SwiftUI 的开发过程中我们常说&#xff1a;“屏幕不够&#xff0c;滚动来凑”。可见滚动视图对于超长内容的呈现有着多么秉轴持钧的重要作用。 这不&#xff0c;从 SwiftUI 5.0&#xff08;iOS 17&#xff09;开始苹果又为滚动视图增加了全新的功能。但是官方的示例可…...

picker 构建记录

picker 构建记录 tomlinuxtom:~/openverify/picker$ cd picker bash: cd: picker: 没有那个文件或目录 tomlinuxtom:~/openverify/picker$ export BUILD_XSPCOMM_SWIGpython tomlinuxtom:~/openverify/picker$ make rm -rf temp build /home/tom/Tools/verible-v0.0-3724/bin/…...

Docker部署kafka,Docker所在宿主机以外主机访问

# 安装启动zookeeper docker run -d --name zookeeper --publish 2181:2181 --volume /etc/localtime:/etc/localtime zookeeper:latest --network 指定的网络 -p&#xff1a;设置映射端口&#xff08;默认2181&#xff09; -d&#xff1a;后台启动 # 启动kafka docker run -d…...

控制欲过强的Linux小进程

控制欲强?视奸&#xff1f;普通人那才叫视奸&#xff0c;您是皇帝&#xff0c;天下大事无一逃过您的耳目&#xff0c;您想看什么就看什么&#xff0c;臣怀疑他在朋友圈私养兵士&#xff0c;囤积枪甲&#xff0c;蓄意谋反&#xff0c;图谋皇位啊&#xff01; 哈哈哈哈开个玩笑&…...

​探讨元宇宙和VR虚拟现实之间的区别​

在数字时代&#xff0c;人们对虚拟现实的兴趣与日俱增。在虚拟现实技术的推动下&#xff0c;出现了两个概念&#xff1a;元宇宙和VR虚拟现实。虽然这两个概念都与虚拟现实有关&#xff0c;但它们有着不同的特点和用途。在本文中&#xff0c;我们将探讨元宇宙和VR虚拟现实之间的…...

Docker Desktop安装

0 Preface/Foreward 1 安装 1.1 运行docker安装包 安装完Docker Desktop后&#xff0c;运行Docker Desktop&#xff0c;出现WSL 2安装不完整情况&#xff0c;具体情况如下&#xff1a; 解决方法&#xff1a;旧版 WSL 的手动安装步骤 | Microsoft Learn 也可以直接下载新的安…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...