编译好的ffmpeg可以直接用,但是不能调试,不能看到函数内部是如何实现的,遇到问题一头雾水,不知道哪里出错了。这时候需要自己编译ffmpeg。
看了很多博客,只有一篇能用,主要借鉴这篇博客。特此记录,以备使用。
不要出现中文路径
1.准备MINGW,yasm
MinGW下载地址,目录随意,我选择安装在F:\mingw
,不要有中文目录
yasm下载,我选择的是64位的,下载完成后,改名为yasm.exe
,并复制到F:\mingw\bin
目录下。
打开MinGW Installation Manager,下载几个Package。
点击Apply Changes
2.下载VS,这里不说明了
3.配置运行环境的脚本
/zdhsoft/article/details/86776283
复制F:\mingw\msys\1.0\msys.bat
为F:/mingw/msys/1.0/msys_vs.bat
编辑msys_vs.bat,并在第一行的@echo off的后面,增加下面一条语句(注意:这里的vs是默认目录),根据自己真实目录添加
完成后如下:
@echo offcall "C:/Program Files (x86)/Microsoft Visual Studio//Community/VC/Auxiliary/Build/vcvars32.bat"rem Copyright (C): 2001, 2002, , , Earnie Boydrem mailto:earnie@rem This file is part of Minimal SYStemrem /msys.shtmlremrem File: msys.batrem Revision: 2.4rem Revision Date: December 8th, ... ... 余下未修改的,略去
4.准备ffmpeg源码
ffmpeg源码下载
下载解压后放在F:\ffmpeg\ffmpeg
4.编译ffmpeg
双击运行msys_vs.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/VS_build --toolchain=msvc --arch=x86 --extra-cflags="-MDd" --extra-ldflags="/NODEFAULTLIB:libcmt" --enable-debug3.make -j4 4.make install
1是进入configure 的目录
2是进行configure 设置,其中--prefix=F:/ffmpeg/VS_build
指定生成路径。这个命令要执行一会,耐心等待
3make
4安装
等待过后,编译好的ffmpeg如下
这个编译好的ffmpeg没有ffplay.exe,暂时不需要,以后再说。
编译过程发现有下边的问题,不知道怎么解决。忽视这个问题也能正常编译运行。
5.验证调试ffmepg
vs创建简单的工程
附加依赖项是:
Bcrypt.libWs2_32.libSecur32.liblibavcodec.alibavdevice.alibavfilter.alibavformat.alibavresample.alibavutil.alibswresample.alibswscale.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;}
到此,大功告成。