最近有时间在看FFmpeg+SDL视频编解码播放,也是从看雷神的视频开始,天妒英才,缅怀下。后续还要看下雷神剩下的blog,对于开源项目,首先要做到编译通过,这是最基本的一步,我也是这样来看FFmpeg+SDL。
FFmpeg那几个动态链接库avcodec,avdevice....先没有自己编译,通过引用来使用里面的函数,搭建环境:
1.基本的就是要拷贝头文件,导入库,dll,在项目里面配置头文件目录,导入库目录,增加附加依赖项,sdl还要导入sdlmain.lib静态库
注:头文件有几个mingw里面的,是先安装mingw,在从里面拷贝出来的_mingw.h,inttypes.h,msvcrtver.h,stdint.h,w32api.h
2.就是c项目,和cpp项目的区别,最好用.cpp文件,这样不用改很多东西,导入头文件加入
extern “C"{}
#define __STDC_CONSTANT_MACROS
遇到比较特殊的问题:
1.FFmpeg Debug版本编译运行都没问题,但是Release编译正常,运行崩溃
解决方法:在Release版本下面使用保留未引用数据/OPT:NOREF
项目属性---->连接器----->优化------>引用------>/OPT:NOREF
2.想把SDL做成静态库,但是编译的时候出现错误:模块计算机类型x64与目标计算机类型x86冲突
解决方法:配置属性----->库管理器----->命令行------->加入/MACHINE:x64
3.SDL静态库编译好了,ffmpeg导入编译的时候出现连接错误,就是sdl里面调用windows api函数的地方链接错误
解决方法:sdl项目导入了windows api的winmm.lib,imm32.lib,version.lib,当编译成静态库的后,在ffmpeg项目里面导入就没找到windows api函数,导入这三个导入库就OK了
注:sdl说明里讲是directx的API封装,当时就用vc自带的工具dumpbin -dependents 查看,也没看到directx的相关dll,ddraw.dll, d3dx.dll, opengl32.dll等依赖的动态链接库,就有点迷惑,看了一些sdl的代码后才晓得,sdl是采用动态加载dll的方式来加载相关dll及函数,directx及opengl的市场情况:
directx: directx在家用市场全面领先
opengl:但在专业高端绘图领域,opengl是不能被取代的主角