windows平台下FFMPEG的编译与使用
关于FFMPEG在windows下编译的文章有很多,我编译的时候用的是mingw+msys编译的。
如果感觉环境配置太复杂的话可以直接去下载一个mingw一键安装版的,我用的就是。
下载链接:
http://download.csdn.net/detail/cll131421/4436273
需要5分,大家都支持一下。呵呵。
这个是需要网络在线安装的,需要下载的安装包大概有100-150MB左右,安装好之后就可以直接用了,因为这个直接把mingw和msys都给你安装好了。
只需要修改一下msys.bat即可
使用记事本打开该文件,然后在其最开始处添加:
call "C:/Program Files/Microsoft Visual Studio 9.0/VC/bin/vcvars32.bat"
注意:这一行必需处在此文件的最开始处(我把它放到除去rem开头之外的最前面还是不能正常工作,不知道为啥),同时修改你的vc路径,我的是vs2008,所以是9.0,此修改指定vc的vcvars32.bat文件位置并找到它。
编译的具体过程就不一一细说,推荐一篇博客,大家可以参考这个来。
http://blog.csdn.net/jszj/article/details/4028716
相信编译对大家来说应该都没什么问题,推荐大家编译动态库,因为静态库我到现在也没找到可以直接使用的方法。
下面我给大家介绍一下动态库的使用方法,动态库是由lib和dll构成的。我们把lib放到当前项目的目录下,当然也可以另外放一个目录,通过指定库目录的方法来找到库。dll文件放到生成文件的目录下,因为可执行程序运行的时候需要用到。
关键来了,由于ffmpeg是C语言的库,所以如果在附加链接库那直接添加,你会很悲剧的发现,依然有很多无法识别的外部符号,就像没有加入库一样。
比如:
1>decoding_encoding.obj : error LNK2019: 无法解析的外部符号 _avcodec_register_all,该符号在函数 _main 中被引用
1>decoding_encoding.obj : error LNK2019: 无法解析的外部符号 _av_free,该符号在函数 "void __cdecl audio_encode_example(char const *)" (?audio_encode_example@@YAXPBD@Z) 中被引用
1>decoding_encoding.obj : error LNK2019: 无法解析的外部符号 _avcodec_close,该符号在函数 "void __cdecl audio_encode_example(char const *)" (?audio_encode_example@@YAXPBD@Z) 中被引用
1>decoding_encoding.obj : error LNK2019: 无法解析的外部符号 _avcodec_encode_audio,该符号在函数 "void __cdecl audio_encode_example(char const *)" (?audio_encode_example@@YAXPBD@Z) 中被引用
1>decoding_encoding.obj : error LNK2019: 无法解析的外部符号 _avcodec_open2,该符号在函数 "void __cdecl audio_encode_example(char const *)" (?audio_encode_example@@YAXPBD@Z) 中被引用
1>decoding_encoding.obj : error LNK2019: 无法解析的外部符号 _avcodec_alloc_context3,该符号在函数 "void __cdecl audio_encode_example(char const *)" (?audio_encode_example@@YAXPBD@Z) 中被引用
1>decoding_encoding.obj : error LNK2019: 无法解析的外部符号 _avcodec_find_encoder,该符号在函数 "void __cdecl audio_encode_example(char const *)" (?audio_encode_example@@YAXPBD@Z) 中被引用
1>decoding_encoding.obj : error LNK2019: 无法解析的外部符号 _av_samples_get_buffer_size,该符号在函数 "void __cdecl audio_decode_example(char const *,char const *)" (?audio_decode_example@@YAXPBD0@Z) 中被引用
1>decoding_encoding.obj : error LNK2019: 无法解析的外部符号 _avcodec_decode_audio4,该符号在函数 "void __cdecl audio_decode_example(char const *,char const *)" (?audio_decode_example@@YAXPBD0@Z) 中被引用
1>decoding_encoding.obj : error LNK2019: 无法解析的外部符号 _avcodec_get_frame_defaults,该符号在函数 "void __cdecl audio_decode_example(char const *,char const *)" (?audio_decode_example@@YAXPBD0@Z) 中被引用
1>decoding_encoding.obj : error LNK2019: 无法解析的外部符号 _avcodec_alloc_frame,该符号在函数 "void __cdecl audio_decode_example(char const *,char const *)" (?audio_decode_example@@YAXPBD0@Z) 中被引用
1>decoding_encoding.obj : error LNK2019: 无法解析的外部符号 _avcodec_find_decoder,该符号在函数 "void __cdecl audio_decode_example(char const *,char const *)" (?audio_decode_example@@YAXPBD0@Z) 中被引用
1>decoding_encoding.obj : error LNK2019: 无法解析的外部符号 _av_init_packet,该符号在函数 "void __cdecl audio_decode_example(char const *,char const *)" (?audio_decode_example@@YAXPBD0@Z) 中被引用
1>decoding_encoding.obj : error LNK2019: 无法解析的外部符号 _avcodec_encode_video,该符号在函数 "void __cdecl video_encode_example(char const *,int)" (?video_encode_example@@YAXPBDH@Z) 中被引用
1>decoding_encoding.obj : error LNK2019: 无法解析的外部符号 _av_image_alloc,该符号在函数 "void __cdecl video_encode_example(char const *,int)" (?video_encode_example@@YAXPBDH@Z) 中被引用
1>decoding_encoding.obj : error LNK2019: 无法解析的外部符号 _av_opt_set,该符号在函数 "void __cdecl video_encode_example(char const *,int)" (?video_encode_example@@YAXPBDH@Z) 中被引用
1>decoding_encoding.obj : error LNK2019: 无法解析的外部符号 _avcodec_decode_video2,该符号在函数 "void __cdecl video_decode_example(char const *,char const *)" (?video_decode_example@@YAXPBD0@Z) 中被引用
那么我们要怎么使用这些库呢,看如下代码:
extern "C"
{
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "avcodec.lib")
#pragma comment (lib, "avdevice.lib")
#pragma comment (lib, "avfilter.lib")
#pragma comment (lib, "avformat.lib")
#pragma comment (lib, "avutil.lib")
#pragma comment (lib, "swresample.lib")
#pragma comment (lib, "swscale.lib")
};
我们把以上代码插入到main()函数所在的cpp文件,这样就是告诉编译器这些库编译的时候要按C语言的规则来。这个原因是我猜测的,可能会有所偏差,希望高手来指正。