ffmpeg库编译安装及入门指南(Windows篇)- 2022年底钜献

news2024/12/23 10:35:30

最近项目需要,使用了 ffmpeg 做摄像头视频采集和串流。这几天有点时间,打算把相关的一些知识记录分享一下。

在撰写本文时,我又在另外一台电脑上把 ffmpeg 重新安装了一遍,所以绝对真实靠谱!如果你觉得文章写得还不错,敬请点个赞支持一下,十分感谢~

ffmpeg 简介

ffmpeg是一套跨平台的,用于音视频录制、转换、流化等操作的完善的解决方案,它是业界最负盛名的开源音视频框架之一。许多软件都是基于ffmpeg开发的,如格式工厂、各种xx影音等。

ffmpeg 是一套开源库以及命令行工具的集合,用户既可以使用命令行直接对音视频进行操作(CLI),也可以调用其开源库进行个性化的功能开发(SDK)。

如果要在自己的程序中使用 ffmpeg ,那么使用它的 SDK 是最好的选择。当前 ffmpeg 包含以下几个库:

  • libavcodec : 编/解码
  • libavfilter : 帧级操作(如添加滤镜)
  • libavformat : 文件 I/O 和 封装/解封装
  • libavdevice : 设备视频文件的封装/解封装
  • libavutil : 通用工具集合
  • libswresample : 音频重采样、格式处理、混音等
  • libpostproc : 预处理
  • libswscale : 色彩处理和缩放

ffmpeg 库在 Windows 下的安装

这个项目大部分是在 Linux 开发板上做的,Windows 上占一小部分。虽然如此,在 Windows 上安装 ffmpeg 的步骤一点都没法省。

ffmpeg 目前不提供预编译的库文件,而是需要自己下载源码并编译。看网上说 Windows 下编译 ffmpeg 非常麻烦,我想应该是“找到好用的教程”比较麻烦。本文使用 MSYS2 来编译 ffmpeg ,许多问题可以迎刃而解!

环境准备

在 Windows 下,编译需要做的准备如下:

  • 安装并配置 MYSY2
  • 安装 git (可选)
  • ffmpeg 源码
  • x264 源码(可选)

本节只讲述 MSYS2 的安装和配置和源码的下载。git 可根据需要自行选择安装。

安装 MSYS2 及编译工具链

MSYS2 是 Windows 下的一组编译套件,它可以在 Windows 系统中模拟 Linux 下的编译环境,如使用 shell 运行命令、使用 pacman 安装软件包、使用 gcc (MinGW) 编译代码等。简单来说,使用 MSYS2 ,你可以通过在 Linux 下非常熟悉的各种命令,来编译 Windows 下的软件。

官网描述:It provides a native build environment, based on open source software, and makes you feel right at home when you are already comfortable with Linux.

MSYS2 的安装也非常省心,只需要到 MSYS2 官网 下载.exe安装包,管理员身份运行安装即可。

注意安装盘必须是NTFS,路径要全使用 ACSII 字符,不能有空格。建议就安装在默认位置,如果不想装在 C 盘,就直接改下盘符,装在其他盘的根目录。

安装完毕后,开始菜单里就会有下面的程序:

2022-12-08-20-12-42

点击它们就会启动一个 shell 窗口,Just like on Linux ! 这个 shell 程序默认是 Mintty,类似 Linux 系统中的 bash shell。MSYS2 支持多个编译器工具链,它们的环境是独立的(可以去安装文件夹查看),这里选择启动 MINGW64 (如果你也是64位系统的话)。

首先为了提高下载速度,将下载源换成中科大的:

sed -i "s#mirror.msys2.org/#mirrors.ustc.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist*
pacman -Sy

2022-12-09-11-11-13

然后安装mingw64编译链和基本的依赖:

pacman -S mingw-w64-x86_64-toolchain  # mingw64编译工具链,win下的gcc
pacman -S base-devel    # 一些基本的编译工具
pacman -S yasm nasm     # 汇编器

安装完毕后,可以输入gcc -v查看 gcc 版本:

2022-12-09-11-16-46

最后需要添加环境变量。右击此电脑 -> 属性 -> 高级系统设置 -> 环境变量 -> 选择 Path (用户变量和系统变量都要)-> 编辑 -> 新建,添加编译工具链的路径:

2022-12-09-11-07-29

注意如果 MSYS2 没有安装在 C 盘,或者使用的不是 MINGW64 的shell,那么这里需要改成对应的路径。

添加环境变量这一步,是为了以后使用其他编辑器或者IDE时,能够找到 MINGW64 的编译工具链。在 MSYS2 中编译 ffmpeg 本身是不需要添加 Windows 的环境变量的。

ffmpeg 源码下载

