您的位置:首页 > 其它

windows平台下FFMPEG的编译与使用

2012-07-21 10:50 351 查看
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文件位置并找到它。

编译的具体过程就不一一细说,推荐一篇博客,大家可以参考这个来。

/article/1881836.html

相信编译对大家来说应该都没什么问题,推荐大家编译动态库,因为静态库我到现在也没找到可以直接使用的方法。

下面我给大家介绍一下动态库的使用方法,动态库是由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语言的规则来。这个原因是我猜测的,可能会有所偏差,希望高手来指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: