Windows下ffmpeg x264的编译

  1. 下载msys2

  1. 下载添加yasm

  1. 安装编译x264

  1. 安装编译ffmpeg

  1. 报错分析

  1. 下载msys2

  • MSYS2,直接从官网下载x86_64版本的安装程序就可以。这东西默认安装在C盘,如果你的C盘告急的话,建议装在其他盘,这东西会越使用越大

  • 安装完成之后,先把安装目录下的msys2_shell.cmd中注释掉的rem set MSYS2_PATH_TYPE=inherit改成set MSYS2_PATH_TYPE=inherit,这样后面就可以继承VS下的环境

  • 重命名D:\msys64\usr\bin\link.exe 为D: \msys64\usr\bin\link.bak, 避免和MSVC 的link.exe

  • 安装编译工具,打开msys2.exe, (D: \msys64是我的msys2的安装目录)

  • 然后输入指令下载mingw编译工具(会提示下载那些包,我直接全部下载)

# 编译32位库使用i686这个
pacman -S mingw-w64-i686-toolchain

# 编译64位库使用x86_64这个
pacman -S mingw-w64-x86_64-toolchain
  1. 下载yasm

  • 下载YASM,根据你要编译多少位的库,选择不用的下载

  • 下载好之后,将yasm-1.3.0-win32.exe(x64的是yasm-1.3.0-win64.exe) 改名为yasm.exe,并放置于 MSYS2 安装目录D:/msys64/usr/bin/ 中

  1. 安装编译x264

  • 下载x264包,如果git速度很慢,可以直接下载压缩包解压到对应目录下(D:\msys64\home\Administrator, administrator我的目录,根据自己的home下的目录存放压缩包

git clone http://git.videolan.org/git/x264.git

Administrator

  • 带开一个cmd窗口,(windows键 + R,输入cmd,按回车)

#跳转到msys2的目录下,输入msys2_shell.cmd -mingw32,回车打开msys的mingw32
d:
cd msys64
msys2_shell.cmd -mingw32
#(64位的要输入msys2_shell.cmd -mingw64)
  • 打开mingw32的窗口后,输入如下转换到x264目录下,操作如下

cd x264
./configure --disable-cli --enable-shared --disable-win32thread --disable-thread --extra-ldflags=-Wl,--output-def=libx264.def --host=mingw32 --disable-asm --enable-static
# -–host 指定编译器, 编译64位改为 --host=mingw32, 下面这条是编译64位的指令
./configure --disable-cli --enable-shared --disable-win32thread --disable-thread --extra-ldflags=-Wl,--output-def=libx264.def --host=mingw64 --disable-asm --enable-static

make -j8
make install
# make install完成后,  bin、inclue、lib会被复制到/usr/local/目录下
# 生成.lib文件, 将libx264.def转为libx264.lib
# 32位的指令
lib /machine:i386 /def:libx264.def

# 64位的指令
lib /machine:X64 /def:libx264.def

# 生成的libx264.lib就在当前目录下
  1. 编译ffmpeg

  • 打开VS的开发者命令工具, 编译32位的选择x86,64位的选择x64,并切换到msys2的目录下,打开msys2的终端

# 切换目录打开,msys2的终端
cd /
cd msys2
msys2_shell.cmd

下载ffmpeg的源码,如果git很慢,可以先下载压缩包再解压到目录下(我的是D:\msys64\home\Administrator

git clone git://source.ffmpeg.org/ffmpeg.git

cd ffmpeg
./configure --toolchain=msvc --enable-yasm --enable-asm --enable-gpl --enable-libx264 --extra-cflags=-I/usr/local/include --extra-ldflags=-LIBPATH:/usr/local/lib --enable-static --enable-shared
make
make install

install 完成就可以其 usr/local/bin lib include查看编译好的.dll .lib 以及.h文件也在此处

  1. 一些报错分析

  1. Error:make cmommand not found

  • 解决方式:

找到...msys64\mingw32\bin目录,将mingw32-make.exe复制一份,然后将其更名位为make.exe

  1. ERROR:x264 not found using pkg-config

  • 解决方式:

# 加pkgconfig的环境变量  直接在msys2中输入即可
# 路径是编译x264时,x264.pc文件所在的路径
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
# 然后再进行编译
./configure --toolchain=msvc --enable-yasm --enable-asm --enable-gpl --enable-libx264 --extra-cflags=-I/usr/local/include --extra-ldflags=-LIBPATH:/usr/local/lib --enable-static --enable-shared


# 或者打开etc/profile,加入内容
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
# 保存关闭profile后,在终端中输入
source /etc/profile
./configure --toolchain=msvc --enable-yasm --enable-asm --enable-gpl --enable-libx264 --extra-cflags=-I/usr/local/include --extra-ldflags=-LIBPATH:/usr/local/lib --enable-static --enable-shared

编译ffmeg时报错,内容如下

fftools/cmdutils.c(1119): error C2065: “slib”: 未声明的标识符
fftools/cmdutils.c(1119): error C2296: “%”: 非法,左操作数包含“char [138]”类型
fftools/cmdutils.c(1119): error C2059: 语法错误:“数字上的错误后缀”
fftools/cmdutils.c(1119): error C2059: 语法错误:“%”
fftools/cmdutils.c(1119): error C2017: 非法的转义序列
fftools/cmdutils.c(1119): error C2001: 常量中有换行符
fftools/cmdutils.c(1150): error C2143: 语法错误: 缺少“)”(在“*”的前面)
fftools/cmdutils.c(1150): error C2143: 语法错误: 缺少“{”(在“*”的前面)
fftools/cmdutils.c(1150): error C2059: 语法错误:“)”
fftools/cmdutils.c(1151): error C2054: 在“options”之后应输入“(”
fftools/cmdutils.c(1252): error C2143: 语法错误: 缺少“)”(在“*”的前面)
fftools/cmdutils.c(1252): error C2143: 语法错误: 缺少“{”(在“*”的前面)
fftools/cmdutils.c(1252): error C2059: 语法错误:“)”
fftools/cmdutils.c(1253): error C2054: 在“avclass”之后应输入“(”
fftools/cmdutils.c(1261): error C2275: “AVInputFormat”: 将此类型用作表达式非法

解决方式:

  • 找到对应的.c文件,打开后定位到报错的行,将其注释掉(warning类的提醒不用管)

主要是注释掉包含 CC_IDENT ,这个宏定义所在的行

报错的不是cmdutils.c文件,处理的方式也是一样的,ffmpeg各版本之间有一些差异

注释掉之后,在进行在进行编译再继续

# 主要是注释掉包含 CC_IDENT ,这个宏定义所在的行
//av_log(NULL, level, "%sbuilt with %s\n", indent, CC_IDENT);
//print_str("compiler_ident", CC_IDENT);
  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XaoPage

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值