windows下编译ffmpeg源代码

2023-05-16

由于工作原因,需要使用ffmpeg在windows下进行代码跟踪

于是,上网找相关文章,搜索出来有很多,经过查看,其中的一个英文网站是最好的,网址:

http://ffmpeg.arrozcru.org/wiki/index.php?title=Main_Page

上面有详细说明整个过程,但为了防止此网站不能访问的问题,这里特把一般步骤写下来,以做个记录。后面会说明我在按照上面说的步骤进行的过程中遇到困难的解决方法。

 

说明:

A. 在后面叙述的过程中,可能需要有支持7z压缩格式的解压缩软件,最新的winrar应该就是支持的

B. 以下的步骤,只是真对ffmpeg编译,所以涉及到无关的部分,本文不会关心它们,除非有特别说明

 

1. 下载ffmpeg源代码,下载网址:svn://svn.mplayerhq.hu/ffmpeg/trunk

首先需要安装svn客户端,我用的是TortoiseSVN,应该是可以很方便地从网上下载,下载之后安装。

安装之后,在你要保存ffmpeg源代码的位置上点右键,然后选择check out,输入以上的网址,包括前面的“svn:”,然后点OK按钮,它会把整个源代码下到本地,根据网速,可能几秒钟到几十分钟不等。源代码30M左右

 

2. 安装windows下的编译系统

2.1 安装MSys

首先下载以下软件:

MSYS-1.0.11-2004.04.30-1.exe
MSYS-1.0.11-20080821-dll.tar.gz
bash-3.1-MSYS-1.0.11-snapshot.tar.bz2
coreutils-5.97-MSYS-1.0.11-snapshot.tar.bz2
make-3.81-MSYS-1.0.11-2.tar.bz2

 

安装MSYS-1.0.11-2004.04.30-1.exe 的最后会出现一个dos窗口,大意是让用户选择是否让msys自己提交install,输入n后回车,以表示我们不允许msys自己进行这个操作。

为了方便后面的叙述,我们假设msys安装到了默认的目录c:/msys/1.0下

 

解压MSYS-1.0.11-20080821-dll.tar.gz 到c:/msys/1.0下,覆盖原目录

解压bash-3.1-MSYS-1.0.11-snapshot.tar.bz2 后,从解压出的目录中,bin下拷贝sh.exe到c:/msys/1.0/bin下,如果原来存在,则覆盖之,这个解压后的目录可以删除

解压 coreutils,然后拷贝解压出来的 coreutils-5.97/bin/pr.exe 到c:/msys/1.0/bin中

解码make-3.81-MSYS-1.0.11-2.tar.bz2 到c:/msys/1.0下,如果有文件存在,则覆盖它们

为了产生正确的库文件,需要修改c:/msys/1.0/msys.bat:

使用记事本打开该文件,然后在其最开始处添加:

call "C:/Program Files/Microsoft Visual Studio 9.0/VC/bin/vcvars32.bat"

注意:这一行必需处在此文件的最开始处(我把它放到除去rem开头之外的最前面还是不能正常工作,不知道为啥),同时修改你的vc路径,我的是vs2008,所以是9.0,此修改指定vc的vcvars32.bat文件位置并招待它

如果是你的os是64位的,还需要对该文件的 _WindowsNT 处进行修改,紧跟这一行的下面一行添加:

rem Hopefully a temporary workaround for getting MSYS shell to run on x64

rem (WoW64 cmd prompt sets PROCESSOR_ARCHITECTURE to x86)

if not "x%PROCESSOR_ARCHITECTURE%" == "xAMD64" goto _NotX64

set COMSPEC=%WINDIR%/SysWOW64/cmd.exe

%COMSPEC% /c %0 %1 %2 %3 %4 %5 %6 %7 %8 %9

goto EOF

:_NotX64

 

关于64位的部分,我没有试,只不过是直接从说明处到拷贝过来

 

2.2 安装MinGW

下载以下6个安装包:

· binutils-2.18.50-20080109-2.tar.gz

· mingwrt-3.15.1-mingw32-dll.tar.gz

· mingwrt-3.15.1-mingw32-dev.tar.gz

· w32api-3.13-mingw32-dev.tar.gz

 

gcc-core-3.4.5-20060117-1.tar.gz
gcc-g++-3.4.5-20060117-1.tar.gz

下载后解压以上6个到c:/msys/1.0/mingw中,如果有重复的,则覆盖掉

