这两天公司要求转码,在网上找了下,觉得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、出现如下错误:
解决办法:把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
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
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 */