用 Visual Studio 2019 编译 FFmpeg 简单教程

2023-10-27

需要的东西:

● Visual Studio 2019

  这个自行解决吧,本人用的是社区版

● MSYS 环境,去 https://www.msys2.org/ 下载

  本人下载的是【msys2-x86_64-20210725.exe】

● yasm.exe,去 http://yasm.tortall.net/Download.html 下载

  本人下载的是【yasm-1.3.0-win64.exe】

● FFmpeg源码,去 Download FFmpeg 

  就选择 FFmpeg 4.4 "Rao" 吧

● 如果要编译 ffplay,去 Simple DirectMedia Layer - Homepage 

  本人下载使用的是【SDL2-devel-2.0.14-VC.zip】

 一、配置MSYS2 环境

● 双击下载下来的可执行程序【msys2-x86_64-20210725.exe】,使用默认,一直点击“下一步”直至安装完毕。默认安装目录是【C:\msys64】。

● 然后,把【yasm-1.3.0-win64.exe】复制到【C:\msys64\usr\bin】下,改名为【yasm.exe】。

● 把【C:\msys64\usr\bin\】下的link.exe 改为其他名,比如【link_old.exe】,虽然不耽误本教程所涉及的东西的结果,但改不改,随看官喜欢了。

● 修改文件【C:\msys64\msys2_shell.cmd】,改之前先备份一下该文件。

        把第17行前面的 rem 删掉,修改后如图:

        

        MSYS安装完后,开始菜单上应该会创建4个快捷方式:

        

这些快捷方式指向了同一个msys2_shell.cmd,不过参数不同。

        C:\msys64\msys2_shell.cmd -mingw32
        C:\msys64\msys2_shell.cmd -mingw64
        C:\msys64\msys2_shell.cmd -ucrt64
        C:\msys64\msys2_shell.cmd -msys 

2022年10月新版:msys2-x86_64-20221028.exe,安装向导生成的快捷方式指向的是独立的可执行文件,这样本文方法则无效了。经过测试,发现可以修改快捷方式(注意备份),按照上面的修改就可以了。不知道上述方式还能有效坚持到哪个版本……(lll¬ω¬)

所以用关键字【"MINGW32"】(有引号哦),从头搜索文件【C:\msys64\msys2_shell.cmd】的内容,在如下位置找到:

        

在 101 行下面插入下面内容:

 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat

这是32位编译环境,如果要想编译64位的话,在104行下面,插入下面内容:

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat

如图:

        

● 本人编译32位的,所以,通过快捷方式【MSYS2 MinGW 32-bit】启动 MSYS2 环境。
执行命令”cl” 就是 vc用的编译器 cl.exe。

 ● 但这个时候,没有包:gcc、pkg-config、diffutils、make,其实就是常见编译工具。通过执行命令安装:

pacman -S gcc pkg-config diffutils make

这个时候,本教程需要的编译环境,就配置好了,如有其他需求,再另行相应配置。

二、编译ffmpeg, ffprobe

编译环境配置好后,解压 ffmpeg 源码到任意目录,然后从 msys2 环境进入该目录,执行配置命令:

$ ./configure --enable-shared --toolchain=msvc --enable-gpl

因为本教程仅为一般目的而编译ffmpeg,所以,配置命令就是这么简单,各位按需修改,

--enable-shared     构建共享库

--toolchain=msvc   使用vc

显然,“使用vc”这个参数是必须的,不然一切可能就更简单了。上述命令执行后,正常情况是等一会,看你的机器快慢了,然后输出一堆简报式内容。

接着,命令:

make -j4

这就是 make 了,成功后,源码目录下会生成 ffmpeg.exe、ffprobe.exe可执行文件,而 libavcodec、libavdevice 等子目录下会生成 avdevice.lib、avdevice-58.dll,avcodec.lib、avcodec-58.dll 等 ffmpeg 共享库文件。

那 ffplay.exe 呢,其实刚编译成功后发现没有它,我也挺惊讶的,不过马上就释然了,你都没放置、指定SDL2库,它咋能编译出来啊?不过我没去研究如何在这里编译出来,因为我本来的目的是在Visual Studio 中F5 编译启动调试运行。本节内容至少要成功走过一遍,再继续后面的内容。

三、建立 Visual Studio 解决方案

利用向导,建立3个空的控制台工程。分别命名为ffmpeg, ffprobe, ffplay。

在任意目录下建立解决方案都行,不用复制移动文件,全是通过【右键工程项目结点】->【添加】->【现有项】这个过程把原有源码文件添加进新建的工程里,如图,红色圈内的目录是源码目录,选中的那个就是VS解决方案目录,其他的可以忽略,你可以参考这个:

 目前添加的源码文件,都在这个目录下,所以路径前缀就省了:

(略...)\ffmpeg-4.4\fftools\