另外gcc编译器也可以选择4.2.1版本的:

gcc-core-4.2.1-sjlj-2.tar.gz
gcc-g++-4.2.1-sjlj-2.tar.gz

但在解压之后,需要进行改名:

c++-sjlj.exe to c++.exe
cpp-sjlj.exe to cpp.exe
g++-sjlj.exe to g++.exe
gcc-sjlj.exe to gcc.exe
我用的是3.4.5的,所以我的不需要改名

 

2.3 整合MinGW 和 msys系统

这一步非常简单,修改c:/msys/1.0/etc/fstab.sample的名称为:fstab,即把括展名直接去掉,然后用记事本打开,修改

c:/mingw /mingw

c:/msys/1.0/mingw /mingw

然后保存即可。

修改的内容应该是自己的安装路径

 

到此,所有的系统已全部完成。在该网站上,还有说明上面安装的软件包的版本问题,这部分不再翻译,直接拷贝到如下:

 

Get the most up-to-date MSys+MinGW system.

Today (November 29, 2008), that includes:

· make

The version of make that is installed by default will not work for FFmpeg. You will have to upgrade.
make must be MSYS make version => 3.81
Preferably version 3.81-2.
Also do not get MinGW make. Get MSYS make.


· Mingw runtime

Must be version => 3.15
Note: if any older version is used, everything will still build and link fine, but non numeric AVOptions will not work in ffmpeg (-flags, etc.)


· w32api

Should be version => 3.13
Note: if any older version is used, you will have to --disable-devices while configuring FFmpeg, and vfwcap will not be compiled in.


· bash

Must be version => 2.05b to build FFmpeg.
Preferably version 3.1 to build most other external libraries.


· binutils

do not use binutils-2.15.91-20040904-1. It is known to not link properly.
(2.17 recommended by Gianluigi Tiesi)

 

3. 编译ffmpeg

这部分我不清楚里面的很多选项,我只是照着步骤在做

有两个编译方式,一个是静态库,一个是动态库。

首先启动msys,

c:/msys/1.0/msys.bat

在shell上的提示符如下:

Administrator@LIGO-PC ~
$
首先进入ffmpeg目录,编译一般是三个步骤,首先配置,然后编译,最后安装。如果是改变编译方式,则还要在配置之前先clean

3.1 编译静态库

 A. 配置

在shell提示符下输入:

./configure --enable-static --enable-memalign-hack --prefix=c:/msys/1.0 --extra-cflags="-fno-common"

这个过程要花费较长的时间,开始会有较长的时间没有反应。其中的prefix是msys的安装路径

B. 编译

make

C. 安装

make install

安装只是把要开发使用的库文件拷贝到c:/msys/1.0/lib/目录中,头文件拷贝到c:/msys/1.0/include/目录中。

产生的库文件为.a文件

 

3.2 编译动态库

动态库和静态库只在配置上的差别,配置如下:

./configure --enable-shared --disable-static --enable-memalign-hack --prefix=c:/msys/1.0 --extra-cflags="-fno-common"

后面的步骤一样:

make

make install

在开始编译之前,可以把原来编译的目标 文件清除掉:

make distclean

 

动态编译应该是会产生lib文件,但是我编译之后一直没有产生,所以后面的开发,用的都是静态库

编译之后的dll文件被放到了ffmpeg目录下,可以搜索查看它们

 

 

4. 开发

基于ffmpeg的开发,本来是想着比较简单,但实际上还是有点问题

起初在vc6.0下编译,一直编译不过,只好放到vs2008下编译,才编译通过,但是在release下还是没办法编译通过,链接时的错误如下:

1>libmingwex.a(mbrtowc.o) : error LNK2019: unresolved external symbol __imp____lc_codepage referenced in function _mbrlen
1>libmingwex.a(wcrtomb.o) : error LNK2001: unresolved external symbol __imp____lc_codepage
1>../binRelease/chipdecoder.dll : fatal error LNK1120: 1 unresolved externals

 

包含的头文件和库文件如下:

#ifdef __cplusplus
extern "C" {
#endif

#include "libavformat/avformat.h"

 

#pragma comment(lib, "libgcc.a")
#pragma comment(lib, "libavcodec.a")
#pragma comment(lib, "libavformat.a")
#pragma comment(lib, "libavutil.a")
#pragma comment(lib, "libmingwex.a")
#ifdef __cplusplus
}
#endif
其中的libgcc.a和libmingwex.a是从c:/msys下拷贝过来的,编译之前,要把c:/msys/1.0/include和c:/msys/1.0/lib两个目录加入到编译工程中

 

