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")