Windows下如何编译FFmpeg

news2025/4/21 15:29:20

  ffmpeg一般在linux环境中使用,但是我们目前很多的开发工具是windows,为了方便在windows下调试和使用ffmpeg,我们需要再windows下面编译和使用ffpeg,本文只讲述windows下如何编译ffmpeg的内容。
  windows下编译ffmpeg有很多的方法,本文主要用MSYS2的方式来编译。其本质就是模拟一个linux的命令环境,用来编译ffmpeg

一、需要的软件下载

  在windows下编译ffmpeg,需要下载几个软件,我们将其下载在一个不带有中文名称的文件夹中。

1、下载MSYS2

官网下载地址:https://www.msys2.org/
在这里插入图片描述

2、下载FFmpeg源码

从ffmpeg官网上下载的源码好像不是最新的,后面编译的时候会报错,所以我们直接从github上下载5.1.2版本

在这里插入图片描述

3、下载x264源码

官网下载地址:https://www.videolan.org/developers/x264.html
在这里插入图片描述

4、下载SDL源码(可选,在编译FFplay.exe时需要)

官网下载地址:https://www.libsdl.org/
在这里插入图片描述
这里下载了2.26.3版本
在这里插入图片描述

将下载的软件解压放在一个没有中文名称和空格的文件夹中,以下是我的地址路径

在这里插入图片描述

二、安装MSYS2及编译工具链

1、点击msys2-x86_64-20230718.exe并完成安装,完成后的工具如下:

在这里插入图片描述

2、修改C:\msys64\msys2_shell.cmd文件,将 rem set MSYS2_PATH_TYPE=inherit 修改成 set MSYS2_PATH_TYPE=inherit

在这里插入图片描述

3、启动MSYS2 MINGW64,依次输入以下命令行开始安装mingw64编译链和基本依赖

  • 更新环境
pacman -Sy

如果出现 clang32: signature from “Christoph Reiter (MSYS2 development key) reiter.christoph@gmail.com” is invalid
解决方法是输入以下命令,

 rm -r /etc/pacman.d/gnupg/
 pacman-key --init
 pacman-key --populate msys2
 curl -O http://repo.msys2.org/msys/x86_64/msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz
 curl -O http://repo.msys2.org/msys/x86_64/msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz.sig
 pacman -U --config <(echo) msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz
 pacman -Syu

最终结果:
在这里插入图片描述

  • 安装基本依赖库
pacman -S mingw-w64-x86_64-toolchain  # mingw64编译工具链,win下的gcc,用于编译64位的库
pacman -S mingw-w64-i686-toolchain # 用于编译32位的库
pacman -S base-devel    # 一些基本的编译工具
pacman -S yasm nasm  gcc   # 汇编器
pacman -S mingw64/mingw-w64-x86_64-SDL2  #SDL2 是ffmpeg依赖的,因为没有它ffpaly不能用

安装完毕后,可以输入gcc -v查看 gcc 版本:
在这里插入图片描述

3、添加环境变量

最后需要添加环境变量。右击此电脑 -> 属性 -> 高级系统设置 -> 环境变量 -> 选择 Path (用户变量和系统变量都要)-> 编辑 -> 新建,添加编译工具链的路径:
在这里插入图片描述
注意如果 MSYS2 没有安装在 C 盘,或者使用的不是 MINGW64 的shell,那么这里需要改成对应的路径。添加环境变量这一步,是为了以后使用其他编辑器或者IDE时,能够找到 MINGW64 的编译工具链。在 MSYS2 中编译 ffmpeg 本身是不需要添加 Windows 的环境变量的。

三、编译和安装

1、新建FFmpeg-n5.1.2-install和x264-install两个文件夹,用来存放编译后安装的文件

2、打开SDL源码中的sdl2-config文件

在这里插入图片描述
修改其中的prefix路径,具体路径根据你文件所在位置确定,不能直接复制文件资源管理器中的路径,需要修改为以下格式

prefix=/d/worksoft/audioAndVideo/SDL2-2.26.3/x86_64-w64-mingw32

在这里插入图片描述

3、打开FFmpeg源码目录中的configure文件

在这里插入图片描述

修改SDL2_CONFIG路径,规则同上

SDL2_CONFIG="/d/worksoft/audioAndVideo/SDL2-2.26.3/x86_64-w64-mingw32/bin/sdl2-config"

在这里插入图片描述

4、编译x264

在放置文件的目录下新建build_x264.sh文件,内容如下:

#!/bin/sh
#进入执行脚本所在目录
basepath=$(cd `dirname $0`;pwd)
echo ${basepath}
 
