最近在做流媒体开发这一块,在服务器端,所用的live555不支持mp4,avi等视频容器格式,所以打算运用ffmpeg来进行扩展。将MP4文件先运用ffmpeg进行解析,解析成live555所支持的基本视频流格式(如H.264等)和音频流格式,再运用live555中对基本音视频流的处理方式处理后,发送到客户端进行解码播放,这其中运用到了ffmpeg库,为了便于调试,开发环境初步选择了在windows下进行,所以需要在windows下编译ffmpeg。然后再扩充live555源代码。所用的版本为ffmpeg0.8.5.本文主要介绍如何编译ffmpeg,以及被vc6.0调用。

一,编译环境的搭建:

1,操作系统:windows xp sp3
2, VC6.0
3, MinGW+msys
    到http://sourceforge.net/projects/mingw/files/去下载在线安装包,这个文件一般只有几百K字节,下完以后双击运行,按提示安装,在需要选择的时候把和C、C++、msys相关的都选上,继续自动安装,然后需要等待一些时间……MinGW+msys系统便已经安装好了,我安装的路径是C:\MinGW,
msys的目录是C:\MinGW\msys\1.0
4, ffmpeg 0.8.5(源码可以在官网上找到)
5,ffmpeg编译里面的汇编代码需要yasm.exe,去yasm官网(http://yasm.tortall.net/Download.html)下一个windows合适的最新版本,弄好改名成yasm.exe放到C:\WINDOWS\system32下去(主要是省得加环境变量)或者放到C:\MinGW\msys\1.0\bin文件夹下。最好nasm也弄一个,经常某些库编译用的上。不放也无所谓,就是生成的东西不支持汇编,所以速度会很受影响。
 

二、编译过程

1、编辑C:\MinGW\msys\1.0\msys.bat文件,在最前面加入一行

call "C:\Program Files\Microsoft Visual Studio \VC98\bin\vcvars32.bat"

后面路径是机器上安装的vc的对应路径,加入这行编译ffmpeg时会多出windows下调用dll对应的lib,方便vc调用。(网上看到的)

2、双击C:\MinGW\msys\1.0\msys.bat运行,进入ffmpeg源码目录D:\ffmpeg0.8.5,这个窗口的命令和shell相似,和cmd运行有些区别,右斜杠需要换成左斜杠,然后盘符D:也要改成/d,输入cd /d/ffmpeg/ffmpeg0.8.5,进入ffmpeg主目录。

3、开始编译ffmpeg,继续输入:

"./configure --enable-shared --disable--static --enable-memalign-hack" 配置

4,等待一段时间后,输入:make (忽略警告)

5,等待较长的时间后,输入make install

此时编译过程结束,需要的结果在C:\MinGW\msys\1.0\local目录下,有对应的头文件(include中),dll以及lib等库文件(bin中),还有ffmpeg.exe等运行程序。

在自己编译的时候,曾经先编译了ffmpeg1.0,但因为版本的问题,在扩充的代码中老是报内存不能为读的错误,怀疑是ffmpeg版本的问题,所以想要降到0.8的试一下。但是在后来编译0.8的时候不论哪种版本,配置configure完后,make的时候都找不到相应的文件,无法make,这个问题困扰了自己很长时间,曾经一度想放弃,改在linux下操作。后来在网上找到点蛛丝马迹。干脆把MinGW卸载了,重新安装的,然后配置,make就可以了。具体原因没有深究。

补充说明:make指令后实际上在ffmpeg目录里已经有生成的dll和lib了,但是make install指令还是建议要执行
因为它会为你整理好需要的头文件(太体贴了,自己全拷觉得太多,自己选择又太麻烦,而且不会正确),然后dll文件大小会减小一些(自动文件瘦身)。

最后用VC6.0调用生成的库。在VC6.0的include路径中加入在上文生成local中includ路径。在link路径中加入local中bin的路径,然后在自己所建的工程link中加入生成的静态库avformat.lib avutil.lib avcodec.lib

这样就可以调用ffmpeg库了。

附:编译时遇到的一些问题:

,Cannot open include file: 'inttypes.h': No such file or director解决办法

1、找到include目录中的ffmpeg\common.h

2、在“#define COMMON_H”之后加入如下代码,同时删除“#include <inttypes.h>” 然后保存:



#if defined(WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__)

#    define CONFIG_WIN32

#endif

#if defined(WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__) && !defined(EMULATE_INTTYPES)

#    define EMULATE_INTTYPES

#endif

#ifndef EMULATE_INTTYPES

#   include <inttypes.h>

#else

    typedef signed char  int8_t;

    typedef signed short int16_t;

    typedef signed int   int32_t;

    typedef unsigned char  uint8_t;

    typedef unsigned short uint16_t;

    typedef unsigned int   uint32_t;

#   ifdef CONFIG_WIN32

        typedef signed __int64   int64_t;

        typedef unsigned __int64 uint64_t;

#   else

        typedef signed long long   int64_t;

        typedef unsigned long long uint64_t;

#   endif

#endif

2,error C3861: 'UINT64_C': identifier not found

找到include目录中的ffmpeg\common.h

在函数头部加入宏定义:

//自己所加的定义,处理UINT64_C未定义的错误

#ifndef INT64_C

#define INT64_C(c) (c ## L)

#define UINT64_C(c) (c ## UL)

#endif

3,处理相关宏定义格式错误,将括号中的…改为n

#if AV_GCC_VERSION_AT_LEAST(4,3)

#define av_alloc_size(n) __attribute__((alloc_size(__VA_ARGS__)))

#else

#define av_alloc_size(n)

#endif

4,出现Cannot open include file: 'stdint.h': No such file or directory

在出现 #include <stdint.h>的地方注掉即可

5,处理template类错误的方法,在extern前检查宏定义

#undef __cplusplus

extern "C" {

#include "libavutil/avutil.h"

#include "libavformat/avformat.h"

}

#define __cplusplus

在windows XP系统下编译和使用ffmpeg的更多相关文章

  1. Windows XP系统下添加任务计划常出现问题解决办法

    Windows XP系统下添加任务计划常出现问题解决办法 计划任务就是让电脑在指定的时间内执行指定的动作(计划动作),这些动作可以是一个程序,也可以是一个批处理,但是至少是可以运行的(通俗一些就是双击 ...

  2. Intel Nehalem微架构Calpella平台机型Windows XP系统下如何开启AHCI硬盘工作模式(XP系统下如何加载AHCI驱动)

    问题描述用户来电表示使用IDE模式安装XP系统后开启AHCI模式会出现开机蓝屏重启的问题,咨询如何在XP下加载AHCI驱动,以便开启BIOS中AHCI选项来发挥硬盘的最佳性能   问题分析 Windo ...

  3. 在Windows XP系统下架设FTP服务器需要5个步骤。

    4步win7下简单FTP服务器搭建:http://blog.sina.com.cn/s/blog_3f7e47f20100haur.html 申请网域护照(即帐户),开通免费域名.连接到www.ora ...

  4. Windows XP SP3下编译安装check-0.10.0

    软件环境:visual studio 2010 cmake-3.6.3-win32-x86 从github.com下载check-0.10.0到本地,解压出目录check-0.10.0 下载cmake ...

  5. Windows XP SP3下编译安装openssl-1.1.0b

    软件需要: openssl-1.1.0b visual studio 2010(cn_visual_studio_2010_ultimate_x86_dvd_532347.iso) perl:Acti ...

  6. Windows XP环境下 搭建Android NDK环境

    搭建Android NDK环境 Windows XP环境下 1 一些下载 ① NDK r7:http://developer.android.com/sdk/ndk/index.html ② cygw ...

  7. 我持续推动Rust语言支持Windows XP系统

    前言 Rust好像长期以来不支持Windows XP系统.有不少用户发帖提议官方支持XP,基本上都被Rust官方开发人员明白的拒绝了.他们的对话大致上是以这种形式開始和结束的(当中乙方代表官方及其拥趸 ...

  8. xp系统下硬盘安装centos6.5

    引言: 电脑系统是Windows XP,电脑没有光驱.手头没有U盘.没有移动硬盘.电脑主板不支持U盘启动,在这种情况下想安装CentOS 6.0,有木有办法? 答案:有办法,请看下面教程! 必备工具: ...

  9. Windows 10 x64 下编译 Hadoop 源码

    Windows 10 x64 下编译 Hadoop 源码 环境准备 Hadoop并没有提供官方的 Windows 10 下的安装包,所以需要自己手动来编译,官方文档中 BUILDING.txt 文件中 ...

随机推荐

  1. Zabbix3.4部署

    Zabbix简介 zabbix(音同 zæbix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活 ...

  2. C#中的out参数/ref参数/params可变参数

    out参数: out关键字 通过引用来传递参数,在定义方法和调用方法的时候都必须使用out关键字 简单来讲out可以用来返回多个参数类型. static void Main(string[] args ...

  3. js的内置对象

    转载: https://www.cnblogs.com/liuluteresa/p/6413988.html   在js里,一切皆为或者皆可以被用作对象.可通过new一个对象或者直接以字面量形式创建变 ...

  4. HDU 4315 Climbing the Hill [阶梯Nim]

    传送门 题意: 和上题基本一样:山顶可以有多人,谁先把king放到山顶谁就胜 并不太明白 #include <iostream> #include <cstdio> #incl ...

  5. BZOJ 1040: [ZJOI2008]骑士 [DP 环套树]

    传送门 题意:环套树的最大权独立集 一开始想处理出外向树树形$DP$然后找到环再做个环形$DP$ 然后看了看别人的题解其实只要断开环做两遍树形$DP$就行了...有道理! 注意不连通 然后洛谷时限再次 ...

  6. window.open()被部分浏览器拦截问题

    下面代码一切从简,大家理解即可 一.原因:1.因为在chrome的安全机制里面,非用户触发的window.open方法,是会被拦截的: 二.什么情况下不会被拦截或会被拦截? 1. $('#btn'). ...

  7. [Python Study Notes]匿名函数

    Python 使用 lambda 来创建匿名函数. lambda这个名称来自于LISP,而LISP则是从lambda calculus(一种符号逻辑形式)取这个名称的.在Python中,lambda作 ...

  8. hiveql函数笔记(二)

    1.数据查询 //提高聚合的性能 SET hive.map.aggr=true; SELECT count(*),avg(salary) FROM employees; //木匾不允许在一个查询语句中 ...

  9. Zabbix Agent active主动模式监控

    zabbix_server端当主机数量过多的时候,由Server端去收集数据,Zabbix会出现严重的性能问题,主要表现如下: 1.当被监控端到达一个量级的时候,Web操作很卡,容易出现502 2.图 ...

  10. css去除ios文本框默认圆角

    css去除ios文本框默认圆角 input, textarea {-webkit-appearance: none;}