当前位置: 首页 > 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++ 库的编译和集成的参考。通过这样的实践,开发者能够更好地掌握库的使用和项目构建的技巧,为后续开发打下坚实的基础。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 园区AR导航系统构建详解:从三维地图构建到AR融合导航的实现
  • JAVA面试题---JVM
  • JAVA零基础小白自学日志——第十九天
  • 【音视频】AAC编码器与ffmpeg生成AAC数据
  • 机器学习·概率论基础
  • conda:导出与创建环境快照
  • Github 2024-07-20 开源项目日报Top10
  • Jupyter Notebook与机器学习:使用Scikit-Learn构建模型
  • 【开源库学习】libodb库学习(一)
  • sourcetree中常用功能使用方法及gitlab冲突解决
  • Git提交到错误分支怎么办?(解决办法)
  • 解决前端开发中的浏览器兼容性问题
  • 区块链技术和系统;ZKRollup ;区块链交易打包和审查
  • IOT 的 10 种常见协议、组网模式、特点及其使用场景浅析
  • 如何判断自己的数据格式适合使用json还是Excel的形式存入neo4j数据库
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • CSS魔法堂:Absolute Positioning就这个样
  • fetch 从初识到应用
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • JavaScript设计模式与开发实践系列之策略模式
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • MySQL的数据类型
  • PAT A1017 优先队列
  • PHP那些事儿
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • 分享几个不错的工具
  • 开发基于以太坊智能合约的DApp
  • 聊聊flink的BlobWriter
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 入手阿里云新服务器的部署NODE
  • 我有几个粽子,和一个故事
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​ArcGIS Pro 如何批量删除字段
  • ​渐进式Web应用PWA的未来
  • # Maven错误Error executing Maven
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #Lua:Lua调用C++生成的DLL库
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (windows2012共享文件夹和防火墙设置
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (算法二)滑动窗口
  • (一一四)第九章编程练习
  • (转)iOS字体