【FFmpeg】Windows下编译ffmpeg,链接libx264静态库

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/u013295518/article/details/90273899

简介

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。由于FFmpeg是基于Linux开发的开源项目,源代码和Windows下最常见的Visual Studio提供的C/C++编译器不兼容,因此它不能使用MSVC++编译,需要在Windows下配置一个类似Linux的编译环境。本文主要记录Windows下FFmpeg编译的过程。

安装环境搭建

1.需要下载的工具介绍

2.MSYS2和MinGW的安装

  • MSYS2安装没有啥可说的一直next就行 安装完成后目录结构如下:
    图片
  • 启动脚本文件msys2_shell.cmd执行 "pacman -Syuu"命令,中间可能提示需要关闭命令再重启下继续执行“pacman -Syuu”。
  • 然后执行“pacman -S --needed base-devel mingw-w64-x86_64-toolchain”下载mingw编译环境。颇为耗时,如果嫌时间长,可以更新国内源,或者在csdn下载mingw 自行配置。
  • 执行完成之后将“C:\msys64/mingw64/bin/”放到系统环境变量Path中。
  • cmd命令行执行gcc -v查看是否安装成功。

3.编译libx264为静态库

  • 启动安装好的msys2,在这里我们使用mingw-64启动,如图:
    在这里插入图片描述
    在这里插入图片描述
  • 启动之后cd到我们下载的x264源码目录(记得解压)
  • 依次执行
./configure  --enable-static --disable-asm --disable-opencl --disable-cli -–prefix=/usr/local/x264
make && make install
  • 此时x264目录如下,然后可以继续编译ffmpeg了:
    在这里插入图片描述

4.编译FFmpeg

编译ffmpeg的时候遇到过两个很骚气的问题,1:cant find libx264;2:编译通过之后ffmpeg是动态链接libx264的。出现这些个问题的原因很简单就是命令行参数的问题。

  • 同样 cd到ffmpeg的目录
  • 依次执行如下参数即可:
./configure --disable-x86asm --enable-shared --disable-static --enable-libx264 --extra-cflags=-I/usr/local/x264jh/include --extra-ldflags="-L/usr/local/x264/lib -static" --pkgconfigdir=/usr/local/x264/lib/pkgconfig --prefix=/usr/local/ffmpeg
make
make install
  • 编译完成之后前往/usr/local/ffmpeg/bin目录测试h264编码是否编译ok(因为遇到动态库编译进去的错误)
  • 在/usr/local/ffmpeg/bin中启动cmd,执行ffmpeg -i 1.wmv -vcodec h264 7.mp4,其中1.wmv是我们的测试文件。
  • 如果有什么问题可以随时咨询我。

5.谈谈编译FFmpeg中遇到的问题

  • 按照网上的办法export $path $DL_LIBRARY_PATH $C_INCLUDE_PATH这些环境变量后 Cant find libx264。后来通过“–extra-cflags” ,“–extra-ldflags”等编译参数解决
  • 编译通过之后发现自己的avcodec-58.dll这些dll中带有libx264-157的动态库,so-细级恐思:肯定是编译参数不对,所以在–extra-ldflags中加了“-static”,实际情况如:–extra-ldflags="-L/usr/local/x264/lib -static"
  • 在此列出部分参数的含义:
/*Makefile选项CFLAGS,LDFLAGS,LIBS
CFLAGS 表示用于 C 编译器的选项,

CXXFLAGS 表示用于 C++ 编译器的选项。
这两个变量实际上涵盖了编译和汇编两个步骤。

CFLAGS: 指定头文件(.h文件)的路径,如:CFLAGS=-I/usr/include -I/path/include。同样地,安装一个包时会在安装路径下建立一个include目录,当安装过程中出现问题时,试着把以前安装的包的include目录加入到该变量中来。

LDFLAGS:gcc 等编译器会用到的一些优化参数,也可以在里面指定库文件的位置。用法:LDFLAGS=-L/usr/lib -L/path/to/your/lib。每安装一个包都几乎一定的会在安装目录里建立一个lib目录。如果明明安装了某个包,而安装另一个包时,它愣是说找不到,可以抒那个包的lib路径加入的LDFALGS中试一下。

LIBS:告诉链接器要链接哪些库文件,如LIBS = -lpthread -liconv

简单地说,LDFLAGS是告诉链接器从哪里寻找库文件,而LIBS是告诉链接器要链接哪些库文件。不过使用时链接阶段这两个参数都会加上,所以你即使将这两个的值互换,也没有问题。

有时候LDFLAGS指定-L虽然能让链接器找到库进行链接,但是运行时链接器却找不到这个库,如果要让软件运行时库文件的路径也得到扩展,那么我们需要增加这两个库给"-Wl,R":

LDFLAGS = -L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib

如果在执行./configure以前设置环境变量export LDFLAGS="-L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib" ,注意设置环境变量等号两边不可以有空格,而且要加上引号(shell的用法)。那么执行configure以后,Makefile将会设置这个选项,链接时会有这个参数,编译出来的可执行程序的库文件搜索路径就得到扩展了。*/

猜你喜欢

转载自blog.csdn.net/u013295518/article/details/90273899