之前尝试过很多网上利用Windows编译FFmpeg的文章,都没有办法编译X64位的FFmpeg,有些教程中有专门提到编译64位的FFmpeg需要下载mingw-w64-install,但是编译的过程中总是遇到各种错误。尝试了很久依然没有成功。
然后在网上看见另外一篇教程:VS2015编译FFMPEG。方法很简答,并且成功编译了X64位的FFmpeg。特此记录:转自:http://blog.csdn.net/gongxp123456/article/details/52879976
系统环境:Windows 10 64位
需要安装的软件和工具:
Visual Studio 2015 With Update 3
MSYS2
YASM
一、VS2015
安装VS2015时,选择Git。
二、msys2
1、到这里下载:
http://msys2.github.io. 选择第二个:msys2-x86_64-20160921.exe
下载后,安装默认安装到C:\ msys64
2.安装后,到msys2窗口执行,安装编译程序: pacman -S make gcc diffutils
3. 重命名C:\msys64\usr\bin\link.exe 为C: \msys64\usr\bin\link.bak, 避免和MSVC 的link.exe抵触。
三、YASM
1. YASM下载地址:http://yasm.tortall.net/Download.html,下载其64位版本Win64 .exe (64 位 Windows 通用)。
2、下载后,将下载回来的yasm-1.3.0-win64.exe 改名为yaml.exe,并放置于 MSYS2 安装目录中。就是放置到c:\msys64\usr\bin\ 中。
四,ffmpeg
下载最新版本ffmpeg,本文是在2016.10.21下载,如果速度太慢,可以FQ后再执行:
进入windows命令行,在C:\FFMPEG目录下执行:
git clone git://source.ffmpeg.org/ffmpeg.git
四,编译ffmpeg
1、使用VC2015编辑C:\msys64\msys2_shell.cmd,将其中的:
rem set MSYS2_PATH_TYPE=inherit
“rem”注释删除掉,成为:
set MSYS2_PATH_TYPE=inherit
2、到开始菜单,执行“Visual Studio 2015-> VS2015 x64 本机工具命令提示符”,在命令窗口下,CD \msys64,执行:msys2_shell.cmd -mingw64
3、在启动的 MSYS2 终端中分别运行一下命令观察各便于工具组件是否被正确找到:
5、修改msys2窗口代码页为GBK,避免编译时显示乱码:
4、编译ffmpeg
在msys2窗口:
cd /
cd /ffmpeg
cd /ffmgeg
进入下载ffmpeg目录中
./configure --toolchain=msvc --arch=x86 --enable-yasm --enable-asm --enable-shared --disable-static
make
make install
这样以后,编译生产的执行文件ffmpeg.exe和DLL文件在目录C:\msys64\usr\local\bin中,开发头文件在C:\msys64\usr\local\include中。
需要安装的软件和工具:
Visual Studio 2015 With Update 3
MSYS2
YASM
一、VS2015
安装VS2015时,选择Git。
二、msys2
1、到这里下载:
http://msys2.github.io. 选择第二个:msys2-x86_64-20160921.exe
下载后,安装默认安装到C:\ msys64
2.安装后,到msys2窗口执行,安装编译程序: pacman -S make gcc diffutils
3. 重命名C:\msys64\usr\bin\link.exe 为C: \msys64\usr\bin\link.bak, 避免和MSVC 的link.exe抵触。
三、YASM
1. YASM下载地址:http://yasm.tortall.net/Download.html,下载其64位版本Win64 .exe (64 位 Windows 通用)。
2、下载后,将下载回来的yasm-1.3.0-win64.exe 改名为yaml.exe,并放置于 MSYS2 安装目录中。就是放置到c:\msys64\usr\bin\ 中。
四,ffmpeg
下载最新版本ffmpeg,本文是在2016.10.21下载,如果速度太慢,可以FQ后再执行:
进入windows命令行,在C:\FFMPEG目录下执行:
git clone git://source.ffmpeg.org/ffmpeg.git
四,编译ffmpeg
1、使用VC2015编辑C:\msys64\msys2_shell.cmd,将其中的:
rem set MSYS2_PATH_TYPE=inherit
“rem”注释删除掉,成为:
set MSYS2_PATH_TYPE=inherit
2、到开始菜单,执行“Visual Studio 2015-> VS2015 x64 本机工具命令提示符”,在命令窗口下,CD \msys64,执行:msys2_shell.cmd -mingw64
3、在启动的 MSYS2 终端中分别运行一下命令观察各便于工具组件是否被正确找到:
5、修改msys2窗口代码页为GBK,避免编译时显示乱码:
4、编译ffmpeg
在msys2窗口:
cd /
cd /ffmpeg
cd /ffmgeg
进入下载ffmpeg目录中
./configure --toolchain=msvc --arch=x86 --enable-yasm --enable-asm --enable-shared --disable-static
make
make install
这样以后,编译生产的执行文件ffmpeg.exe和DLL文件在目录C:\msys64\usr\local\bin中,开发头文件在C:\msys64\usr\local\include中。
最后记录一下问题:编译FFmpeg是为了解决解码实时流丢包的问题,想要修改缓冲区的大小,但是修改源码之后编译新的FFmpeg后依然丢包严重。
后来发现,FFmpeg留有修改缓冲区大小的接口,可以在代码中直接修改。
最近新提出了一个问题,解码的时候传入一个错误的rtsp流地址,会怎么样?结果测试发现会卡死在avformat_open_input里,一直不返回。
后来在网上查发现,avformat_open_input是阻塞的,但是可以设置超时,设置的方法:
av_dict_set(&dic, "stimeout", "2000000", 0);
注意!是stimeout,网上有些写的是timeout,不行的,写timeout,无论是传入正确的rtsp流地址还是错误的,都会返回无法连接的。改成stimeout就正确了。