背景

如果你是一个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:

下载完成后:

解压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开发调试环境的更多相关文章

  1. Linux下搭建FFmpeg开发调试环境

    背景 如果你是一个FFmpeg的使用者,那么绝大部分情况下只需要在你的程序中引用FFmpeg的libav*相关的头文件,然后在编译阶段链接相关的库即可.但是如果你想调试FFmpeg内部相关的逻辑,或者 ...

  2. golang在Windows下Sublime Text开发调试环境的配置

    一.前言 近期本人有工作调动,进入了一个全新的领域[golang]服务端开发.在此写下本文,希望给那些没接触过golang开发调试环境及还在犹豫选择那家golang IDE而纠结的朋友们一点点帮助,如 ...

  3. Windows下搭建Git开发环境

    Windows下搭建Git开发环境主要有以下三种方法: 1,VS,vs2013和vs2015中已经集成了git插件了 2,msysGit+TortoiseGit 3,msysGit+SourceTre ...

  4. [转载]在Windows下搭建Android开发环境

    http://jingyan.baidu.com/article/bea41d437a41b6b4c51be6c1.html 在Windows下搭建Android开发环境 | 浏览:30780 | 更 ...

  5. 【原创】windows下搭建vue开发环境+IIS部署

    [原创]win10下搭建vue开发环境  如果要转发,请注明原作者和原产地,谢谢! 特别说明:下面任何命令都是在windows的命令行工具下进行输入,打开命令行工具的快捷方式如下图:     详细的安 ...

  6. windows下搭建vue开发环境+IIS部署

    原创]win10下搭建vue开发环境  https://www.cnblogs.com/ixxonline/p/6007885.html 特别说明:下面任何命令都是在windows的命令行工具下进行输 ...

  7. kubernetes实战之consul篇及consul在windows下搭建consul简单测试环境

    consul是一款服务发现中间件,1.12版本后增加servicemesh功能.consul是分布式的,可扩展的,高可用的根据官方文档介绍,目前已知最大的consul集群有5000个节点,consul ...

  8. windows环境下搭建ffmpeg开发环境

           ffmpeg是一个开源.跨平台的程序库,能够使用在windows.linux等平台下,本文将简单解说windows环境下ffmpeg开发环境搭建过程,本人使用的操作系统为windows ...

  9. Windows下搭建ffmpeg+VS2008开发环境详细教程【转】

    本文转载自:http://www.voidcn.com/article/p-vxdntdgc-bkq.html 由于个人是从事音视频开发相关的工作,所以也把自己的一些过程写下来,方便大家以及自己查看, ...

随机推荐

  1. 测试开发【提测平台】分享14-Vue图标Icon几种用法并利用其一优化菜单

    微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 回归主线更新,由于本次知识点只有一个,就不给思维导图了,在上系列测试平台开发实践中主要学习了页面直接的转跳方法和远程搜索的如何做,最终实现 ...

  2. [nowcoder5669E]Eliminate++

    枚举$a_{i}$并判断是否可行,有以下结论:若$a_{i}$可以留下来,一定存在一种合法方案使得$a_{i}$仅参与最后若干次合并,且第一次参与合并前左右都不超过2个数 证明:将大于$a_{i}$的 ...

  3. PHP绕过MD5比较的各种姿势

    1.用==进行弱类型比较时, 可以通过两个0e开头后面纯数字的md5绕过 php在进行弱类型比较时,如果为字符串为纯数字,包括浮点数.科学计数法.十六进制数等,都会转化为数字类型再进行比较,利用这点, ...

  4. 不用Spring Boot的痛苦是什么?用了Spring Boot以后的好处是什么?

    1.不用Spring Boot的痛苦是什么? (1)各种技术整合在一起,版本混乱,大量依赖自己去找,依赖冲突 (2)基于xml格式的配置文件,对各种技术框架进行大量的繁琐配置,mvc-servlet. ...

  5. Go语言核心36讲(Go语言实战与应用十五)--学习笔记

    37 | strings包与字符串操作 Go 语言不但拥有可以独立代表 Unicode 字符的类型rune,而且还有可以对字符串值进行 Unicode 字符拆分的for语句. 除此之外,标准库中的un ...

  6. 我在组内的Java问题排查分享

    前言 最近翻看以前写的 PPT, 发现了在2019年做的一次技术分享,关于 Java 问题排查,由于没什么公司机密可言,整理下分享给大家~ 线上问题处理流程 直接放PPT截图吧,现在看来依然不过时 问 ...

  7. [USACO07MAR]Face The Right Way G

    发现选定一个长度后,怎么翻转是固定的. 那我们直接选定一个长度去操作就行. 优化操作过程 类似于堆里打持久化标记一样的感觉. [USACO07MAR]Face The Right Way G // P ...

  8. base64和图片转换

    Base64是一种8Bit字节数据的编码方式. 在参数传输的过程中经常遇到的一种情况:使用全英文的没问题,但一旦涉及到中文就会出现乱码情况.与此类似,网络上传输的字符并不全是可打印的字符,比如二进制文 ...

  9. DirectX12 3D 游戏开发与实战第九章内容(下)

    仅供个人学习使用,请勿转载.谢谢! 9.纹理贴图 学习目标 学习如何将局部纹理映射到网格三角形中 探究如何创建和启用纹理 学会如何通过纹理过滤来创建更加平滑的图像 探索如何使用寻址模式来进行多次贴图 ...

  10. Parallel NetCDF 简介

    Parallel NetCDF API 所有C接口前加ncmpi前缀,Fortran接口前加nfmpi前缀 函数返回整数 NetCDF 状态变量 1. Variable and Parameter T ...