在 ffmpeg 官网 下载源码,目前最新的版本是 5.1.2 。注意不要下载成 executable files 了,那个是可以直接运行的 CLI 程序。

你也可以直接下载 snapshot 版本,不过我个人更愿意下载带版本数字的。试想两年之后,谁能知道你电脑里的 snapshot 是何年何月的 snapshot 呢?

2022-12-08-15-10-59

三个 download 都可以,只是压缩包格式不一样:

2022-12-08-15-11-31

下载后解压到一个好找的文件夹即可。

x264 源码下载

ffmpeg 提供了相当多的外部库支持,但是如果要使用的话需要自己编译外部库。因为项目需要用到视频编码,所以此处加入 x264 库。

libx264 由 VideoLAN 组织所发布,它是 H.264 的一套性能较好的软编码器实现(不包括解码器)。H.264 (AVC) 是当前较常用的视频编码,目前 H.264 的继任者 H.265 (HEVC) 也渐趋成熟, VideoLAN 也有一套实现 libx265 。不过 libx265 的编译方式与 libx264 有所区别,目前我还没仔细研究。

戳这里访问 x264 的官方页面

官方建议使用 git 下载源码(下载压缩包再解压应该也是一样的):

git clone https://code.videolan.org/videolan/x264.git

编译和安装

将所有源码放到同一文件夹下便于管理,我把它们都统一放在一个叫 ffmpeg 的文件夹下。然后再建立各自的 install 文件夹存储编译好的库(当然你也可以选择其他任何地方的文件夹)。

为了方便,将编译的命令写成脚本 build-x264.shbuild-ffmpeg.sh。当前文件夹的结构如下(源码文件夹名称被我修改过了):

2022-12-09-12-07-39

编译 x264 库

build-x264.sh脚本内容如下:

#!/bin/sh
basepath=$(cd `dirname $0`;pwd)
echo ${basepath}

cd ${basepath}/x264-src   # 根据路径名称自行修改
pwd

./configure --prefix=${basepath}/x264_install --enable-shared
make -j8
make install

注意第一行必须是 #!/bin/sh ,才能被 MSYS2 的 shell 识别为可执行脚本。(亲测在 MSYS2 中chmod命令没有效果)

这几条命令中最重要的就是./configure命令,它的参数会指导编译器应该如何编译代码。这里 --prefix 参数指定了编译好的库文件的安装路径,可以自己任意指定。 --enable-shared 代表编译动态库。如果你需要静态库,那么需要加入 -enable-static 参数。

此外,make 命令的-j参数是指并行编译的线程数,可以根据你的 CPU 核数自行确定。

可以在源码文件夹下,通过 ./configure --help 命令查看所有可选参数。

在 MSYS2 的 shell 中,打开源码所在文件夹,并执行脚本:

cd /d/repos/ffmpeg
./build-x264.sh

注意 MSYS2 中文件路径的写法,是以/d代表 D 盘,类似 Linux 的风格。

2022-12-09-15-20-27

不出意外的话,等待片刻后就会在 x264_install 路径下看到编译好的库。其中 bin/libx264-164.dll 文件就是x264的动态库文件。

如果出现错误,可以先单独执行 .\configure 命令,然后再执行 make ,逐步查找错误原因。

编译 ffmpeg 库

build-ffmpeg.sh脚本内容如下:

#!/bin/sh
basepath=$(cd `dirname $0`;pwd)
echo ${basepath}

cd ${basepath}/ffmpeg-5.1.2-src
pwd

export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:/d/repos/ffmpeg/x264_install/lib/pkgconfig
echo ${PKG_CONFIG_PATH}

./configure --prefix=${basepath}/ffmpeg_5.2.1_install \
--enable-gpl --enable-libx264 --disable-static --enable-shared \
--extra-cflags=-l${basepath}/x264_install/include --extra-ldflags=-L${basepath}/x264_install/lib

make -j8
make install

使用的命令与libx264类似,也是先 configuremake 。如果需要添加 x264 支持的话,需要注意以下几点:

  • 加入 --enable-libx264 参数
  • 指定 PKG_CONFIG_PATH 变量,告知编译器 x264 库的路径
  • 指定 x264 库的头文件包含路径及动态库链接的路径

ffmpeg 可自定义的编译参数非常多,有需要可自行研究。

然后同样也是执行脚本即可:

cd /d/repos/ffmpeg
./build-ffmpeg.sh

ffmpeg 代码量较大,可能会编译比较久,多线程 make 可加快编译速度。我使用make -j8大约花了七八分钟。

编译完成后,就可以在 ffmpeg_5.2.1_install 路径下看到库文件了。其中 bin 下的一堆 dll 就是动态库文件。

2022-12-09-15-33-12

