如何将ffmpeg在windows编译和使用

FFmpeg在Windows系统下的编译过程,分四步:
如下:
1.        配置编译环境
2.        下载FFMPEG的代码
3.        编译,获取FFMPEG库(头文件,lib,和DLL
4.        在VC下配置,测试
1.        配置编译环境
1)安装MSys
下载文件:
  bash-3.1-MSYS-1.0.11-snapshot.tar.bz2
  msysCORE-1.0.11-20080826.tar.gz
解压msysCORE-1.0.11-20080826.tar.gz,比如解压到X:\msys(以下内容都使用该路径描述,X为你安装的盘符)。
  解压bash-3.1-MSYS-1.0.11-snapshot.tar.bz2,产生一个名为bash-3.1的目录,在该目录下有一个子目录名为bin,其他的目录不需要关心。复制bin目录中的所有文件到D:\msys\bin,提示是否要覆盖sh.exe的时候,选择是。
  到“D:\msys\postinstall”目录下执行pi.bat,在出现的提示中输入n回车后(这个不搞错了),按任意键退出即可。
2)安装MinGW
  下载文件:
binutils-2.20-1-mingw32-bin.tar.gz
(binutils-2.19.1-mingw32-bin.tar.gz)
gcc-core-3.4.5-20060117-3.tar.gz 
gcc-g++-3.4.5-20060117-3.tar.gz
w32api-3.13-mingw32-dev.tar.gz
   mingwrt-3.16-mingw32-dev.tar.gz
(mingwrt-3.15.2-mingw32-dev.tar.gz)
mingwrt-3.16-mingw32-dll.tar.gz
(mingwrt-3.15.2-mingw32-dll.tar.gz)
把它们全部解压到X:\msys\mingw。
3)修改“msys.bat”
  用文本编辑器打开D:\msys\msys.bat,由于打算用MSVC++编译程序,所以需要有.lib文件才能链接到FFmpeg的库,这些.lib文件可以使用微软的工具链中lib命令产生。为此,机器上必须已经安装了微软的Visual Studio或是Visual C++。把下面一行加到msys.bat的最前面,把路径替换成机器上vcvars32.bat实际存在的路径,比如我的在“D:\program files\Microsoft Visual Studio 8\VC\bin”,于是就添加:
  call "D:\program files\Microsoft Visual Studio 8\VC\bin"
4)系统整合
  复制D:\msys\etc\fstab.sample为X:\msys\etc\fstab,用文本编辑器打开D:\msys\etc\fstab编辑。(需要使用一个支持Unix换行风格的编辑器,比如Notepad++),把下面这行:
  D:/mingw /mingw
  改为:
  D:/msys/mingw /mingw
注意:改的这个目录为mingw你所安装的目录,所以按本文来讲是这个目录。如果你安装不目录不同,就要改成你所安装的目录。
  完成以上步骤,MSys+MinGW系统就配置完成了。
2.      下载FFMPEG的代码
下载代码的办法由两个,一个就是用svn 下载下来。我觉得哪怕你知道svn是啥,也不用这个方法,因为太慢了。一个文件一个文件下,最关键SVN对应的地址是国外,都不知道什么才能全部下完。另外一个直接下一个代码的压缩包。
a)       SVN下载 地址为svn://svn.ffmpeg.org/ffmpeg/trunk
b)       直接压缩包。
首先进入 http://www.ffmpeg.org/download.html 这个是ffmpeg的官方主页。在 选项FFmpeg SVN下,点击full checkout 或者bare sources。这连个链接第一个可以通过SVN更新代码,所以文件要大点,后面那个是纯代码。或许可以直接点击该文件的这个两个链接的一个直接得到。
(我用的是bare sources的程序)
3.      编译,获取FFMPEG库(头文件,lib,和DLL)
首先通过MSys安装目录下的msys.bat启动MSys,这时会出现一个命令行窗口,它是一个运行着bash的rxvt程序,如下图:

