 系统:Windows10 1909
准备工具
FFmpeg源码:下载地址 MSYS-1.0.11:下载地址 PKG-CONFIG:下载地址 yasm-1.3.0-win32:下载地址 coreutils-5.97-3-msys-1.0.13-bin.tar.lzma:下载地址 x264源码:下载地址 MinGW-4.8.1:下载地址
环境搭建
安装MSYS-1.0.11.exe,我将其安装在"C:\msys64"路径下  弹出窗口,输入’n’回车 
- 解压PKG-CONFIG.7z,将pkg-config.exe与libglib-2.0-0.dll,拷贝到C:\msys\1.0\bin目录下
- 将下载后的yasm-1.3.0-win32.exe改名yasm.exe,拷贝到C:\msys\1.0\bin目录下
- 将coreutils-5.97-3-msys-1.0.13-bin.tar.lzma解压,将里面的pr.exe,拷贝到C:\msys\1.0\bin目录下
- 将FFmpeg源码ffmpeg-2.4.tar解压到C:\Users\m\Downloads(自己选择文件夹)
- 将x264源码x264-master.tar.bz2解压到C:\Users\m\Downloads
- 解压MinGW,将其bin目录加入系统环境变量path

编译x264 到C:\msys\1.0目录下,双击msys.bat启动mysys,测试gcc
gcc -v
出现版本信息说明正常  否则,输入以下命令
export PATH=/C/Qt/Tools/MinGW/bin:$PATH
其中/C/Qt/Tools/MinGW/bin是mingw的bin目录路径(C:\Qt\Tools\MinGW\bin) 切换到x264源码目录,并编译x264
cd /C/Users/m/Downloads/x264-master.tar/x264-master/x264-master
./configure --prefix=./build --enable-static --disable-asm
make
make install
–disable-asm 因为没有安装nasm工具,关闭汇编优化功能(可能影响程序执行效率) –enable-static 生成静态链接库供ffmpeg编译时使用 –prefix=./build 编译x264生成文件的目录
编译成功后,在C:\Users\m\Downloads\x264-master.tar\x264-master\x264-master\build目录下有三个子目录  bin目录存放x264程序,include存放x264的头文件,lib存放静态库文件,include和lib目录是我们编译ffmpeg要用到的
编译ffmpeg
切换目录到ffmpeg源码目录,编译
cd /C/Users/m/Downloads/ffmpeg-2.4.tar/ffmpeg-2.4
./configure --prefix=./build --enable-shared --disable-static --enable-yasm --enable-libx264 --enable-gpl --target-os=mingw32 --arch=
x86_64 --extra-cflags="-I/C/Users/m/Downloads/x264-master.tar/x264-master/x264-master/build/include -Dx264_bit_depth=X2
64_BIT_DEPTH" --extra-ldflags="-L/C/Users/m/Downloads/x264-master.tar/x264-master/x264-master/build/lib"
make
make install
configure选项说明: –prefix=./build 编译后安装的目标文件夹 –enable-shared 生成动态链接库 –enable-yasm 启用汇编优化功能 –enable-libx264 启用x264编码功能 –enable-gpl 使用x264功能必须启用的选项 –arch=x86_64 编译64位版本库,(如果是32位,使用–arch=x86) -I 指定附加头文件目录,此处附加x264头文件的目录 -L 指定附加库目录,此处附加x264静态库文件的目录 -D 编译时定义宏,相当于#define x264_bit_depth X264_BIT_DEPTH ,将x264_bit_depth替换。否则编译时出现如下错误:  具体原因参考:这里 编译成功后的ffmpeg库就在C:\Users\m\Downloads\ffmpeg-2.4.tar\ffmpeg-2.4\build目录下了。其中有四个目录  bin目录存放编译好的动态库文件和对应lib文件,ffmpeg程序。  而include文件夹内包含ffmpeg的头文件  lib文件夹包含libxxx.dll.a文件,对于mingw,可以看作一个静态库文件,只需要在编译时使用参数-lxxx.dll ,就可以使用了,但是在运行时,还是需要bin文件夹内动态库文件的支持。有点类似于msvc的dll动态库文件所对应的lib文件。实质上并不是一个完整的静态库文件。在被编译进程序后,运行时还是需要dll文件的支撑  share文件夹内有一些程序例子
测试ffmpeg程序
ffmpeg -v
 测试x264编码功能,将视频文件转换为x264编码
ffmpeg -i input.mp4 -vcodec libx264 out.mp4
转换成功 
ffmpeg hello word msvc: 新建一个控制台工程 主程序编辑以下代码
#define __STDC_CONSTANT_MACROS
#include "stdafx.h"
//因为ffmpeg是用c语言写的,对于fmpeg的头文件,需要用extern "C" 修饰,以正常使用它的库
extern "C"
{
#include "libavutil/log.h"
};
int _tmain(int argc, _TCHAR* argv[])
{
// 设置控制台输出级别
av_log_set_level(AV_LOG_DEBUG);
// 打印输出字符串Hello World !
av_log(NULL, AV_LOG_DEBUG, "%s", "Hello World !\n");
av_log(NULL, AV_LOG_DEBUG, "%s", "Hello World !\n");
system("pause");
return 0;
}
配置头文件目录为ffmpeg库的include文件夹  如果你的vs版本低于2013,需要下载msinttypes-r26.zip这个文件并解压。其中包括c99标准的两个头文件inttypes.h,stdint.h。并将解压后的目录也加入项目头文件附加包含目录里面 配置附加库目录为ffmpeg库目录里bin文件夹  配置要链接的库,就是ffmpeg库的bin文件夹里面所有的lib文件名  将ffmpeg库的bin文件夹里面的dll文件拷贝到程序目录下 
之后点击编译运行  mingw: 用记事本编辑一个源程序 helloword.cpp
extern "C"
{
#include "libavutil/log.h"
};
int main(int argc, char* argv[])
{
// 设置控制台输出级别
av_log_set_level(AV_LOG_DEBUG);
// 打印输出字符串Hello World !
av_log(NULL, AV_LOG_DEBUG, "%s", "Hello World !\n");
av_log(NULL, AV_LOG_DEBUG, "%s", "Hello World !\n");
system("pause");
return 0;
}
使用如下命令编译
g++ helloword.cpp -D__STDC_CONSTANT_MACROS -I../build/include -L../build/lib -lavcodec.dll -lavdevice.dll -lavfilter.dll -lavformat.dll -lavutil.dll -lswresample.dll -lswscale.dll
-D__STDC_CONSTANT_MACROS 定义__STDC_CONSTANT_MACROS宏 -I 指定头文件目录,也就是fffmpeg库的include文件夹 -L 指定库文件目录,也就是ffmpeg库的lib文件夹 -lxxx 指定链接的库文件,也就是ffmpeg库的lib文件夹内libxxx.dll.a。在链接参数-l 中,需要去掉lib前缀和.a后缀 编译通过后,同样的将ffmpeg库的bin目录下的所有dll文件拷贝到程序所在目录,之后运行程序
./a.exe

在使用mysys2进行编译时,我会遇到以下问题  通过使用参数--target-os=mingw32 可以得到解决,而之后的问题   无法解决,因此只能使用mysys-1.0.11进行编译,并且使用mysys-1.0.11不会遇到以上的问题
相关下载
yasm.exe ffmpeg-2.4.tar x264-master.tar MSYS-1.0.11.exe pkg-config for windows coreutils-5.97-MSYS-1.0.11-snapshot.tar i686-4.8.1-release-win32-dwarf-rt_v3-rev2.7z
|