现在 ffmpeg 的 SDK 就任你调用了!下一节我们来试试调用 ffmpeg 编写程序。

ffmpeg 的 Hello World 程序

在 ffmpeg 安装路径下,打开 share\ffmpeg\examples ,可以看到 ffmpeg 的示例程序,它们也可以在 ffmpeg 的在线 API 文档 中查看到。

其中的 avio_reading.c 相当于 ffmpeg 的 Hello World,它会读取一个媒体文件的元数据信息并打印显示。

另外建一个文件夹,将avio_reading.c复制过去,然后用在 MYSY2 中打开这个目录,使用 gcc 命令编译。

gcc命令如下:

gcc avio_reading.c -o test \
-I"D:/repos/ffmpeg/ffmpeg_5.2.1_install/include/" \
-L"D:/repos/ffmpeg/ffmpeg_5.2.1_install/bin/" \
-lavcodec -lavformat -lavutil

编译完毕后,将在当前文件夹下生成可执行文件test.exe

注意在 shell 中运行程序之前,需要将两个库的安装目录添加到环境变量 PATH (这是MSYS2 的环境变量,不是 Windows 系统的)。

export PATH=$PATH:/d/repos/ffmpeg/x264_install/bin:/d/repos/ffmpeg/ffmpeg_5.2.1_install/bin

如果不执行export命令的话,那么运行test.exe时就无法链接到动态库,更令人困扰的是不会弹出任何提示,所以一定记得添加。当然如果你觉得每次打开都要运行太麻烦,也可以将这条命令添加到 你的安装位置/msys64/etc/profile 文件的末尾,这个文件和 Linux 下的/etc/profile文件作用是类似的。

运行测试效果如下:

2022-12-09-17-21-35

至此,我们迈出了使用 ffmpeg 库的第一步——也是一大步!

由于 gcc 的编译命令很长,重复手打很不方便,所以我一般会使用 vscode+cmake 的方式来做开发。不过这个配置又是较为麻烦的一件事,限于篇幅本文不再详述,感兴趣的读者可自行查阅资料。基本上只要注意把 gcc 的命令参数转换到 CmakeLists.txt 文件里,并注意终端的环境变量配置即可。

入门资料

ffmpeg 我也是最近才开始用,官方对 SDK 没有详细的入门教程,仅提供了 Doxygen 风格的 API 文档供查询。所以这里贴两个我觉得很好的入门帖,供与我一样刚刚入门的朋友参考。

首先是 Github 上的一篇tutorial:ffmpeg-libav-tutorial ,篇幅不长,读完可以对音视频有一个基本的认知。

然后是已故的音视频领域先驱雷霄骅(雷神)的博客 。需要注意的是现在的 ffmpeg 相比雷神当年使用的版本已经有了许多变化,使用雷神的源代码有时还需要修改。(斯人已逝,生者如斯!)

其他较为系统的参考资料我还没有找到,基本就是根据需要去百度or谷歌。有时 ffmpeg 官网也能派上一些用场,可以多翻翻。

后记

MSYS2 真是个好东西!

下一篇将讨论 ffmpeg 在 Linux 上的安装以及交叉编译的问题。

参考资料:
MSYS2中科大镜像源帮助
FFmpeg编译无坑版(Windows篇)

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

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

相关文章

MAC QT OpenGL 波浪特效

目录 一.MAC QT OpenGL 波浪特效效果演示 1.原始图片2.效果演示 二.MAC QT OpenGL 波浪特效源码下载三.其他平台波浪特效版本 1.IOS 演示效果2.Windows OpenGL ES 演示效果3.Windows OpenGL 演示效果 四.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >>…

安装微信开发者工具及创建小程序

大纲: 一、官网:微信公众平台微信公众平台,给个人、企业和组织提供业务服务与用户管理能力的全新服务平台。https://mp.weixin.qq.com/ 开发者工具下载页面https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html《开发者…

【教学类-22-02】20221210《八款字体的描字帖-4*4格整张-不用订书机》(大班主题《我是中国人-中国字》)

成品样式: 48号字(适应2-3个名字的大小) 44号字(适应4个名字大小(2-3个名字也可以用,字会稍微小)) 打印样式: 背景需求: 观摩中3班做“描花体字”的本子的情…

【前沿技术RPA】 一文了解 UiPath 状态机 State Machine

