现在假设做了一个基于ffmpeg动态库的thumb.dll,那么加载的顺序很重要。
一、简略提提基于ffmpeg库开发的DLL
创建thumb.dll的过程就略过了,网上很多教程。说一下thumb(我的工程名字)的工程注意事项吧。
工程属性->VC++目录配置“包含目录”和“库目录”。
包含目录添加“include”,库目录添加“lib”
这样编译貌似还有问题,要将“清单工具”->“输入和输出”的“嵌入清单”改为“否”
然后下载的dev版本的ffmpeg中include和lib复制到工程目录thumb/thumb下面。
要加_mingw.h和inttypes.h。stdint.h看情况,我忘记这个文件是属于ffmpeg库还是pthread引用的。
将shared版本的ffmpeg中dll们复制到thumb/thumb下面
然后回到thumb工程,写了一下截图的代码,具体可以到网上搜索的,这里不提供了。
这里没有在工程里面配置链接器,所以在工程里面要使用#pragma comment(lib,"xx.lib")将相应的lib引用。
最后编译得到thumb.dll
二。写个调用thumb.dll的exe(run_thumb_dll)
添加->新增项目->run_thumb_dll
在_tmain函数下先按顺序加载相关的dll。
1.将libgcc_s_dw2-1.dll加载,因为在网站https://ffmpeg.zeranoe.com/builds/win32/ 下载的shared版本是用gcc编译的。
2.加载avutil-xx.dll->swresample-xx.dll->avcodec-xx.dll
3.加载avformat-xx.dll
4.加载postproc-xx.dll->swscale-xx.dll->avfilter-xx.dll
5.加载avdevice-xx.dll
6.加载个人的dll文件(thumb.dll)
说明一下:
第2步avcodec会用到avutil和swresample的一些接口,所以avutil和swresample要放前面加载。
第3步avformat在旧版ffmpeg是和avcodec有关联的,所以还是放在avcodec之后加载比较合适。
第4步avfilter会用到swscale的,所以swscale必须在它之前。postproc不一定有用到的,但是网站下载的版本是用到,所以用网站的avfilter开发必须加postproc。
第5步avdevice与avcodec、avfilter都有关系的,所以必须放在最后调用。
因此得到
LoadLibrary(L"xxx/libgcc_s_dw2-1.dll");
LoadLibrary(L"xxx/avutil-xx.dll");
LoadLibrary(L"xxx/swresample-xx.dll");
LoadLibrary(L"xxx/avcodec-xx.dll");
LoadLibrary(L"xxx/avformat-xx.dll");
LoadLibrary(L"xxx/postproc-xx.dll");
LoadLibrary(L"xxx/swscale-xx.dll");
LoadLibrary(L"xxx/avfilter-xx.dll");
LoadLibrary(L"xxx/avdevice-xx.dll");
LoadLibrary(L"xxx/thumb.dll");
{不会上传图片,凑合看