Ffmpeg编译过程

 

一、      起因

在windos平台下,想深入了解FFMPEG代码,用VC2013开发工具跟踪调试的FFMPEG。

       由于本人在编译过程中走了不少弯路,所以整理该文档,希望能对和我一样的初学者带来帮助。

安装mingw、YASM可以参考前面部分内容。建议直接看第六片段【补充】内容,可以免去配置环境变量。

二、      环境

系统

windows 8.1

开发工具

VC2013

Ffmpeg

版本:2.6.2

下载地址:http://ffmpeg.zeranoe.com/builds/source/ffmpeg/ffmpeg-20150414-git-013498b.tar.xz

 

MinGW Installation Manager

链接地址: http://sourceforge.net/projects/mingw/files/

 

Yasm

版本:1.3.0

下载地址: http://www.tortall.net/projects/yasm/releases/yasm-1.3.0-win32.exe

三、      配置过程

1.   MinGW Installation Manager下载安装包

 

2.   YASM

yasm-1.3.0-win32.exe改名为yasm.exe,复制到./MinGW/msys/1.0/bin

目录下。

3.   msys.bat配置

配置./MinGW/msys/1.0/msys.bat,在此文件的最前面(@echo off之后)添加一行如下内容:

call"D:\Program Files\Microsoft Visual Studio 12.0\VC\bin\vcvars32.bat"

(依实际安装路径修)。

4.   link

重命名 ./MinGW/msys/1.0/bin/link.exe为link_renamed.exe (依实际安装选择),这一步是防止这个link.exe与vc的link.exe发生冲突,编译完成后可修改回来。

四、      编译过程

1.    解压ffmpeg并启动msys

复制ffmpeg-20150414-git-013498b.tar.xz到./MinGW/msys/1.0/home目录下。解压到当前文件夹下,重命名目录为ffmpeg。

执行msys.bat

 

2.   配置编译选项

n  静态库

./configure--enable-static --prefix=./vs2013_build --enable-debug --toolchain=msvc

n  动态库

./configure--enable-shared --prefix=./vs2013_build --enable-debug --toolchain=msvc

 

3.   编译

 

4.   安装

 

安装后的文件目录

 

注意:默认生成的静态库扩展名为.a,需要手动修改为.lib。

5.   cuda编译(2020-10-13)

系统
windows 10
开发工具
VS2019
Ffmpeg
版本:4.3.1

注意事项: CUDA10、11版本安装后没有nppi.lib文件,需要安装cuda8版本(cuda_8.0.61_win10.exe安装通过)。

参考https://developer.nvidia.com/ffmpeg

./configure --enable-nonfree --enable-nvenc --enable-cuda --enable-cuvid --disable-libnpp --host-os=win64 --arch=x86_64 --target-os=win64 --prefix=./vs2019_build --enable-debug --toolchain=msvc  --enable-shared --extra-cflags=-I/g/Tools/Develop/VC/cuda/Video_Codec_SDK_10.0.26/Interface --extra-ldflags=-L/g/Tools/Develop/VC/cuda/Video_Codec_SDK_10.0.26/Lib/x64 --extra-cflags=-I/g/Tools/LIBRARY/ffmpeg/ffmpeg/nv-codec-headers/include

五、      测试实例

// FfmpegTest.cpp : 定义控制台应用程序的入口点。

//

#include"stdafx.h"

#include<stdlib.h>

#include<Windows.h>

//Crypto API 微软公司在NT4.0以上版本中提供了一套完整的Crypto API的函数,

//支持密钥交换,数据加密解密,数字签名,给程序员带来了很大方便,

//用户在对软件进行保护的时候可以直接利用Crypto API来完成这些工作。

//比如计算注册码,检查程序的完整性等。

#include<Wincrypt.h>

#pragmacomment (lib, "Advapi32.lib")

#pragmacomment(lib, "ws2_32.lib")

 

#ifdef__cplusplus

extern"C" {

#endif

 

#include"../ffmpegLib/include/libavcodec/avcodec.h"

#include"../ffmpegLib/include/libavformat/avformat.h"

#include"../ffmpegLib/include/libavdevice/avdevice.h"

#ifdef__cplusplus

}

#endif

 

#pragmacomment(lib,"..//ffmpegLib//lib//libswresample.lib")

#pragmacomment(lib,"..//ffmpegLib//lib//libswscale.lib")

#pragmacomment(lib,"..//ffmpegLib//lib//libavcodec.lib")

#pragmacomment(lib,"..//ffmpegLib//lib//libavdevice.lib")