#进入h264源码目录
cd ${basepath}/x264-master   # 根据路径名称自行修改
pwd
#配置编译参数
./configure --prefix=${basepath}/x264-install --enable-shared
#开始8线程编译
make -j8
#将编译后的文件拷贝到--prefix参数配置目录
make install

在MSYS2 MINGW64中执行如下命令,等待x264编译完成

cd /d/worksoft/audioAndVideo
./build_x264.sh

编译完成后,在x264-install目录下就可以看到编译后的文件
在这里插入图片描述

5、编译ffmpeg

在在放置文件的目录下新建build_ffmpeg.sh文件,内容如下:

#!/bin/sh
#进入执行脚本所在目录
basepath=$(cd `dirname $0`;pwd)
echo ${basepath}

#进入ffmpeg源码目录
cd ${basepath}/FFmpeg-n5.1.2  # 根据路径名称自行修改
pwd
#指定PKG_CONFIG_PATH变量,告知编译器x264库的路径
export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:${basepath}/x264-install/lib/pkgconfig
echo ${PKG_CONFIG_PATH}
#配置编译参数
./configure --prefix=${basepath}/FFmpeg-n5.1.2-install \
--enable-gpl \
--enable-debug \
--enable-libx264 \
--disable-static \
--enable-shared \
--enable-sdl2 \
--enable-ffplay \
--enable-ffprobe \
--enable-ffmpeg \
--disable-vulkan \
--disable-doc  \
--disable-htmlpages  \
--disable-manpages  \
--disable-podpages  \
--disable-txtpages \
--extra-cflags=-l${basepath}/x264-install/include \
--extra-ldflags=-L${basepath}/x264-install/lib
 
 
#开始8线程编译
make -j8
#将编译后的文件拷贝到--prefix参数配置目录
make install

在MSYS2 MINGW64中执行如下命令,等待编译完成

./build_ffmpeg.sh
  • 如果出现如下错误:
    在这里插入图片描述
    解决方案:
    修改FFmpeg-n5.1.2\libavcodec\x86\mathops.h文件的三个函数,修改对应的函数的内容如下:
#define MULL MULL
static av_always_inline av_const int MULL(int a, int b, unsigned shift)
{
    int rt, dummy;
    if (__builtin_constant_p(shift))
    __asm__ (
        "imull %3               \n\t"
        "shrdl %4, %%edx, %%eax \n\t"
        :"=a"(rt), "=d"(dummy)
        :"a"(a), "rm"(b), "i"(shift & 0x1F)
    );
    else
        __asm__ (
            "imull %3               \n\t"
            "shrdl %4, %%edx, %%eax \n\t"
            :"=a"(rt), "=d"(dummy)
            :"a"(a), "rm"(b), "c"((uint8_t)shift)
        );
    return rt;
}

#define NEG_SSR32 NEG_SSR32
static inline  int32_t NEG_SSR32( int32_t a, int8_t s){
    if (__builtin_constant_p(s))
    __asm__ ("sarl %1, %0\n\t"
         : "+r" (a)
         : "i" (-s & 0x1F)
    );
    else
        __asm__ ("sarl %1, %0\n\t"
               : "+r" (a)
               : "c" ((uint8_t)(-s))
        );
    return a;
}

#define NEG_USR32 NEG_USR32
static inline uint32_t NEG_USR32(uint32_t a, int8_t s){
    if (__builtin_constant_p(s))
    __asm__ ("shrl %1, %0\n\t"
         : "+r" (a)
         : "i" (-s & 0x1F)
    );
    else
        __asm__ ("shrl %1, %0\n\t"
               : "+r" (a)
               : "c" ((uint8_t)(-s))
        );
    return a;
}

然后重新编译
编译完成后的结果如下:
在这里插入图片描述

6、复制一份x264-install\bin下面的libx264-164.dll到FFmpeg-n5.1.2-install\bin下面,否则打开的时候会报找不到

四、ffmpeg的Hello World程序

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

其中的 avio_reading.c 相当于 ffmpeg 的 Hello World,它会读取一个媒体文件的元数据信息并打印显示。
另外建一个文件夹test_hello_world,将avio_reading.c复制过去,然后用在 MYSY2 中打开这个目录,使用 gcc 命令编译。
命令如下:

cd /d/worksoft/audioAndVideo/FFmpeg-n5.1.2-install/share/ffmpeg/examples
mkdir test_hello_world
cp avio_reading.c test_hello_world/