🐋作者简介:博主是一位.Net开发者,同时也是RPA和低代码平台的践行者。 🐬个人主页:会敲键盘的肘子 🐰系列专栏:UiPath 🦀专栏简介:UiPath在传统的RPA(Robotic…

【流量回放探索】啄木鸟流量回放平台

啄木鸟流量回放平台 项目简介 本项目是基于RuoYi-Vue单应用版本流量回放引擎基于goreplay演示系统基于newbee-mall-api-go 如果你想从录制开始体验,需要搭建演示系统newbee-mall-api-go ,同时需要将gor 部署在演示系统服务中,搭建kafka以便…

[附源码]Python计算机毕业设计SSM基于技术的高校学生勤工俭学管理系统的设计与开发(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

HBase

1 HBase存储结构 HMaster 1. 监控 RegionServer   2. 处理 RegionServer 故障转移   3. 处理元数据的变更   4. 处理 region 的分配或移除   5. 在空闲时间进行数据的负载均衡   6. 通过 Zookeeper 发布自己的位置给客户端 RegionServer 1. 负责存储 HBase 的实际数…

编写高质量代码 - 多线程和并发(2)

文章目录1. 使用线程异常处理器提升系统可靠性2. volatile不能保证数据同步3. 异步运算考虑使用Callable接口1. 使用线程异常处理器提升系统可靠性 我们要编写一个Socket应用,监听指定端口,实现数据包的接收和发送逻辑,这在早期系统间进行数据…

分布式计算MapReduce究竟是怎么一回事?

前言 如果要对文件中的内容进行统计,大家觉得怎么做呢?一般的思路都是将不同地方的文件数据读取到内存中,最后集中进行统计。如果数据量少还好,但是面对海量数据、大数据的场景这样真的合适吗?不合适的话,…

1560_AURIX_TC275_NMI Trap以及PMC

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) 1. 连同上一次的笔记中最后一页,看得出来NMI的trap软件触发至少是有三种方法。 2. 后半页给出了trap发生的状态的清除操作寄存器。 前面的文字描述部分,几个trap是…

基于jsp+mysql+ssm公共交通失信人员管理系统-计算机毕业设计

项目介绍 本南昌公共交通失信人员管理系统主要包括系统用户管理模块、用户信息管理模块、处罚类型管理、失信人员管理、登录模块、和退出模块等多个模块, 本系统基于SSM(SpringSpringMVCMyBatis)框架,适用于毕业设计,采用javaweb,基于B/S模式,Myeclipse或者eclipse…

手把手教你---猿如意之八大高效利器使用

开篇之前我们可能要来了解一下,《猿如意》是CSDN为提高开发者工作效率,发布客户端和低代码平台产品——《猿如意》;记得第一次在接触猿如意实在今年八月份,之前使用过其他的工具,但是有利有弊,先说下为啥选…

趋势分析 | 零信任实践之关键技术解读

SmartX 趋势分享 SmartX 趋势分享由 SmartX 团队内部分享的权威机构市场报告、全球重要媒体文章精选整理而成。内容涉及现代数据中心相关产业趋势以及金融、医疗、制造等行业全球用户需求与实践前沿洞察。本期,我们分享一篇 Gartner 关于零信任实践策略的文章[1]&am…

[附源码]JAVA毕业设计校园快递联盟系统(系统+LW)

[附源码]JAVA毕业设计校园快递联盟系统(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术…

【大数据入门核心技术-Azkaban】(二)Azkaban核心架构

目录 一、核心架构 1、Relational Database(Mysql) 2、Azkaban Web Server 3、Azkaban Executor Server 二、三种运行模式 1、solo server mode 2、two server mode 3、multiple executor mode 一、核心架构 Azkaban架构由三部分构成: 1、Relational Databa…

【chatGPT免注册】openAI机器人直接访问,不需要注册的方法

最近,chat GPT可谓是火出圈了。但是这个服务在国内不可用,网上你能找到的教程无非是注册一个虚拟的手机号去接受短信,可就算你能注册成功,还是无法访问。 还有人说可以去某宝买一个账号,这是可以的,账号的确…

安卓玩机搞机技巧综合资源-----干掉手机广告 禁用 冻结 关闭内置软件【八】

接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 安卓玩机搞机技巧综合资源------EROFS分区格式 小米红米…

Java 并发编程(三)之synchronized

带着BAT大厂的面试问题去理解Synchronized 请带着这些问题继续后文,会很大程度上帮助你更好的理解synchronized。 Synchronized可以作用在哪里? 分别通过对象锁和类锁进行举例。Synchronized本质上是通过什么保证线程安全的? 分三个方面回答:加锁和释放…

微信群营销方式微信群建群营销案例

今天我们以小区微信群营销为例,聊一聊具体的步骤和流程: 1、社群的建立,就是如何找到合适的小区,建立小区专属社群?因此,终端在做小区社群营销之前,需要先对当地所有的潜在小区做一个综合性的分析和评估&a…

Github使用

第一步 配置邮箱: ssh-keygen -t rsa -C 283589579qq.com然后一路回车不用管。 如下: 查看生成文件: cd .ssh ls如下: id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。…