#pragmacomment(lib,"..//ffmpegLib//lib//libavfilter.lib")

#pragmacomment(lib,"..//ffmpegLib//lib//libavformat.lib")

#pragmacomment(lib,"..//ffmpegLib//lib//libavutil.lib")

 

int_tmain(intargc, _TCHAR* argv[])

{

    av_register_all();

 

    system("pause");

    return 0;

}

 

 

六、      补充(2019.12.27)

1>编译环境
    win10、vs2017、msys1.0、ffmpeg4.0.2
    
2>.打开【VS 2017的开发人员命令提示符 】控制台窗口。
3>.进入mingw目录,执行【msys.bat】
4>.进入ffmpeg目录,执行
./configure --enable-static --enable-debug --toolchain=msvc --prefix=./vs2017_build

 

七、      编译错误问题

fftools/cmdutils.o 错误 2

fftools/cmdutils.c(1317): warning C4013: “is_device”未定义;假设外部返回 int
fftools/cmdutils.c(1317): error C2223: “->priv_class”的左侧必须指向结构/联合
fftools/cmdutils.c(1320): error C2065: “ofmt”: 未声明的标识符
fftools/cmdutils.c(1320): error C2223: “->name”的左侧必须指向结构/联合
fftools/cmdutils.c(1320): error C2168: “strcmp”: 内部函数的实参太少
fftools/cmdutils.c(1321): error C2065: “ofmt”: 未声明的标识符
fftools/cmdutils.c(1321): error C2223: “->name”的左侧必须指向结构/联合
fftools/cmdutils.c(1321): error C2168: “strcmp”: 内部函数的实参太少
fftools/cmdutils.c(1322): error C2065: “ofmt”: 未声明的标识符
fftools/cmdutils.c(1322): error C2223: “->name”的左侧必须指向结构/联合
fftools/cmdutils.c(1323): error C2065: “ofmt”: 未声明的标识符
fftools/cmdutils.c(1323): error C2223: “->long_name”的左侧必须指向结构/联合
fftools/cmdutils.c(1330): error C2065: “ifmt”: 未声明的标识符
fftools/cmdutils.c(1330): warning C4047: “=”:“int”与“const AVInputFormat *”的间          接级别不同
fftools/cmdutils.c(1331): error C2065: “ifmt”: 未声明的标识符
fftools/cmdutils.c(1331): error C2223: “->priv_class”的左侧必须指向结构/联合
fftools/cmdutils.c(1334): error C2065: “ifmt”: 未声明的标识符
fftools/cmdutils.c(1334): error C2223: “->name”的左侧必须指向结构/联合
fftools/cmdutils.c(1334): error C2168: “strcmp”: 内部函数的实参太少
fftools/cmdutils.c(1335): error C2065: “ifmt”: 未声明的标识符
fftools/cmdutils.c(1335): error C2223: “->name”的左侧必须指向结构/联合
fftools/cmdutils.c(1335): error C2168: “strcmp”: 内部函数的实参太少
fftools/cmdutils.c(1336): error C2065: “ifmt”: 未声明的标识符
fftools/cmdutils.c(1336): error C2223: “->name”的左侧必须指向结构/联合
fftools/cmdutils.c(1337): error C2065: “ifmt”: 未声明的标识符
fftools/cmdutils.c(1337): error C2223: “->long_name”的左侧必须指向结构/联合
fftools/cmdutils.c(1340): error C2065: “ifmt”: 未声明的标识符
fftools/cmdutils.c(1340): error C2223: “->name”的左侧必须指向结构/联合
fftools/cmdutils.c(1340): error C2168: “strcmp”: 内部函数的实参太少
fftools/cmdutils.c(1534): warning C4090: “函数”: 不同的“const”限定符
fftools/cmdutils.c(1604): warning C4090: “函数”: 不同的“const”限定符
fftools/cmdutils.c(1644): warning C4090: “函数”: 不同的“const”限定符
fftools/cmdutils.c(2145): warning C4090: “函数”: 不同的“const”限定符
fftools/cmdutils.c(2148): warning C4090: “函数”: 不同的“const”限定符
fftools/cmdutils.c(2152): warning C4090: “函数”: 不同的“const”限定符
make: *** [ffbuild/common.mak:67:fftools/cmdutils.o] 错误 2

 

该问题是由于cl.exe输出的汉字内容 【"用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.27.29111 版"】造成的,通过字符集查看就能分辨出来。

 

解决方法:

修改config.h文件中,CC_IDENT定义