cd test_hello_world
gcc avio_reading.c -o test \
-I"D:/worksoft/audioAndVideo/FFmpeg-n5.1.2-install/include/" \
-L"D:/worksoft/audioAndVideo/FFmpeg-n5.1.2-install/bin/" \
-lavcodec -lavformat -lavutil

在这里插入图片描述

编译完毕后,将在当前文件夹下生成可执行文件test.exe。
在这里插入图片描述

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

export PATH=$PATH:/d/worksoft/audioAndVideo/x264_install/bin:/d/worksoft/audioAndVideo/FFmpeg-n5.1.2-install/bin

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

找一个视频文件,运行测试效果如下:
在这里插入图片描述

五、踩过的坑

1、安装MSYS2的时候,如果执行了sed -i “s#mirror.msys2.org/#mirrors.ustc.edu.cn/msys2/#g” /etc/pacman.d/mirrorlist*,在执行pacman -Sy时会报错,还了各个ffmpeg版本无法解决

2、从ffmpeg官网下载的文件源码内容和github上的不一样

3、在编译ffmpeg的时候,如果不加

–disable-doc
–disable-htmlpages
–disable-manpages
–disable-podpages
–disable-txtpages
这几个,会在make install的时候报错,导致无法安装完成

后记
  个人总结,欢迎转载、评论、批评指正


参考资料:
Windows下FFmpeg库编译安装指南
ffmpeg库编译安装及入门指南(Windows篇)- 2022年底钜献

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

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

相关文章

「Dr. Bomkus 的试炼」——最详尽的通关资讯!

&#x1f9ea; Dr. Bomkus 的试炼&#xff1a;新的冒险来临 天才科学家Dr. Bomkus一直在不知疲倦地打造他的最新作品。但是遇到了一些问题&#xff01;现在&#xff0c;他需要你的帮助。 为了找到真正的有价值之人&#xff0c;Dr. Bomkus准备了六场试炼。这一系列令人激动的挑战…

VR全景餐厅,为餐饮老板开启了新纪元

在近两年的“元宇宙”概念的催生下&#xff0c;VR全景技术逐渐渗透到我们生活的方方面面&#xff0c;从舌尖到指尖、从田间到车间、从衣食住行到娱乐消费等&#xff0c;越来越多的行业、领域开始引入VR全景了&#xff0c;并在各自的垂直领域开拓了VR全景新时代。 而一直以来&am…

VBA技术资料MF73:将Logo添加到页眉侧

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

SENet 学习

ILSVRC 是一个比赛&#xff0c;全称是ImageNet Large-Scale Visual Recognition Challenge&#xff0c;平常说的ImageNet比赛指的是这个比赛。 使用的数据集是ImageNet数据集的一个子集&#xff0c;一般说的ImageNet&#xff08;数据集&#xff09;实际上指的是ImageNet的这个子…

解决javascript报错:SyntaxError: Invalid Unicode escape sequence

在处理cookie时报这个错&#xff1a; 网上搜了一圈都说是反斜杠问题&#xff0c;要把\替换成/ 但是试了网上的replace替换&#xff1a; replace(/\\/g, /) 结果没有用&#xff01;&#xff01;&#xff01; 然后我干脆直接做了一个最简单字符串赋值&#xff0c;再打印出来。…

GZ035 5G组网与运维赛题第2套