另外,由于我是先在vc6.0下编译的,无法编译通过,所以就对这些头文件进行了部分修改:

A. 把c:/msys/1.0下的三个文件_mingw.h、inttypes.h、stdint.h拷贝到了include目录中

B. 在_mingw.h文件的结尾处(在#endif /* __MINGW_H */一行之前)添加了一行:

#define __restrict__

C. 把所有long long改成了__int64,如果是直接在vs2008下编译,则这个修改应该是不需要的

D. 在stdafx.h文件的

#include <windows.h>

之后,添加:

#include <math.h>

注意,这一行必需在包含avformat.h之前,否则总是在math.h中编译通不过

 

先暂时写到这里,没有写得更详细,以后有时间再补充

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

windows下编译ffmpeg源代码 的相关文章

  • 如何以编程方式检索“Program Files”文件夹的实际路径? [复制]

    这个问题在这里已经有答案了 可能的重复 C 如何在 Windows Vista 64 位上获取程序文件 x86 https stackoverflow com questions 194157 c sharp how to get prog
  • 新的 Windows 应用程序 - 什么语言?

    我们目前正处于开发 Windows 桌面应用程序的前期阶段 但当听到有关 Windows 8 Silverlight WPF Jupiter 的所有最新讨论时 我不知道该相信什么了 现在用WPF启动一个新项目是不是有问题 我应该切换到 Si
  • tlb 文件是否具有关联架构?

    我有一个 32 位 DLL 旨在通过 com 模型和关联的 tlb 文件进行访问 该 DLL 似乎是 x86 有没有办法从 x64 程序访问这种 DLL tlb 文件与 x86 x64 无关吗 我问这个问题是因为有些功能似乎可以工作 其他功
  • Pip install 导致此错误“ cl.exe' failed with exit code 2 ”

    我已经阅读了有关此错误的所有其他问题 但令人沮丧的是 没有一个给出有效的解决方案 如果我跑pip install sentencepiece在命令行中 它给出了以下输出 src sentencepiece sentencepiece wra
  • 如何使用 python 操作系统更改驱动器?

    我正在尝试更改当前目录C to Y 我试过 import os os chdir Y 但我不断收到错误消息 提示无法找到驱动器 本质上我正在寻找相当于 cd d cmd 中的命令 你确定吗Y 确实是有效的驱动器号吗 Try os chdir
  • 当IRQL下降时,Windows中如何触发软件中断?

    我知道对于硬件中断 当 KeAcquireInterruptSpinLock 调用 KeLowerIrql 时 HAL 会调整 LAPIC 中的中断掩码 这将允许自动服务排队的中断 可能在 IRR 中 但是对于软件中断 例如 ntdll d
  • 如何访问窗口?

    我正在尝试使用其句柄访问特定窗口 即System IntPtr value Getting the process of Visual Studio program var process Process GetProcessesByNam
  • 在 C++ 和 Windows 中使用 XmlRpc

    我需要在 Windows 平台上使用 C 中的 XmlRpc 尽管我的朋友向我保证 XmlRpc 是一种 广泛可用的标准技术 但可用的库并不多 事实上 我只找到一个库可以在 Windows 上执行此操作 另外一个库声称 您必须做很多工作才能
  • Windows 任务计划程序报告不正确/不一致的结果代码

    背景 我正在尝试在计划任务失败时收到电子邮件通知 我的任务可以通过退出代码 错误级别 指示失败 我想使用它并遵循中描述的过滤方法这个答案 https stackoverflow com a 4289360 29805触发电子邮件 Probl
  • 没有设备的设备驱动程序?

    我正在创建一个需要使用一些内核级模块的应用程序 为此我将应用程序分为 2 个 一个用户级程序和一个内核级程序 在阅读了有关设备驱动程序并浏览一些教程后 我有点困惑 是否可以存在没有任何特定设备与之关联的设备驱动程序 除了设备驱动程序 内核代
  • 如何驯服 Windows 标头(有用的定义)?

    在其中一个答案中this https stackoverflow com questions 1394132 macro and member function conflict问题jalf https stackoverflow com
  • 如何在Android项目中使用libffmpeg.so?

    我正在尝试在 Android 中创建一个屏幕录制应用程序 为此 我使用 FFmpeg 我已经创建了 libffmpeg so 文件 现在我想在 Android 项目中使用相同的方法来调用它的本机函数 我怎样才能做到这一点 本教程提供了有关此
  • 如何使用android ndk r9b为Android编译FFMPEG

    我想设计一个Android应用程序 可以通过FFMPEG命令播放和编辑视频 但我不知道如何在Android上使用FFMPEG 我尝试过从Google搜索到的许多方法 但它们太旧了 无法实现 现在 FFMPEG的最新版本是2 1 1 Andr
  • Windows 上本机 C++ 应用程序中的自动死代码检测?

    背景 我有一个用原生 C 编写的应用程序 花了几年的时间 大约有 60 KLOC 有很多函数和类已经死了 可能有 10 15 就像下面提出的类似的基于 Unix 的问题 我们最近开始对所有新代码进行单元测试 并尽可能将其应用于修改后的代码
  • 在 System.Windows.Forms.RichTextBox 中禁用 VScrollbar 的绘制

    我有一个继承自 RichTextBox 的自定义控件 该控件能够 禁用 富文本编辑 我通过在 TextChanged 事件期间将 Rtf 属性设置为 text 属性来实现此目的 这就是我的代码的样子 private bool lockTex
  • 如何安全地将对象(尤其是 STL 对象)传入和传出 DLL?

    如何将类对象 尤其是 STL 对象 传入和传出 C DLL 我的应用程序必须以 DLL 文件的形式与第三方插件交互 并且我无法控制这些插件是使用什么编译器构建的 我知道 STL 对象没有保证的 ABI 并且我担心这会导致我的应用程序不稳定
  • 我需要避免尝试更新连接到 TSQLQuery 的 Delphi TClientDataset 中的非物理字段

    概要 我的代码正在尝试更新 Delphi XE 中的非物理字段TClientDataset 连接到TSQLQuery以其SQL属性集 作为运行时的结果创建Open命令 我有一个TClientDataset连接到一个TDatasetProvi
  • 可以禁用“应用程序错误”对话框吗?

    我使用 Hudson 作为持续集成服务器来测试 C C 代码 不幸的是 我在某个地方有一个错误导致内存损坏 因此在某些 Windows 计算机上我有时会收到一个 应用程序错误 对话框 解释一条指令引用了无法读取的内存 弹出此对话框并基本上挂
  • WinError6 句柄无效 Python 3+ 多处理

    我正在运行一个 Python 3 7 Flask 应用程序 它使用flask socketio设置一个socketio用于浏览器客户端的服务器 另一个连接到单独远程的Python进程socketio服务器和交换消息 以及另一个从 PIR 传
  • H264 字节流到图像文件

    第一次来这里所以要温柔 我已经在给定的 H 264 字节流上工作了几个星期 一般注意事项 字节流不是来自文件 它是从外部源实时提供给我的 字节流使用 Android 的媒体编解码器进行编码 当将流写入扩展名为 H264的文件时 VLC能够正

随机推荐

  • GA-B85M-D3V PLUS 1150安装win10后的蓝屏问题汇总

    通过windbg来定位出错的sys文件 下面是安装技嘉官方驱动后依然频繁出现的蓝屏 尝试方案fltmgr sys sfc scannow chkdsk c f r dxgmms2 syssystem service exception dx
  • 超声波风速风向传感器

    OSA 1F1 超声波风速风向传感器 1 概述 OSA 1F1超声波风速风向传感器是一款迷你型全数字化传感器 xff0c 高度集成超声波风速 风向传感器 xff0c 体积小巧 xff0c 集成度高 xff0c 质量轻 xff0c 坚固耐用
  • Loggernet软件新手入门(一)

    loggernet软件新手入门 xff08 一 xff09 安装与简单操作 一 xff0e 软件及驱动安装安装 1 1 打开软件安装包 xff0c 点击 exe应用程序图标 xff0c 然后在弹出的对话框中 xff0c 选择 Install
  • Loggernet软件新手入门(二)

    一 xff0e 创建一个程序 在loggernet软件中 xff0c 创建一个程序有两种方式 xff1a Short Cut以及CRBasic Editor xff0c 这两种方式都可以在Program目录下找到 1 1Short Cut
  • PC200W-简版loggernet软件

    一 xff0e 解压缩PC200W文件夹 xff0c 双击下图图标 xff0c 可以打开PC200W 二 xff0e 创建一个连接 打开软件后 xff0c 会弹出一个关于创建连接的对话框 xff0c 如果没有弹出 xff0c 可以在Netw
  • 示例一:CR300接CS655

    Public PTemp Batt volt Public CS655 3 Alias CS655 1 61 vwc Alias CS655 2 61 ec Alias CS655 3 61 T Units vwc 61 Units ec
  • 日本原装COM 3600F专业型空气负离子检测仪 --CR1000采集

    Public PTemp Batt volt Public instring string As String 36 Public Num spilt 3 As String 3 Alias Num spilt 1 61 ION FM Pu
  • java FlowLayout示例

    java FlowLayout示例 xff1a import java awt FlowLayout import javax swing JLabel import javax swing WindowConstants import j
  • Get 一个显示界面,与数采串口通信

    程序第一步 xff1a 显示 数据来源 xff0c CR1000数据采集器 xff0c 5秒采集并存储上传 第二步 xff1a 存储 TXT文档存储 xff0c 逗号分隔 xff0c 每月创建一个新的文件 xff0c 可以另存为excel文
  • UART通信协议

    UART通信协议 一 UART是什么 xff1f 1 同步串口通信 vs 异步串口通信2 串行通信 二 通信协议三 工作原理四 特点 一 UART是什么 xff1f 通用异步收发传输器 xff08 Universal Asynchronou
  • win10右下角的通知区域

    属性 gt 通知和操作 gt 选择在任务栏上显示哪些图标 gt
  • UART一对多通信的方法

    通常 xff0c uart为单对单通信 xff0c 当用到一对多时可以用RS485 然而有时候我们MCU的uart口只剩一个 xff0c 又要接多个uart的外围芯片 xff0c 这时如果转成RS485需要加多个485收发器 xff0c 成
  • 全网最全的 postman 工具使用教程

    正文如下 xff0c 如果觉得有用欢迎点赞 关注 postman是一款支持http协议的接口调试与测试工具 xff0c 其主要特点就是功能强大 xff0c 使用简单且易用性好 无论是开发人员进行接口调试 xff0c 还是测试人员做接口测试
  • 星际争霸1终于可以在win10上运行了

    win7的时候 xff0c 星际争霸1就不能运行 xff0c 只好装了个虚拟机 xff0c 在虚拟机里玩 刚刚更新到了win10 xff0c 总觉得在虚拟机里玩不是个事 xff0c 就去网上搜索 xff0c 终于发现了办法 在 StarCr
  • windows下编译opencv 3.4.0

    为了方便后期的调试 xff0c 自己动手编译opencv3 4 0 xff0c 这样有需要的时候还可以自己修改修改源代码 通常来说 xff0c 编译32位比较简单 xff0c 直接用cmake生成编译的工程就行了 xff0c 但64位就比较
  • opencv添加的新接口clearVec()的实现

    自己编译的opencv xff0c 之前文章有说添加了这个接口 xff0c 也有上传3 3 0版本添加这个接口之后编译好的库 xff0c 但是没有把实现过程展现出来 xff0c 导致有些朋友问我如何实现的 xff0c 今天把这个实现放出来
  • 苏泊尔电饭煲不工作的维修

    本篇文章与其说是维修 xff0c 倒不如说成是 拆 xff0c 因为维修相对容易 xff0c 但想拆开却很艰难 xff0c 大部分的时间都花在了拆的工作上面 老家伙的样子如下 型号为 xff1a CYSB50FC99 100 xff0c 铭
  • 萨克斯吹不响的解决办法

    刚开始吹萨克斯 xff0c 发现总是吹不响 看各种入门的文章 xff0c 很多都强调口型的重要性 xff0c 各文章说得也都差不多 xff0c 我仔细捉摸 xff0c 不断尝试 xff0c 似乎还是不得要领 特别是安装好之后 xff0c 很
  • vs2010制作安装工程

    这里的安装工程 xff0c 是指制作安装包 xff0c 而不是vs2010的安装包 用向导生成一个安装工程 xff0c 通常会直接打开一个文件编辑窗口 xff1a 这个窗口很容易编辑 xff0c 把所有要安装的文件拖到 应用程序文件夹 上
  • windows下编译ffmpeg源代码

    由于工作原因 xff0c 需要使用ffmpeg在windows下进行代码跟踪 于是 xff0c 上网找相关文章 xff0c 搜索出来有很多 xff0c 经过查看 xff0c 其中的一个英文网站是最好的 xff0c 网址 xff1a http