#define CC_IDENT "Microsoft(R)C/C++"

如下图

 

4.3.1版本编译后问题(2020-10-13)

1>avcodec.lib(mfenc.o) : error LNK2019: 无法解析的外部符号 MFCreateMediaType,函数 mf_choose_output_type 中引用了该符号
1>avcodec.lib(mfenc.o) : error LNK2001: 无法解析的外部符号 IID_ICodecAPI
1>avcodec.lib(mfenc.o) : error LNK2001: 无法解析的外部符号 IID_IMFMediaEventGenerator
1>avcodec.lib(mf_utils.o) : error LNK2019: 无法解析的外部符号 MFStartup,函数 ff_instantiate_mf 中引用了该符号
1>avcodec.lib(mf_utils.o) : error LNK2019: 无法解析的外部符号 MFShutdown,函数 ff_free_mf 中引用了该符号
1>avcodec.lib(mf_utils.o) : error LNK2019: 无法解析的外部符号 MFCreateAlignedMemoryBuffer,函数 ff_create_memory_sample 中引用了该符号
1>avcodec.lib(mf_utils.o) : error LNK2019: 无法解析的外部符号 MFCreateSample,函数 ff_create_memory_sample 中引用了该符号
1>avcodec.lib(mf_utils.o) : error LNK2001: 无法解析的外部符号 IID_IMFTransform
1>avformat.lib(tls_schannel.o) : error LNK2019: 无法解析的外部符号 AcquireCredentialsHandleA,函数 tls_open 中引用了该符号
1>avformat.lib(tls_schannel.o) : error LNK2019: 无法解析的外部符号 __imp_FreeCredentialsHandle,函数 tls_close 中引用了该符号
1>avformat.lib(tls_schannel.o) : error LNK2019: 无法解析的外部符号 InitializeSecurityContextA,函数 tls_close 中引用了该符号
1>avformat.lib(tls_schannel.o) : error LNK2019: 无法解析的外部符号 __imp_DeleteSecurityContext,函数 tls_close 中引用了该符号
1>avformat.lib(tls_schannel.o) : error LNK2019: 无法解析的外部符号 __imp_ApplyControlToken,函数 tls_close 中引用了该符号
1>avformat.lib(tls_schannel.o) : error LNK2019: 无法解析的外部符号 QueryContextAttributesA,函数 tls_write 中引用了该符号
1>avformat.lib(tls_schannel.o) : error LNK2019: 无法解析的外部符号 FreeContextBuffer,函数 tls_close 中引用了该符号
1>avformat.lib(tls_schannel.o) : error LNK2019: 无法解析的外部符号 EncryptMessage,函数 tls_write 中引用了该符号
1>avformat.lib(tls_schannel.o) : error LNK2019: 无法解析的外部符号 DecryptMessage,函数 tls_read 中引用了该符号
1>avutil.lib(random_seed.o) : error LNK2019: 无法解析的外部符号 BCryptOpenAlgorithmProvider,函数 av_get_random_seed 中引用了该符号
1>avutil.lib(random_seed.o) : error LNK2019: 无法解析的外部符号 BCryptCloseAlgorithmProvider,函数 av_get_random_seed 中引用了该符号
1>avutil.lib(random_seed.o) : error LNK2019: 无法解析的外部符号 BCryptGenRandom,函数 av_get_random_seed 中引用了该符号

解决办法

#pragma comment(lib, "Mfuuid.lib")
#pragma comment(lib, "Strmiids.lib")
#pragma comment(lib, "Mfplat.lib")
#pragma comment(lib, "Bcrypt.lib")
#pragma comment(lib, "Secur32.lib")

 

ffnvcodec依赖问题

ERROR: cuda requested, but not all dependencies are satisfied: ffnvcodec

在msys64控制台下输入

git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
cd nv-codec-headers
make
make install PREFIX=/usr

 

查看 pkg-config --list-all

八、64位编译 

安装msys64

修改msys2_shell.cmd配置

msys64编译ffmpeg显示乱码问题

进入目录编译

./configure --host-os=win64 --arch=x86_64 --target-os=win64 --prefix=./vs2019_build --enable-static --enable-debug --toolchain=msvc

 

九、参考文档链接

n  http://blog.csdn.net/finewind/article/details/38854517

n  http://blog.csdn.net/leixiaohua1020/article/details/44587465

n  http://blog.csdn.net/langeldep/article/details/6804331

n  https://msdn.microsoft.com/en-us/library/windows/desktop/aa379886(v=vs.85).aspx

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值