2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项(高职组) 赛题第2套 一、竞赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通(35分) 子任务1:5G公共网络部署与调试(15分) 子任务2:5G室内与室外站点建设(20分) 竞赛模块2--5G公共网络运维与优化(…

ROS学习笔记——配置环境变量

重点解决&#xff1a;避免每次都source ros2环境&#xff0c;每次都要设置ros_domain_id等等设置 Background ROS 2 relies on the notion of combining workspaces using the shell environment. ros2 依赖于“组合工作区”这个改变&#xff0c;使用shell 环境来实现 …

中央设备状态监控系统CMS如何帮助半导体晶圆厂提高产品良率

中央设备状态监控系统&#xff08;CMS&#xff09;在半导体晶圆厂中扮演着关键角色&#xff0c;帮助企业提高产品的良率。本文将介绍CMS是什么、当前半导体晶圆厂产品良率面临的挑战&#xff0c;并重点探讨CMS如何通过实时数据监控、故障预测和预警、以及统计分析和过程改进等方…

Linux之VM、WindowsServer安装及开发环境配置

目录 前言 一、操作系统简介 1. 基本概述 1.2 常见的操作系统 1.3 个人版本与服务器版本的区别 1.4 Linux的各个版本 Debian Ubuntu Redhat Fedora centos 二、安装并配置VMWare虚拟机 1. 安装 2. 激活VM虚拟机软件 3. 使用注意事项 3.1 注意点一&#xff1a;配置…

设计大师都在用!电商设计素材网站大公开

双十一即将到来&#xff0c;想必各电商平台的设计师早已开启电商设计项目。找到合适的电商设计模板是电商设计成功的关键因素。高质量的电商设计模板素材不仅能够提升网站的吸引力&#xff0c;还能提升用户体验&#xff0c;从而增加商品的交易率。 Pixso资源社区 在寻找电商设计…

【LeetCode】102. 二叉树的层序遍历

题目链接 文章目录 Python3方法一&#xff1a; 广度优先搜索 (BFS) ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯方法二&#xff1a; 深度优先搜索 (DFS) ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯ C方法一&#xff1a; 广度优先搜索 (BFS) ⟮ O ( n ) ⟯ \lgroup O(n…

arch linux 安装 vsftpd 配置虚拟用户

后面操作会直接基于 yay 操作 自行查找如何安装 yay 公司经常会用到 ftp 服务 不想用 apache 的 ftp server 所以自己在小机器上撞了 arch linux 用来安装软件 跑程序等。 1. 安装 vsftpd yay vsftpd --noconfirm选择 1 安装 输入密码 2. 安装 pam_pwdfile 安装 pam_pwdf…

走近Nexstar Digital,看美国百家电视台内容管理的齿轮如何运转?

美国五大电视网之一的CW电视台&#xff0c;是《邪恶力量》《吸血鬼日记》等热播剧的产地&#xff0c;最终在2022年被Nexstar收入囊中。 Nexstar Media Group是全球领先的多元化媒体公司之一&#xff0c;也是美国最大的地方广播电视集团之一&#xff0c;活跃于美国116个市场&am…

HCIA数据通信——交换机(Vlan间的通信与安全)

前言 之前的提到了交换机的概念和实验。不过交换机的一些功能还没有说完&#xff0c;我们的实验也仅仅是阻止相同地址段的IP地址互通&#xff0c;也没有用到子接口和路由器。显然&#xff0c;那样的配置过于简单。 端口安全 Port Security&#xff08;端口安全&#xff09;的功…

DeepSpeed: 大模型训练框架 | 京东云技术团队

背景&#xff1a; 目前&#xff0c;大模型的发展已经非常火热&#xff0c;关于大模型的训练、微调也是各个公司重点关注方向。但是大模型训练的痛点是模型参数过大&#xff0c;动辄上百亿&#xff0c;如果单靠单个GPU来完成训练基本不可能。所以需要多卡或者分布式训练来完成这…

使用性能监控软件的主要措施

性能监控软件是管理和维护计算机系统的不可或缺的工具。它们提供了实时性能数据&#xff0c;帮助用户优化资源利用、提高系统稳定性和提供更好的用户体验。选择合适的性能监控软件并正确使用它们可以帮助你在竞争激烈的数字时代脱颖而出&#xff0c;确保你的系统始终在最佳状态…

腾讯云国际-如何使用对象存储COS在 CKafka 控制台创建数据异步拉取任务?腾讯云代充

操作场景 Datahub 支持接入各种数据源产生的不同类型的数据&#xff0c;统一管理&#xff0c;再分发给下游的离线/在线处理平台&#xff0c;构建清晰的数据通道。 本文以 COS 数据为例介绍如何在 CKafka 控制台创建数据异步拉取任务&#xff0c;并对任务进行修改配置&#xf…

【国科方案】设置引脚复用、方向和输入输出

【国科方案】设置引脚复用、方向和输入输出 文章目录 【国科方案】设置引脚复用、方向和输入输出前言一、复用、方向和数据二、总结 前言 记录在工作中调试国科方案芯片引脚复用等功能。不同的方案厂家引脚的处理是不一样的&#xff0c;下面就详细介绍一下国科方案引脚的使用。…

【无标题】简析天津某产业园能耗监测系统设计与应用

叶根胜 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;对天津市某产业园2016年度的能耗进行了审计&#xff0c;分析了该产业园的年度能耗总量、能源结构、能耗费用构成、单位建筑面积和单位人员能耗指标&#xff0c;并对能源利用过程中存在的问题进行分析&#xf…

postgresql14管理(五)-tablespace

基本概念 表空间tablespace在postgresql中&#xff0c;表示数据库对象&#xff08;比如表或索引&#xff09;的存放目录。当表被访问时&#xff0c;系统通过表空间定位到对应数据文件所在的位置。 优势&#xff1a; 1、如果数据库集群所在的初始磁盘分区或磁盘卷的空间不足&a…