编译好的ffmpeg可以直接用,但是不能调试,不能看到函数内部是如何实现的,遇到问题一头雾水,不知道哪里出错了。这时候需要自己编译ffmpeg。
看了很多博客,只有一篇能用,主要借鉴这篇博客。特此记录,以备使用。
不要出现中文路径
1.准备MINGW,yasm
MinGW下载地址,目录随意,我选择安装在F:\mingw
,不要有中文目录
yasm下载,我选择的是64位的,下载完成后,改名为yasm.exe
,并复制到F:\mingw\bin
目录下。
打开MinGW Installation Manager,下载几个Package。
点击Apply Changes
2.下载VS2017,这里不说明了
3.配置运行环境的脚本
https://blog.csdn.net/zdhsoft/article/details/86776283
- 复制
F:\mingw\msys\1.0\msys.bat
为F:/mingw/msys/1.0/msys_vs2017.bat
- 编辑msys_vs2017.bat,并在第一行的@echo off的后面,增加下面一条语句(注意:这里的vs2017是默认目录),根据自己真实目录添加
完成后如下:
@echo off
call "C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Auxiliary/Build/vcvars32.bat"
rem Copyright (C): 2001, 2002, 2003, 2004, 2005 Earnie Boyd
rem mailto:earnie@users.sf.net
rem This file is part of Minimal SYStem
rem http://www.mingw.org/msys.shtml
rem
rem File: msys.bat
rem Revision: 2.4
rem Revision Date: December 8th, 2005
... ... 余下未修改的,略去
4.准备ffmpeg源码
下载解压后放在F:\ffmpeg\ffmpeg
4.编译ffmpeg
双击运行msys_vs2017.bat
,出现
在上边这个对话框里边依次输入以下命令
1.cd /f/ffmpeg/ffmpeg/
2../configure --disable-asm --enable-avdevice --enable-doc --disable-programs --enable-avresample --disable-shared --enable-static --disable-bzlib --enable-gray --disable-libopenjpeg --disable-iconv --disable-zlib --prefix=F:/ffmpeg/VS2017_build --toolchain=msvc --arch=x86 --extra-cflags="-MDd" --extra-ldflags="/NODEFAULTLIB:libcmt" --enable-debug
3.make -j4
4.make install
1是进入configure 的目录
2是进行configure 设置,其中--prefix=F:/ffmpeg/VS2017_build
指定生成路径。这个命令要执行一会,耐心等待
3make
4安装
等待过后,编译好的ffmpeg如下
这个编译好的ffmpeg没有ffplay.exe,暂时不需要,以后再说。
编译过程发现有下边的问题,不知道怎么解决。忽视这个问题也能正常编译运行。
5.验证调试ffmepg
vs2017创建简单的工程
附加依赖项是:
Bcrypt.lib
Ws2_32.lib
Secur32.lib
libavcodec.a
libavdevice.a
libavfilter.a
libavformat.a
libavresample.a
libavutil.a
libswresample.a
libswscale.a
main函数如下:
一定要有下边这些
#pragma comment(lib,"Strmiids.lib")
#pragma comment(lib,"Mfuuid.lib")
#pragma comment(lib,"Mfplat.lib")
#pragma comment(lib,"Bcrypt.lib")
#pragma comment(lib,"Secur32.lib")
调试到断点处,按F11,发现可以进入函数avformat_network_init进行调试。
#include <stdio.h>
#pragma comment(lib,"Strmiids.lib")
#pragma comment(lib,"Mfuuid.lib")
#pragma comment(lib,"Mfplat.lib")
#pragma comment(lib,"Bcrypt.lib")
#pragma comment(lib,"Secur32.lib")
extern "C"
{
#include <libavformat/avformat.h>
#include <libavutil/dict.h>
}
int main(int argc, char * argv[]) {
avformat_network_init();
printf("hello ffmpeg!");
return 0;
}
到此,大功告成。