如何用vs08编译ffmpeg

本文主要参考:如何用vc6编译ffmpeg, 并单步调试。

1. 下载最新git版本的源代码(http://ffmpeg.zeranoe.com/builds/, 本例下载的是2011-12-12版本)
2. 放到MSYS环境里配置,生成config.h文件。mingw gcc是能顺利编译通过整个项目的,并生成最新版的ffmpeg。
3. 建立vc6工程,把相关代码都加入到工程中。由于在vc生成的obj都在一个目录下,所以需要修改文件名,让其不重名。
4. 安装intel compiler 11编译器,单独提取其icl.exe及相关include目录,替换掉vc6自带的cl.exe, 在工程设置里加上/Qstd=c99,用于支持C99语法。
5. 安装intel compiler 10编译器,单独提取lib目录,因为此版本调试库的结构能完美支持vc6的调试信息。
6. 在vc6的options里设置include/exe/lib查找目录,指向intel编译器。
7. 开始修改代码,添加C99的相关linux头文件, 用于支持vc6, (unistd.h, stdint.h, inttypes.h, getopt.h)
8. 添加C99和linux的相关实现代码,ffmpeg需要用到: getopt_long, strtoll, gettimeofday, atoll, usleep等
9. 修改windows的相关兼容代码,GetWindowLongPtr -> GetWindowLong, GWLP_USERDATA
10. 去除硬件加速libavcodec代码,和依赖库代码。选择所需要的模块,修改相关的allcodec.c, alldevices.c, allfilters.c, allformats.c
11. 加上链接库,sdl.lib, winmm.lib, dxguid.lib, wsock32.lib
12. 在os_support.c里,把<winsock2.h>移动到文件最前面。
13. 如果是ffmpeg, 已经能顺利编译了。如果是ffplay,还需要编译静态sdl, 并链接。
14. 等等,音频运行不正确?有雪花声?因为还需要替换所有文件里的<math.h>为<mathimf.h>, 默认的rint等数学函数和gcc不兼容。
15. ok, 大功告成,纯C版本完美运行。
16. 由于ffmpeg0.9在c文件里,添加了一些intel compiler不支持的mmx语法,所以编译mmx/sse加速版本时,一小部分.c文件需要依赖mingw gcc编译成.o文件,再通过vc6的lib.exe工具转换成lib,让vc6链接上。当然还要加上yasm编译的很多汇编obj.
17. 有兴趣的,可以继续以此方法编译x264库,官方最新代码MMX版也可以顺利通过。

                            移植ffmpeg到VC环境心得

所有想学习ffmpeg的网友有福了,大名鼎鼎的ffmpeg,移植到Windows的VC6版本全部开源,编译环境为VC6+SP5+VCPP5。别忘记了顶贴哦。
移植ffmpeg到windows,主要的修改是ffmpeg中VC6不支持C99语法,简单移植步骤如下:
1:首先装好Linux、VMware和SDL,配置好smb,在Linux下编译通过,验证能正确的Run。
2:把Linux下相应目录的所有文件通过smb拖到Windows,以后的修改移植都在Windows下进行。
3:对照所有同名的.c文件和.o文件,如果有.c文件没有对应的同名.o文件,说明此.c文件没有编译,是多余的,可直接删除。不过我的习惯是在此文件后加.old后缀来标示,这类文件有几十个。注意有几个.c文件是被include在其他.c文件中,因此没有.o文件,不可删除,我的习惯是把这类文件加.inc后缀,并且修改相应include的文件名。这类文件共计有 jpeg_ls.c.inc,mdec.c.inc,motion_est_template.c.inc,svq3.c.inc和wmv2.c.inc。
4:修改config.h文件,关闭掉MMX/SSE2等汇编加速开关。定义CONFIG_WIN32标示目标系统为WIN32。
5:删掉目录下所有Linux编译生成的中间文件,包括.o文件,.d文件,还有Linux下的可执行文件。 如果怕删错了,就做好备份。
6:现在用VC6建一个工程文件,把所有文件的.c和.h文件加入到工程中,不包括ffmpeg.c/ffserver.c文件,不包括改了后缀名的.old文件和.inc文件。
    注意在libavcodec和libavformat目录下有些同名的.c文件,为区别同名.c文件,我的习惯是libavcodec目录下的文件名加_codec,libavformat目录下的文件名加_format。
7:为避免思维过多的切换,一次只处理一个方面的内容。首先搜查所有的AVCodec,对照.h文件中的定义改C99语法,通常是填一些NULL或0之类的值,接着搜查并处理所有的AVInputFormat,最后搜查并处理所有的AVOutputFormat。
8:搜查并处理所有AVRational语法。
9:至此,基本上主要的修改已经完成,剩下的主要有 动态数组和一些数组初始化,函数实参初始化等。
10:一维的动态数组比较好改,多维的动态数组比较困难,但是多维的动态数组多半用于编码,如果只要解码可以简单的注释掉。
11:数组初始化和函数实参初始化只需要多加一个临时变量,很简单的修改。
12:有些.h文件在VC6中找不到,有些可以从Linux中拷贝,也可以自己简单定义。最后编译修改.c文件的时候,一个一个的编译,一个一个的修改,没必要全部编译。
最后祝大家好运,移植顺利。开源的ffmpeg 是 51.8.0的版本,我大约修改了5天左右。

———————————————————————————————————以上为作者的原文。

实际补充:

1. 因为我除了在vs编译,还需要删减,所以先对ffmpeg工程作了删减,只保留需要的codec/format/protocol/scale,删去很多文件与内容。其中第三方库相关的文件,需要排除在外。

2. 照作者二所做,删去了所有的汇编加速。

3. 照作者二的第三步。

4. 所有inttypes.h的地方用自定义typedef替代,可以命名为myinttypes.h,所有基础类型报错的文件头部,加上该头文件。UINT64_C问题。可参考:vc 编译ffmpeg问题集

5. 在attributes.h头文件中,加上WIN32宏判断,在windows下将av_always_inline定义成__inline。

下面先尝试路线一,也就是作者一的思路:

6. 没找到直接的intel compiler,就下载了个试用版,intel composer,安装后在VS2008的右上方工具栏上,可以切换VC编译还是INTEL编译,切到intel后。

7. 语法错误大多是,未定义/重复定义/类型不匹配等,修改一下。

8. 链接错误,处理好各个模块之间同名的文件,比如utils.c/cpu.c/options.c/audioconvert.c/resample.c等,可以在后缀名前加上_{modulename}。

9. 一些函数平台相关,比如windows下为_snprintf,而linux下为snprintf。这些可以另辟一个头文件如osdep.h。

10. 包含的静态库大致有:strmiids.lib dxguid.lib quartz.lib strmbasd_unicode.lib VFW32.LIB ws2_32.lib Psapi.lib

11. 剩下最后一个x264编译,可以使用dll方式,因为最新的libx264代码已经没有vs工程,最新的有vs工程的还是2009年的。可参考:Windows下编译最新的x264

用到的工具:http://download.csdn.net/detail/fallenink/5133849,skip_prologue后缀的函数需要处理下,pexports工具导出来变量,经过dlltool工具,后变成__imp_*,

如果函数声明增加了__declspec(dllimport) ,链接的时候函数名会加上__imp_前缀,所以如果链接静态库, 函数的声明不用增加__declspec(dllimport) 。如果链接动态库,再增加__declspec(dllimport)。要注意修改。

12. 运行是遇到些问题,首先是get_cpu_flags,比较懒,直接给0;运行时遇到问题,经检查是栈溢出,改到2M就可以了,默认1M,在项目属性-连接器-系统中设置stack reserved值。【嵌入式中,会指出异常的类型,“有一个“管家”能把他们打印出来,pc和sp,progmram counter and stack pointer,dump with symbol file”】

13. 大小:intel编译出来的需要依赖一些dll库,增加了体积。比如libmmd.dll。看这里:http://software.intel.com/en-us/forums/topic/306546

『摘要』

How link LIBMMD.DLL as Static Library? How do it?

』『

1. Yes. Steps:

  • icl -c -MD t.cpp
  • xilink /nodefaultlib:libmmd.lib t.obj ---- it will link msvcrt.lib instead.

2. to link "libmmd" as static:

  • icl -MT t.cpp
  • it will link the libmmds.lib---the static version of libmmd.dll.

3. sorry. we don't provide freeware Intel Compiler.

路线二是个体力活,主要是针对C99标准修改源代码,大家保持精神活力即可:



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值