Ubuntu+Mingw64编译WIN32版本的FFMPEG

Ubuntu+Mingw64编译WIN32版本的FFMPEG

FFMPEG编译裁剪Win32版本库文件

1.准备环境Ubuntu,mingw-w64

1.1系统准备

        升级Ubuntu的系统到17.04以上,因为Ubuntu的16.x版本以及更低的版本在安装mingw-w64版本的时候只能安装4.x的版本,这个版本由于没有及时更新D3D11以及DXVA2的HEVC支持,导致最终硬件解码只有H264的DXVA2方式能够正常开启,而HEVC的DXVA2硬解以及D3D11VA方式的硬解都无法开启。

        尝试了如下解决方式:
1.在低版本的Ubuntu(16.04)上面安装高版本的mingw-w64
sudo apt-cache madison openssh-client   //查询所有安装包版本
sudo apt-get install openssh-client=1:6.6p1-2ubuntu1  //安装指定版本
2.下载mingw-w64,编译安装,但是由于各种编译错误,暂时未完全尝试这种方式

1.2mingw-w64的安装

1.mingw32和mingw-w64区别
mingw32是32位编译器,并且只能编译32位程序,mingw-w64是64位编译器,可以支持编译32位和64位程序,并且mingw32版本比较老,更新不是很及时,因此推荐安装mingw-w64。
apt-get install mingw-w64    //安装mingw-w64

mingw-w64和Ubuntu版本对应关系.
Ubuntu 15.x     mingw-w64  3.x
Ubuntu 16.x     mingw-w64  4.x
Ubuntu 17.x     mingw-w64  5.x

只有mingw-w64  5.x才能完全开启硬解功能,所以需要Ubuntu版本保证17.x

      注意:在进行configure的时候,可以开启configure的日志功能,具体查看为什么某个功能没有开启,具体error打印信息以及原因,从而能够较为快速的定位问题,之前HEVC的DXVA2硬解以及D3D11VA的硬解无法开启,一直查不出原因,打开日志之后,发现mingw-w64的DXVA2的头文件没有定义HEVC的相关接口和结构体,最后发现是mingw-w64的版本问题。


2.Ubuntu上使用mingw-w64编译FFMPEG

1.FFMPEG必须是稳定版本,Master版本包含了许多debug以及新的功能,会导致库文件很大并且会在VS上面使用时报错。

2.具体的编译脚本

32位版本静态库的编译:

#!/bin/sh
 LDFLAGS="-static-libgcc" ./configure \
--enable-gpl \
--enable-version3 \
--enable-runtime-cpudetect \
--target-os=mingw32 \
--arch=x86 \
--prefix=../ffmpeg_340_bin \
--cross-prefix=i686-w64-mingw32- \
--extra-cflags="-l../ffmpeg_340_bin/include" \
--extra-ldflags="-L../ffmpeg_340_bin/lib" \
--disable-doc \
--disable-htmlpages\
--disable-manpages\
--disable-podpages\
--disable-txtpages\
--disable-debug \
--disable-everything\
--enable-decoder=mjpeg\
--enable-decoder=h264 \
--enable-hwaccel=h264_dxva2\
--enable-hwaccel=h264_d3d11va\
--enable-hwaccel=h264_d3d11va2\
--enable-decoder=hevc\
--enable-hwaccel=hevc_dxva2\
--enable-hwaccel=hevc_d3d11va\
--enable-hwaccel=hevc_d3d11va2\
--enable-decoder=aac\
--enable-decoder=aac_latm\
--enable-decoder=pcm_alaw\
--enable-decoder=pcm_mulaw\
--disable-nvenc\
--disable-programs\
--disable-avdevice\
--disable-avformat\
--disable-swresample\
--disable-swscale\
--disable-postproc\
--disable-avfilter\
--disable-network\
--disable-dct\
--disable-mdct\
--disable-rdft\
--disable-fft\
--disable-logging\
--disable-videotoolbox\
--disable-zlib\
--disable-xlib\
--disable-sdl2 \
--disable-schannel\
--disable-bzlib\

make clean;
make -j4
make install


64位版本静态库的编译:

#!/bin/sh
 LDFLAGS="-static-libgcc" ./configure \
--enable-gpl \
--enable-version3 \
--enable-runtime-cpudetect \
--target-os=mingw32-w64 \
--arch=x86_64 \
--prefix=../ffmpeg_340_bin \
--cross-prefix=x86_64-w64-mingw32- \
--extra-cflags="-l../ffmpeg_340_bin/include" \
--extra-ldflags="-L../ffmpeg_340_bin/lib" \
--disable-doc \
--disable-htmlpages\
--disable-manpages\
--disable-podpages\
--disable-txtpages\
--disable-debug \
--disable-everything\
--enable-decoder=mjpeg\
--enable-decoder=h264 \
--enable-hwaccel=h264_dxva2\
--enable-hwaccel=h264_d3d11va\
--enable-hwaccel=h264_d3d11va2\
--enable-decoder=hevc\
--enable-hwaccel=hevc_dxva2\
--enable-hwaccel=hevc_d3d11va\
--enable-hwaccel=hevc_d3d11va2\
--enable-decoder=aac\
--enable-decoder=aac_latm\
--enable-decoder=pcm_alaw\
--enable-decoder=pcm_mulaw\
--disable-nvenc\
--disable-programs\
--disable-avdevice\
--disable-avformat\
--disable-swresample\
--disable-swscale\
--disable-postproc\
--disable-avfilter\
--disable-network\
--disable-dct\
--disable-mdct\
--disable-rdft\
--disable-fft\
--disable-logging\
--disable-videotoolbox\
--disable-zlib\
--disable-xlib\
--disable-sdl2 \
--disable-schannel\

--disable-bzlib\

make clean;
make -j4
make install

注意32位版本和64位版本主要差别在于以下字段:
--target-os=mingw32-w64  
--arch=x86_64  
--cross-prefix=x86_64-w64-mingw32- 
减小库文件的大小以下字段较为重要:
--disable-debug 
--disable-everything

3.VS2008和VS2015上使用FFMPEG库文件
VS2008和VS2015上面使用FFMPEG需要注意以下事项:


1.头文件上面包含要加extern “C”
extern "C"
{
#include "libavcodec\\avcodec.h"
}
不然会提示符号找不到


2.生成的库文件名字是.a文件,所以直接引入静态库
#pragma comment(lib, "libavutil.a") 
#pragma comment(lib, "libavcodec.a") 


3.除此之外由于静态库有部分mingw的依赖库文件没有导入需要额外引入
主要需要以下库文件


#pragma comment(lib, "libgcc.a") 
#pragma comment(lib, "libmingw32.a") 
#pragma comment(lib, "libmingwex.a") 
并且32版本和64位版本的库文件不一样,需要从ubuntu上面拷贝出来,具体路径:


32版本路径:
./usr/lib/gcc/i686-w64-mingw32/6.3-win32/libgcc.a
./usr/i686-w64-mingw32/lib/libmingwex.a
./usr/i686-w64-mingw32/lib/libmingw32.a


64位版本路径
./usr/x86_64-w64-mingw32/lib/libmingwex.a
./usr/x86_64-w64-mingw32/lib/libmingw32.a
./usr/lib/gcc/x86_64-w64-mingw32/6.3-win32/libgcc.a


如果路径不一样,请自行使用find命令查找库文件

4.调节VS的MDD和MTD模式,由于在MTD模式下报错,需要额外引入VC调试库
#pragma comment(lib, "msvcrt.lib") 
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值