● ffmpeg 需要文件:

cmdutils.h  cmdutils.c  ffmpeg.c  ffmpeg.h
ffmpeg_filter.c  ffmpeg_hw.c  ffmpeg_opt.c

● ffprobe 需要文件:

cmdutils.h  cmdutils.c  ffprobe.c

● ffplay 需要文件:

cmdutils.h  cmdutils.c  ffplay.c

设置好附加包含目录,附加库目录,附加依赖项,就可以编译了。

我下的版本,用 Visual Studio 2019 编译会出现若干编译错误:

● config.h(9,1): error C2001: 常量中有换行符

与文件保存编码有关,这个文件使用脚本生成的,其在VS中查看,编码是【Unicode (UTF-8 无签名) - 代码页 65001】,其实就是没有BOM,换成【Unicode (UTF-8 带签名) - 代码页 65001】即可。

ffmpeg_opt.c(448): error C4703: 使用了可能未初始化的本地指针变量“allow_unused”

这个顾名思义,F12定位到声名之处,改为【char *allow_unused = NULL;】即可。还有几处都是未初始化, 初始化为NULL即可。

cmdutils.obj : error LNK2019: 无法解析的外部符号 _avresample_version,函数 _print_all_libs_info 中引用了该符号

这个其实挺奇妙的,不知道为啥,不过这两函数真没啥用,在 cmdutils.c 文件的 print_all_libs_info 函数内,注释掉第 1137 行:

//PRINT_LIB_INFO(avresample, AVRESAMPLE, flags, level);

四、完