这是一个类似Linux的shell并且在Windows上运行,就像是在使用一个真正的Linux shell。不过使用这个shell时需要注意:
  →目录名使用正斜杠来分割,而不是Windows所使用的反斜杠(比如说要写成"D:/ffmpeg"而不是"D:\ffmpeg")。
  →盘符(例如"C:\")可以从根目录处访问(像这样"/C/")。
  →文件名或目录名中如果带有空格,必须用双引号括起(例如这样"/C/Program Files",带有双引号)。
  下面切换到存放FFmpeg源代码的目录(假如你的代码解压之后的路径是D:\ffmpeg),方法是输入:"cd /D/ffmpeg"。
  接下来要配置FFmpeg,选择编译时包含的库,这里先输入:
  ./configure --enable-shared --disable-static --enable-memalign-hack
  --enable-memalign-hack选项是FFmpeg在Windows上编译成功所必须指定的,待配置完成后,将回到命令提示符,看到下图所示的画面:
如果没有错误的话,就可以"make"具有基本功能的FFmpeg了,在提示符后输入:make。
  编译的过程将持续很长时间。如果一切正常,结束后将返回提示符,并有如下的最后编译结束的输出画面:
在提示符后输入:make install。
执行完后会生成几个文件下在MSys目录的local文件夹下。
4.      在VC下配置(这个指如何在VC中调用ffmpeg库),测试
VC环境配置:(假如目录为上图所示)
方法当然就像其他额外库一样,一种是设置VC全局的Include路径为你E:\msys\local\include,设置VC全局lib路径为E:\msys\local\bin,增加操作系统的一个Path E:\msys\local\bin。
另一种就是设置某个工程的lib和Include的路径。增加一个指向上面对应的地址。这个我就不是说的详细,想必玩VC的都知道。
首先 建一个VC的控制台工程,然后把
E:\audio_video\ffmpeg\ffmpeg-0.5\libavcodec\apiexample.c(ffmpeg的存放目录)拷贝到你建的那个工程。然后改名apiexample.cpp。编译。你会发现缺头文件。这个时候你需要将E:\msys\mingw \include(mingw安装目录下的include)的inttypes.h,stdint.h,_mingw.h三个文件拷到D:\msys \include(你ffmpeg库的目录下的include)。编译还是有很多错。
1.       需要在inttypes.h中 #define __restrict__ __restrict
2.       如果是long long 错误就改成__int64,(我没有遇到这个错误)
3.       c->time_base.den= (AVRational){1,25}; 改成        c->time_base.num = 1; c->time_base.den = 25;//
4.       最上面的头文件定义如下:
#include // 注意这个别忘了,不然会出现math模板的一个错误
#include
#include
#include         
extern "C"
{
        #ifdef HAVE_AV_CONFIG_H
        #undef HAVE_AV_CONFIG_H
        #endif
                
        #include
        #include
        #pragma comment(lib, "avcodec.lib")
        #pragma comment(lib, "avutil.lib")
}
4.1. 我的理解是在api-example.cpp头文件中加入第4条的内容,即
#include
#include
#include

#ifdef HAVE_AV_CONFIG_H
#undef HAVE_AV_CONFIG_H
#endif
#include "libavformat/avformat.h" //andrew
#include "libavcodec/avcodec.h"
#include "libavutil/mathematics.h"
其中我加了 #include "libavformat/avformat.h",如果不加就会报许多错误,意思是有学多变量没有定义。我测试了加或者不加头#include ,对编译结果没有影响。
5. api-example.cpp中似乎不支持强制类型转换,如
samples = malloc(frame_size * 2 * c->channels);其实是将(void *)型转换成(short *),于是我在malloc的前面增加了(short *)此问题得以解决。即samples = (short *)malloc(frame_size * 2 * c->channels);
6.按照网上高手的指示我在vs2005的工具->选项->VC++目录中,包含文件一栏,加入我的include文件夹,即D:\msys\local\include

 

以上,你就可以在VC++中编译ffmpeg了。但是,配置MSYS太困难,咱给你一个下载地址,是已经配置好的MSYS哦~

 

地址如下:http://msys-cn.googlecode.com/files/MSYS-Update.rar

ffmpeg的源码,直接从ffmpeg的官网上下载吧。

 

上面这文不是咱自己写的。里面有不少错别字,大家原谅作者吧~

你可能感兴趣的:(ffmpeg,c/c++)