win7用mingw编译ffmpeg+x264总结

这两天公司要求转码,在网上找了下,觉得ffmpeg不错,于是开动,期间遇到很多问题,这里给自己总结下。

此博客已经不再更新,请看http://blog.csdn.net/dancing_night/article/details/44831085

一、安装mingw:

1、在我的资源里面有,不需要再装c和c++的编译器。

2、在msys.bat最前面加入call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat"


二、下载和编译x264

1、地址:http://www.videolan.org/developers/x264.html,点击左边那个大大的按钮“DownLoad X264”,下载时不要用搜狗自动的下载,因为我用搜狗下的总是坏的包,最好在按钮上右击用迅雷下载,大小有500多K;

2、因为是.tar.bz2结尾的压缩包,常用的WINRAR不能解压,下载7-zip,来解压,解压到msys的home文件夹下。

3、编译x264需要yasm,自己下一个,放在c:/windows/system32里面去。

4、打开mingw,并跳转到x264目录下,

输入命令

./configure--enable-win32thread --enable-shared --disable-asm

make

make install

到此,在msys的local文件夹下会生成所需的头文件和DLL,但没有.lib文件,下面我们就用dll来提取lib文件;

三、提取lib

1、下载工具:poxports,地址:http://download.csdn.net/detail/harvic880925/4603881

将其中的pexports.exe放到VS2008的VC\bin目录下,我的是D:\Program Files\Microsoft VisualStudio 9.0\VC\bin,

2、msys的local文件夹下生成的DLL文件同样复制到D:\ProgramFiles\Microsoft Visual Studio 9.0\VC\bin目录下,比如我生成的DLL名为:libx264-128.dll

3、依次点击开始-》所有程序-》MicrosoftVisual Studio 2008-》Visual Studio Tools-》Visual Studio 2008命令提示

就此打开了VS2008命令提示界面

输入: (括号内为说明内容)

cd bin       (切换到bin目录下)

pexports libx264-128.dll > libx264-128.def

lib /machine:ix86 /def:libx264-128.def

(以上内容为避免错误可以直接复制、粘贴到命令行)

到这应该就会在D:\ProgramFiles\Microsoft Visual Studio 9.0\VC\bin下生成libx264-128.lib文件了,如果没有可以重新执行下第3步,我第一次出现了个warning就没有成功,第二次才成功的。

四、编译ffmpeg

1、大家可以到FFMPEG官网上去下载最新版:http://ffmpeg.org/download.html现在的最新版就是我编译的版本;

其实我更喜欢下面这个地址,直接列出来所有的供下载的版本:http://ffmpeg.org/releases/

2、用cmd打开msys.bat。

3、跳转到ffmpeg目录。

4、输入命令

$./configure --enable-memalign-hack --enable-ffserver --enable-network --enable-protocols --enable-muxers --disable-yasm --enable-shared --enable-w32threads --enable-libx264 --enable-gpl --extra-cflags=-Ic:/x264/include --extra-ldflags=-Lc:x264/lib  

make

make install

完成后,所有的头文件、库文件都保存在C:\msys\1.0\local文件夹里;
--extra-cflags=-I/c:/x264/include --extra-ldflags=-L/c:x264/lib 这两句命令是将X264的头文件和库文件包含。

五、期间遇到的问题及解决办法(这里只提我的解决办法,网上还有很多)

1、编译x264的时候老是不通过,用mingw编译最新的x264,./configure 时出现“No working C compiler found”,原因:找不到c编译器。

解决办法:首先请确认你的已经正确安装c编译器,其次MinGW\msys\1.0\etc目下的fstab文件,如果不存在fstab,请复制一份fstab.sample,然后改名为:fstab,再修改其内容为:C:/mingw /mingw,也即为MinGW的安装路径。

2、集成ffmpeg/x264:ERROR: libx264 not found的问题,原因:找不到x264.h,解决办法:--extra-cflags=-I/c:/x264/include --extra-ldflags=-L/c:x264/lib,这两句话是关键,一定要指向x264的包含目录和库目录。

