Windows下搭建FFmpeg开发调试环境
背景
如果你是一个FFmpeg的使用者,那么绝大部分情况下只需要在你的程序中引用FFmpeg的libav*
相关的头文件,然后在编译阶段链接相关的库即可。
但是如果你想调试FFmpeg内部相关的逻辑,或者分析FFmpeg源码,那么有一个可供单步调试FFmpeg的环境往往能使你事半功倍!
要说Windows下做C/C++开发用哪个IDE最强大,我想我的答案是Visual Studio。
要说Windows下怎么快速构建FFmpeg的VS项目,我首推ShiftMediaProject(下面都简称 SMP)开源项目:SMP GitHub
关于ShiftMediaProject 的更多相关信息,大家可以直接访问其官网。
步骤
接下来我将以VS2017为例
一步步介绍怎么搭建一个可供单步调试的FFmpeg项目
※ 注:在此之前请确保你电脑的网络环境能正常访问GitHub.
一、安装VS 2017
先安装VS 2017,安装步骤非本文重点,此处不做赘述
但是有一点需要注意的是:安装时需勾选C++环境和Windows SDK 8.1
二、安装 YASM 与 NASM
由于FFmpeg的源码有部分需要汇编支持,所以需要先安装好YASM/NASM的VS版本,这一点SMP官方团队也很贴心地帮我们做好:
先直接下载对应如下两个链接的VSYASM.zip
和VSNASM.zip
:
- https://github.com/ShiftMediaProject/VSNASM/releases
- https://github.com/ShiftMediaProject/VSYASM/releases
下载完成后:
解压VSYASM.zip
,右键install_script.bat
选择以管理员身份运行,等待安装完成:
解压VSNASM.zip
,右键install_script.bat
选择以管理员身份运行,等待安装完成:
TL;DR
接下来的步骤会比较烦琐,经过多次实践我已经写好了一键部署脚本,可供大家快速部署能直接编译成功的项目。
如果不想理这些烦琐的细节,想直接使用一键部署脚本的读者
⏭️ 可直接跳到文章最后面的 一键部署脚本 章节
三、创建正确的目录层次
我刚开始用SMP项目的时候总是对它的目录层级结构感到困惑,编译之后都找不着输出目录。
经过多次踩坑实践,再结合官方README的说明,实践出比较好的目录层次应该是如下:
- ffmpeg_smp_vs // 假设你的项目文件夹叫 ffmpeg_smp_vs
- source // 创建source子文件夹,用于放SMP相关源码
- msvc // 自动生成,存放SMP编译生成的目标文件等
Q: 为什么要建立两层目录结构?
A: 因为SMP项目为了不让生成的文件落在源码目录下造成“污染”,把输出目录定在源码目录同层级的msvc
目录下。
如果你直接把源码下载到ffmpeg_smp_vs
目录下,会导致最后生成的msvc
目录跑到了ffmpeg_smp_vs
目录外面去,不是很美观。
因此,把源码目录和生成目录都放在统一的ffmpeg_smp_vs
目录下是比较好的实践。
四、下载源码和相关依赖
假设你已经按步骤三创建好了相应的文件夹
就可以开始下载SMP源码及其相关依赖了
注:以下操作均在Windows CMD命令行工具中执行
※ 下载SMP源码:
cd ffmpeg_smp_vs\source
git clone https://github.com/ShiftMediaProject/FFmpeg.git
※ 运行脚本下载相关依赖库:
cd ffmpeg_smp_vs\source\FFmpeg\SMP
project_get_dependencies.bat /Y
下载的依赖库比较多,请耐心等待。若中途有出现错误或者中断,请再次执行上面最后一句脚本直到所有依赖库都顺利下载完成。
※ 下载第三方库的头文件:
AMF 头文件
先获得AMF仓库代码
https://github.com/GPUOpen-LibrariesAndSDKs/AMF.git
再把 AMF\amf\public\include\
下的所有子文件夹复制到 ffmpeg_smp_vs\msvc\include\AMF
下(目录不存在的话请自行创建)
ffnvcodec 头文件
先获得ffnvcodec仓库代码
git clone https://github.com/FFmpeg/nv-codec-headers.git
再把 nv-codec-headers\include\ffnvcodec\
下的所有头文件复制到 ffmpeg_smp_vs\msvc\include\ffnvcodec
下(目录不存在的话请自行创建)
OpenGL 头文件
下载如下2个头文件放置到ffmpeg_smp_vs\msvc\include\gl
下(目录不存在的话请自行创建)
https://www.khronos.org/registry/OpenGL/api/GL/glext.h
https://www.khronos.org/registry/OpenGL/api/GL/wglext.h
EGL 头文件
下载下面这个头文件放置到ffmpeg_smp_vs\msvc\include\KHR
下(目录不存在的话请自行创建)
https://www.khronos.org/registry/EGL/api/KHR/khrplatform.h
五、编译与调试
※ 编译
进入文件夹:ffmpeg_smp_vs\source\FFmpeg\SMP
双击打开ffmpeg_deps.sln
右键整个解决方案 -> 点击生成解决方案
编译较耗时,请耐心地等待编译完成 ..
若编译失败,请仔细检查前面的步骤,或者给我留言
※ 调试
由于SMP默认调试目标路径设置有误(至少截止我写这篇文章的时候是这样 | 2021/12/09),所以我们需要修改一下三个可执行文件ffmpeg
/ffprobe
/ffplay
的调试路径,以ffmpeg
为例(另外2个都是这么改):
右键Programs
目录下的ffmpeg
-> 选属性
将配置属性->调试->命令 一行的$(TargetPath)
修改为:$(OutDir)\bin\x64\$(TargetName)$(TargetExt)
以调试ffmpeg
为例,将ffmpeg
设置为启动项目
在ffmpeg.c
的main()
函数入口处打好断点,按F5开启愉快的调试学习之旅~
关于Visual Studio的调试技巧非本文重点,请自行搜索
⏭️ 一键部署脚本
为方便大家快速部署一个可成功编译的FFmpeg VS 2017项目,避免在各种配置上踩坑浪费时间,我写了个一键部署的脚本供大家使用,前提是你要完成上述的步骤一和步骤二再进行这一步。
先下载下面仓库:
git clone https://github.com/Suiyek/OneKeySetupSMP.git
创建你的工程目录,如D:\Code\ffmpeg_smp_vs
把init_smp_proj.bat
复制到你的工程目录下
双击运行脚本,等待运行完成
好了,接下来只需要参考步骤五即可
_ 欢迎关注我的公众号音视频开发札记
Windows下搭建FFmpeg开发调试环境的更多相关文章
- Linux下搭建FFmpeg开发调试环境
背景 如果你是一个FFmpeg的使用者,那么绝大部分情况下只需要在你的程序中引用FFmpeg的libav*相关的头文件,然后在编译阶段链接相关的库即可.但是如果你想调试FFmpeg内部相关的逻辑,或者 ...
- golang在Windows下Sublime Text开发调试环境的配置
一.前言 近期本人有工作调动,进入了一个全新的领域[golang]服务端开发.在此写下本文,希望给那些没接触过golang开发调试环境及还在犹豫选择那家golang IDE而纠结的朋友们一点点帮助,如 ...
- Windows下搭建Git开发环境
Windows下搭建Git开发环境主要有以下三种方法: 1,VS,vs2013和vs2015中已经集成了git插件了 2,msysGit+TortoiseGit 3,msysGit+SourceTre ...
- [转载]在Windows下搭建Android开发环境
http://jingyan.baidu.com/article/bea41d437a41b6b4c51be6c1.html 在Windows下搭建Android开发环境 | 浏览:30780 | 更 ...
- 【原创】windows下搭建vue开发环境+IIS部署
[原创]win10下搭建vue开发环境 如果要转发,请注明原作者和原产地,谢谢! 特别说明:下面任何命令都是在windows的命令行工具下进行输入,打开命令行工具的快捷方式如下图: 详细的安 ...
- windows下搭建vue开发环境+IIS部署
原创]win10下搭建vue开发环境 https://www.cnblogs.com/ixxonline/p/6007885.html 特别说明:下面任何命令都是在windows的命令行工具下进行输 ...
- kubernetes实战之consul篇及consul在windows下搭建consul简单测试环境
consul是一款服务发现中间件,1.12版本后增加servicemesh功能.consul是分布式的,可扩展的,高可用的根据官方文档介绍,目前已知最大的consul集群有5000个节点,consul ...
- windows环境下搭建ffmpeg开发环境
ffmpeg是一个开源.跨平台的程序库,能够使用在windows.linux等平台下,本文将简单解说windows环境下ffmpeg开发环境搭建过程,本人使用的操作系统为windows ...
- Windows下搭建ffmpeg+VS2008开发环境详细教程【转】
本文转载自:http://www.voidcn.com/article/p-vxdntdgc-bkq.html 由于个人是从事音视频开发相关的工作,所以也把自己的一些过程写下来,方便大家以及自己查看, ...
随机推荐
- JS中innerHTML、outerHTML、innerText 、outerText、value的区别与联系?
1.innerHTML 属性 (参考自<JavaScript高级程序设计>294页) 在读模式下,innerHTML 属性返回与调用元素的所有子节点(包括元素.注释和文本节点)对应的 HT ...
- 用js实现web端录屏
用js实现web端录屏 原创2021-11-14 09:30·无意义的路过 随着互联网技术飞速发展,网页录屏技术已趋于成熟.例如可将录屏技术运用到在线考试中,实现远程监考.屏幕共享以及录屏等:而在我们 ...
- CODING 项目协同 2.0 —— 让协作有条不紊
本文为 CODING 高级产品经理王海明 在腾讯云 CIF 工程效能峰会上所做的分享.文末可前往峰会官网,观看回放并下载 PPT. 大家好,我是 CODING 高级产品经理王海明,今天与大家分享的是项 ...
- linux 同时执行多个命令及几个基础命令
先后不同的命令用分号:隔开即可 基础命令: 1.cd 进入目录 /代表根目录,.代表当前目录,..代表上一级目录 2.ls 显示当前目录下的所有文件和文件夹 -F区分目录和文件,文件后边是*代表可执行 ...
- CODE FESTIVAL 2017 qual C F - Three Gluttons(DP)
洛谷题面传送门 & Atcoder 题面传送门 DP 好题. 首先考虑如果我们知道 C 吃了哪些寿司,能够还原出多少种符合条件的序列.我们考虑倒着钦定,即,先钦定 A,B,C 三者最后吃的那三 ...
- C/C++ Qt StatusBar 底部状态栏应用
Qt窗体中默认会附加一个QstatusBar组件,状态栏组件位于主窗体的最下方,其作用是提供一个工具提示功能,当程序中有提示信息是可以动态的显示在这个区域内,状态栏组件内可以增加任何Qt中的通用组件, ...
- 超好玩:使用 Erda 构建部署应用是什么体验?
作者|郑成 来源|尔达 Erda 公众号 导读:最近在 Erda 上体验了一下构建并部署一个应用,深感其 DevOps 平台的强大与敏捷,不过为了大家能够快速上手,我尽量简化应用程序,用一个简单的返回 ...
- How To Call An Ambulance
How to Talk to the Emergency Dispatcher [minutesmatter.upmc稻糠亩] How To Call An Ambulance [askambulan ...
- Spark相关知识点(一)
spark工作机制,哪些角色,作用. spark yarn模式下的cluster模式和client模式有什么区别.
- 零基础学习java------25--------jdbc
jdbc开发步骤图 以下要用到的products表 一. JDBC简介 补充 JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口,各个数据库厂商趋势线这个接口,提 ...