源码工程可以参考 《用VisualStudio2019编译FFmpeg简单教程》一文的配套工程-编解码文档类资源-CSDN下载

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用 Visual Studio 2019 编译 FFmpeg 简单教程 的相关文章

  • 如何在 laravel 4 中使用 php-FFMpeg?

    我是 Laravel 4 的新手 我已经安装了php ffmpeg在我本地的 Laravel 设置中 但我需要有关如何在 Laravel 4 中使用此 ffmpeg 的帮助 假设你已经拥有ffmpeg安装在本地主机服务器上 然后在 Lara
  • 有没有办法在转码之前使用 ffmpeg 确定文件的编码?

    我计划使用 ffmpeg 确保上传到我网站的所有视频文件都编码为 mp4 h264 我不想自动处理每个文件 而是希望通过仅处理那些还不是 mp4 h264 的文件来最小化处理开销 有没有一种简单的方法可以使用 ffmpeg 或其他命令行实用
  • Android 上的 FFmpeg

    我已经在 Android 上编译了 FFmpeg libffmpeg so 现在我必须构建一个像 RockPlayer 这样的应用程序 或者使用现有的 Android 多媒体框架来调用 FFmpeg 您有在 Android StageFri
  • 来自 http 直播 m3u8 文件的 FFMPEG mp4? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何从 http 直播 m3u8 文件中提取 mp4 我尝试了下面这个命令 ffmpeg i input file f rawvideo
  • JavaScript 中的 FFMPEG 命令

    是否可以使用如下命令 ffmpeg i video 1920 mp4 vf 比例 640 360 video 640 mp4 hide banner在纯 JavaScript 中降低视频的分辨率 例如 我有一个下拉菜单 其中有标签 所以我想
  • 将ffmpeg安装到虚拟环境中

    我正在尝试安装ffmpeg以便在 OpenAI 上使用它来录制视频 我已经使用它安装了brew install ffmpeg但不知怎的 当我编译我的代码时 我得到了同样的错误 就像我的包无法识别一样virtualenv我工作的地方 Pyth
  • OpenCV 3.0.0 使用 FFMPEG 时出错

    我使用 OpenCV 一段时间了 但是 我最近将系统更改为没有任何管理员权限的集群 问题是这样的 在我的主文件夹中 我安装了 FFMPEG ffmpeg 网站上提供的最新稳定版本 我将它安装在 HOME 中 因此在 HOME lib 中安装
  • ffprobe/ffmpg 静音检测命令

    我正在研究流静音检测 它正在 ffmpeg 中执行以下命令 ffmpeg i http mystream com stream af silencedetect n 50dB d 0 5 f null 2 gt log txt 我想获得日志
  • 为 iOS6.0 ARMv7 处理器构建 FFMPEG 库

    WARNING 我刚刚被另一位用户告知 在 iOS 上使用 FFMPEG 存在一些法律问题 请在此处留下链接http multinc com 2009 08 24 compatibility Between the iphone app s
  • 使用 ffmpeg 转换真实媒体

    我有许多旧的硬壳真实媒体文件需要转换 并希望编写一个脚本来批量处理它们 我可以使用 FFMpegX 进行 Real Media gt AVI 转换 但是当我尝试使用 ffmpeg 复制转换时 它总是会出现如下错误 avi 0x10084fa
  • 从 Perl 守护程序运行时,为什么 FFMpeg 在五秒后停止?

    我用 Perl 编写了一个小守护程序 它调用 FFMpeg 对视频进行编码 但编码在 5 秒左右后停止 我用这段代码来启动它 my t echo ffmpeg command gt gt self gt FFMPEG OUTPUT my l
  • 为视频添加水印的命令

    我尝试在一个视频上添加水印 但 FFmpeg 命令不会执行 错误代码为 3037 我运行相同的代码来修剪视频 视频已成功修剪 因此没有问题inputpath or outputpath我也有ic watermark png在资产文件夹中 我
  • 在 R 中导入 png 文件并转换为动画(.mp4)

    我正在尝试用 R 中的几个 png 文件创建一个简短的动画 我尝试了 packagemagick但只有当我将它们保存为 gif 时它才有效 当我尝试另存为 mp4 时 它将生成一个 mp4 文件 但一旦打开它 只会显示第一张图像 我的代码是
  • 将 H264 视频转换为原始 YUV 格式

    是否可以使用 ffmpeg 从 H264 编码视频创建原始 YUV 视频 我想用 matlab 打开视频并逐帧访问 Luma Cb 和 Cr 分量 是的 您可以 您只需指定像素格式即可 要获取格式的完整列表 ffmpeg pix fmts
  • C# - 捕获 RTP 流并发送到语音识别

    我正在努力实现的目标 在 C 中捕获 RTP 流 将该流转发到 System Speech SpeechRecognitionEngine 我正在创建一个基于 Linux 的机器人 它将接受麦克风输入 将其发送给 Windows 机器 Wi
  • 访问 AVFrame 的每个像素

    我需要访问 FFMPEG 的 AVFrame 对象的每个像素信息 如果是 RGB 则每个像素的每种颜色 R G 和 B 我怎样才能做到这一点 如果您已经前进到正确的框架 类似于 img convert ctx ffmpeg sws getC
  • MP4 到 DASH(bash 脚本)

    我有一个网站 用户可以在其中上传视频文件 我想使用 DASH 流式传输所有内容以获得自适应比特率流式传输 因此 我编写了一个 bash 脚本 由 cron 运行 将所有 mp4 文件转换为 DASH 但它无法正常工作 出了什么问题 例如 使
  • 使用 mkfifo 和传输流,这可能吗?

    我想执行一个 bash 脚本来执行以下操作 应用程序 ffmpeg 生成实时传输流 ts 文件 我需要处理这个实时流 执行解复用等 现在我知道这必须通过 FIFO 来完成 但这是我的任务 我需要重定向 ffmpeg 的输出以写入 fifo
  • ffmpeg AVFrame 到 opencv Mat 转换

    我目前正在开发一个使用 ffmpeg 解码接收到的帧的项目 解码后 我想将 AVFrame 转换为 opencv Mat 帧 以便我可以在 imShow 函数上播放它 我拥有的是字节流 我将其读入缓冲区 解码为 AVFrame f fope
  • OpenCV IP 相机应用程序崩溃 [h264 @ 0xxxxx] 访问单元中缺少图片

    我在 cpp 中有一个 opencv 应用程序 它使用 opencv 的简单结构捕获视频流并将其保存到视频文件中 它与我的网络摄像头完美配合 但是 当我运行它从 IP 摄像机捕获流时 它可能会在大约十秒后崩溃 我的编译命令是 g O3 IP