3、出现如下错误:

  1. libavcodec/x86/h264_qpel_mmx.c:1294: Error: operand type mismatch for `cmp'  
  2. libavcodec/x86/h264_qpel_mmx.c:1294: Error: operand type mismatch for `cmp'  
  3. libavcodec/x86/h264_qpel_mmx.c:1298: Error: operand type mismatch for `cmp'  
  4. libavcodec/x86/h264_qpel_mmx.c:1298: Error: operand type mismatch for `cmp'  
  5. libavcodec/x86/h264_qpel_mmx.c:964: Error: operand type mismatch for `cmp'  
  6. libavcodec/x86/h264_qpel_mmx.c:964: Error: operand type mismatch for `cmp'  
  7. libavcodec/x86/h264_qpel_mmx.c:964: Error: operand type mismatch for `cmp'  

解决办法:把libavcodec/x86/h264_qpel_mmx.c中的"g"替换为“rm”即可解决!

4、unrecongnized command line option '-mno-cygwin'

原因:在GCC 4版本里去除了这个参数。

解决方法:把xvidcore\build\generic\configure里的删除-mno-cygwin。

5、libavcodec/libxvidff.c:implicit declaration of function 'tempnam'

原因:出现类似于“implicit declaration of function ***”这种错误,多半是由于没有正确添加头文件造成的。

解决方法:在libxvidff.c里加入#include并加上extern  char *tempnam(const char *dir, const char *pfx);

6、在ffmpeg make install 中报“unable to rename '..../avformat-52.93.0.dll';reason:File exists”

解决方法:使劲make install。

7、编译FFMPEG时,出现了 ffmpeg yasm not found, use --disable-yasm for a crippled build,是因为 FFMPEG了提高编译速度,使用了汇编指令,如果系统中没有yasm指令的话,就会出现上述的问题。

解决办法是:

A 如果是Windows系统, 从网上下载一个 yasm.exe 并安装在mingw/bin下面,重新编译,就不会出现该错误了;

B 如果是Linux系统,则更简单,直接在终端输入 sudo apt-get install yasm ,安装好后,重新编译就 OK了。

8、In file include from libavutil/file.c:27:0:c:\mingw\include\unistd.h:83:1: error: expected ',' or ';' before 'int'-------

c:\mingw\include\unistd.h:157:12:error:expected '=', ',', ';', 'asm' or '__attpribute__' before 'ftruncate'

解决方案:

把unistd.h里的内容替换为:

#ifndef _UNISTD_H
/*
 * This file is part of the Mingw32 package.
 *
 * unistd.h maps (roughly) to io.h
 * Other headers included by unistd.h may be selectively processed;
 * __UNISTD_H_SOURCED__ enables such selective processing.
 */
#define _UNISTD_H
#define __UNISTD_H_SOURCED__ 1


#include
#include
#include


/* These are also defined in stdio.h. */
#ifndef SEEK_SET
#define SEEK_SET 0
#endif


#ifndef SEEK_CUR
#define SEEK_CUR 1
#endif


#ifndef SEEK_END
#define SEEK_END 2
#endif


#ifdef __cplusplus
extern "C" {
#endif


#if !defined __NO_ISOCEXT
#include /* For useconds_t. */


int __cdecl __MINGW_NOTHROW usleep(useconds_t useconds);
#endif  /* Not __NO_ISOCEXT */


/* This is defined as a real library function to allow autoconf
   to verify its existence. */
int ftruncate(int, off_t);
#ifndef __NO_INLINE__
__CRT_INLINE int ftruncate(int __fd, off_t __length)
{
  return _chsize (__fd, __length);
}
#endif


#ifdef __cplusplus
}
#endif


#undef __UNISTD_H_SOURCED__
#endif /* _UNISTD_H */


你可能感兴趣的:(x264,ffmpeg)