随机推荐

  • Zookeeper集群启、停、状态查看脚本

    zk sh bin bash if lt 1 then echo Please type parameter like
  • 工业物联网与其他物联网应用有哪些不同?

    物联网在众多的细分领域里早已让相关的企业实现了颠覆性的转型 这些领域涵盖了消费物联网 智慧农业领域 医疗保健 制造业领域和公用事业领域等等 工业物联网作为物联网一个不容忽视的子集 它专注于解决工业应用中的特殊要求 如制造业 石油和天然气及公
  • [MySql]基本知识及表的创建

    目录 1 数据库的操作 2 常用的数据类型 2 1数值类型 2 2字符串类型 2 3日期类型 3 表的操作 4 使用示例 1 数据库的操作 show databases 显示当前数据库 create database database na
  • linux服务器安装mysql步骤详解

    还是按照菜鸟教程上的顺序进行安装 踩的坑还是比较少的 MySQL 安装 菜鸟教程 1 安装前 我们可以检测系统是否自带安装 MySQL rpm qa grep mysql 2 如果你系统有安装 那可以选择进行卸载 rpm e mysql 普
  • ModBus协议部分功能码设计与实现方法(QT环境)

    写在前面 资源 QT环境下实现资源 1 调研 1 1 什么是Modbus Modbus由MODICON公司于1979年开发 是一种工业现场总线协议标准 1996年施耐德公司推出基于以太网TCP IP的Modbus协议 ModbusTCP M
  • (9)目标检测_SSD的原理

    0主要参考原理来源 1 SSD 论文 代码 pytorch zonechen 博客园 2 python ssd目标检测 目标检测之SSD算法实现 Pytorch weixin 39805734的博客 CSDN博客 3 2 1SSD算法理论
  • Python教程:Python3.8了解差不多了,Python3.9新特性了解一下

    本期Python教程将解释 Python 3 9 中的新特性 而不是 3 8 官网目前也只有 3 8 的下载包 3 9 需要自己编译 Cpython 语言上的变化 1 使用 Python 进行相对导包的时候 import 出现异常时类型由原
  • 启动失败 Failed to determine a suitable driver class 问题解决方案

    1 问题描述 启动报错 Description Failed to configure a DataSource url attribute is not specified and no embedded datasource could
  • GFS故障解决

    一 问题描述 之前 两台数据库服务器安装了两个实例 共享磁盘阵列 通过ASM管理 日志文件和控制文件等 通过GFS实现共享存储文件同步 系统工作正常 某天加入第三个节点时失败 集群正常使用就没再管它 某日 数据库异常 重启操作系统后 GFS
  • Spring Boot整合Mybatis-Plus快速入门(二)

    之前快速搭建项目中 创建的类名与表名以及属性名都是一致的 所以mybatis plus可以根据类名以及属性名进行对应的操作 那么如果表名与属性名中不一致或属性名与列名不一致时我们应该怎么处理呢 这里mybatis plus为我们提供了很多注
  • 解决VMware14打开虚拟机黑屏问题

    最近把VMware升级到14 0之后 运行虚拟机之后无法显示图像 屏幕一团黑 但点击显示缩略图的时候是可以看到系统已经启动并在正常运行的 可以通过以下方法解决 以管理员身份打开命令提示符 输入命令 netsh winsock reset 重
  • 知识图谱(七)——事件抽取

    文章目录 一 任务概述 1 事件的定义 2 事件抽取的定义 3 相关评测和语料资源 二 限定域事件抽取 1 基于模式匹配的事件抽取方法 1 有监督的事件模式匹配 2 弱监督的事件模式匹配 3 优缺点 2 基于机器学习的事件抽取方法 1 有监
  • arm-none-eabi-gcc编译、链接选项详解

    1 mthumb 和 mthumb interwork mthumb 的意义是 使用这个编译选项生成的目标文件是Thumb指令的 目前还没有发现GNU编译器中有哪一个选项可以指定生成的目标文件是thumb 2的 相对应的 marm 的意义是
  • 多态,虚函数,纯虚函数

    多态 借助虚函数 基类指针既可以使用基类 父类 的成员函数 也可以使用派生类 子类 的成员函数 它有多种形态 或多种表现方式 这就是多态 简单说就是同一条语句可以执行不同的操作 看起来有不同表现方式 这就是多态 构成多态的条件 多态存在的三
  • .net 平台下的数学库math.net(一)

    Math NET的目标是为提供一款自身包含清晰框架的符号运算和数学运算 科学运算 它是C 开发的开源类库 Math NET含了一个支持线性代数的解析器 分析复杂微分 解方程等等功能 这个项目大部分采用的是MIT X11开源软件协议 目前该组
  • ConstraintLayout实用特性

    转载自赵彦军的博客 前言 在2016年的Google I O大会上 Google 发布了Android Studio 2 2预览版 同时也发布了Android 新的布局方案 ConstraintLayout 但是最近的一年也没有大规模的使用
  • 【ABviewer从零开始教学查看器篇②】关于打开文件的快捷方式

    ABViewer是一款高质量 高效率 低成本的多功能设计及工程文档管理工具 能为您提供全面的专业的浏览及编辑功能 同时支持30多种光栅和矢量图形格式 在小编看来 ABViewer是一款非常简单且实用的CAD文档查看与编辑器 对于使用小白可能
  • 判断是否是数组

    整理了一些 留待自己复习用 1 instanceof var a name fangxiaoming age 19 var b 1 2 3 4 console log a instanceof Array false console log
  • 【翻译】我们建立了一个.NET操作员SDK(所以您不必这样做)。

    我们用C 语言构建了一个 NET操作者SDK 因此您可以用C 或任何 NET语言构建自己的Kubernetes操作者 当然也 有Go Operator SDK 还有我们的Java Operator SDK 那么为什么不为 NET社区提供一些
  • 用 Visual Studio 2019 编译 FFmpeg 简单教程

    需要的东西 Visual Studio 2019 这个自行解决吧 本人用的是社区版 MSYS 环境 去 https www msys2 org 下载 本人下载的是 msys2 x86 64 20210725 exe yasm exe 去 h