系统环境:
Ubuntu 16.04、kernel 4.4.0-62、gcc/g++5.4
前言:
最近在做一个关于家庭影院方面的项目;现在市面上的智能电视,大多都只能支持h264格式编码的视频文件(高清/2k);但是对于H265/Hevc格式(4K)视频文件却并不支持;所以,需要让现在的电视能够播放4K视频,只能将H265格式的视频转码为H264格式去播放;FFMpeg可以满足我们的需求,可以将H265格式文件转码为H264格式视频文件,用吉吉影音测试后,转码后的视频播放成功;但是使用FFMpeg转对CPU消耗非常大,转码时CPU是100%工作;所以现在需要让FFMpeg支持混合解或者纯硬解
如果你是独显(N卡),可以实现硬解
如果你是集显(intel 支持Quick Sync Video),可以实现混合解
我这里是一块Intel i3-4150 支持Quick Sync Video;
集成流程:
1、安装Intel Media SDK
2、给内核打补丁,编译安装打完补丁后的内核
3、安装ffmpeg
安装前:
1、进入IntelMediaSDK下载页面,需要账号登录才能下载
2、下载自己需要的版本,这里注意,下载的版本跟你自己的系统,CPU型号,CPU架构都有关,Intel的CPU主要支持酷睿系列3代及以上;还要注意下载的版本支持的CPU的架构;还要注意显卡的一些要求
比如像我的CPU架构为Haswell;建议下载完后,解压看看里面的PDF文档介绍
3、下载完成后解压文件,找到打补丁的压缩文件,因为我们要确定该版本支持的Linux内核(除Centos之外,其他版本都需要确定这点,不然到时候补丁是打不进去的)
1)、解压MediaServerStudioEssentials2015R5.tar.gz后进入
2)、解压SDK2015Production16.4.2.tar.gz后进入;进入后目录下有几个目录CentOS、Generic、SLES
你是什么版本的Linux就进入相应的目录,Generic是除CentOS和SLES之外的版本;这个目录下有两个PDF文档可以仔细看看,这里面有安装的详细步骤
3)、这里进入Generic,解压intel-linux-media-ocl_generic_16.4.2-36242_64bit.tar;会多出3个目录etc、usr、opt;进入opt/intel/mediasdk/opensource/patches/kmd/,看看下面的目录是什么,我这里是3.14.5;到这里已经明白了,该版本支持的是3.14.5内核
4)、查看Ubuntu各版本系统的内核版本,查询后得出Ubuntu14.04.1支持的是3.13.0-24;下载Ubuntu14.04.1ISO镜像,然后制作安装盘,将14.04.1系统安装在一个新的盘,分区设置与当前的16.04尽量一致
这里解释一下,为什么要安装一个新的14.04.1系统;因为当前系统16.04内核为4.4,我们使用源码编译安装内核时,升级内核版本没问题,但是当需要降级内核版本时,会有诸多问题,比如编译器等等,而且即使你编译安装成功后,还可能启动不成功,我测试过;因为要打补丁,必要要源码编译安装
一、安装Intel Media SDK
1、解压文件
tar -xvzf MediaServerStudio*.tar.gz
cd MediaServerStudio*/
tar -xvzf SDK2018*.tar.gz
cd SDK2018*/Generic/
tar -xvzf intel-linux-media-ocl_generic*.tar.gz
2、remove libva、libdrm in /usr
find /usr -name "libdrm*" | xargs rm -rf
find /usr -name "libva*" | xargs rm -rf
3、copy etc、usr and usr in system
/bin/cp -r etc/* /etc
/bin/cp -r opt/* /opt
/bin/cp -r usr/* /usr
4、install libxcb1-dev and libpciaccess-dev
apt-get build-dep libxcb1-dev libpciaccess-dev
apt-get install libxcb1-dev libpciaccess-dev
5、install libdrm
cd /opt/intel/mediasdk/opensource/libdrm/2.4.54-36242/
tar -jxvf libdrm-2.4.54.tar.bz2
cd libdrm-2.4.54/
./configure && make && make install
6、install libva
cd /opt/intel/mediasdk/opensource/libva/1.3.1-staging.20130628.36242
tar -jxvf libva-1.3.1.tar.bz2
cd libva-1.3.1/
./configure && make && make install
7、Set these environment variables in /etc/environment
LD_LIBRARY_PATH="/usr/local/lib:/usr/lib64"
LIBVA_DRIVER_NAME=iHD
LIBVA_DRIVERS_PATH=/opt/intel/mediasdk/lib64
and in ~/.bashrc
export LD_LIBRARY_PATH="/usr/local/lib:/usr/lib64"
export LIBVA_DRIVER_NAME=iHD
export LIBVA_DRIVERS_PATH=/opt/intel/mediasdk/lib64
source /etc/environment
source ~/.bashrc
8、test vainfo
ubuntu:$ vainfo |grep -v "unknow" libva info: VA-API version 0.35.0
libva info: va_getDriverName() returns 0
libva info: User requested driver 'iHD'
libva info: Trying to open /opt/intel/mediasdk/lib64/iHD_drv_video.so
libva info: Found init function __vaDriverInit_0_32
libva info: va_openDriver() returns 0
vainfo: VA-API version: 0.35 (libva 1.3.1)
vainfo: Driver version: 16.4.2.36242-ubit
vainfo: Supported profile and entrypoints
VAProfileNone : VAEntrypointVideoProc
VAProfileMPEG2Simple : VAEntrypointEncSlice
VAProfileMPEG2Simple : VAEntrypointVLD
VAProfileMPEG2Main : VAEntrypointEncSlice
VAProfileMPEG2Main : VAEntrypointVLD
VAProfileH264Baseline : VAEntrypointEncSlice
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSlice
VAProfileH264High : VAEntrypointVLD
VAProfileH264High : VAEntrypointEncSlice
VAProfileVC1Simple : VAEntrypointVLD
VAProfileVC1Main : VAEntrypointVLD
VAProfileVC1Advanced : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointEncPicture
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
VAProfileVP8Version0_3 : VAEntrypointEncSlice
VAProfileVP8Version0_3 : VAEntrypointVLD
这一步需要在ubuntu 16.04 和14.04.1执行
二、安装Kernel model driver,打补丁编译新的内核
因为编译内核跟底层硬件有一定的联系,所以在使用ubuntu 16.04 以及 14.04.1,需要两份系统的底层硬件最好相同
1、下载内核3.14.5
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v3.x/linux-3.14.5.tar.xz
tar -Jxvf linux-3.14.5.tar.xz
2、打补丁
cp /opt/intel/mediasdk/opensource/patches/kmd/3.14.5/intel-kernel-patchs.tar.bz2 .
cd linux-3.14.5/
for i in ../intel-kernel-patches/*.patch; do patch -p1 < $i; done
3、编译内核(使用deb方式)
make olddefconfig
make-kpkg --initrd --revision 02.25.dlrc --append-to-version -190225 kernel_image kernel_headers -j 4
4、编译完成以后,在linux-3.14.5上级目录中出现两个.deb文件,安装新的内核以及头文件
dpkg -i *.deb
这一步只需要在14.04.1系统中执行,在安装第4步执行完成以后,会在boot下生成一个新的内核文件;重启14.04.1系统,选择新的内核进入系统;如果成功进入系统,将两个.deb文件移动到移动到ubuntu16.04中,执行安装dpkg -i *.deb;安装完成以后重启16.04系统选择新3.14.5内核进入系统
注意在14.04.1系统中,因为要编译内核源码,除系统外需要至少10G以上的空间
三、安装ffmpeg
1、下载ffmpeg 3.2.13
wget http://www.ffmpeg.org/releases/ffmpeg-3.2.13.tar.gz
tar -zxvf ffmpeg-3.2.13.tar.gz
2、创建mfx头文件
mkdir /opt/intel/mediasdk/include/mfx
mv /opt/intel/mediasdk/include/* /opt/intel/mediasdk/include/mfx
3、创建libmfx.pc
mkdir -p /opt/intel/mediasdk/lib64/pkgconfig
vim /opt/intel/mediasdk/lib64/pkgconfig/libmfx.pc
libmfx.pc文件内容如下:
prefix=/opt/intel/mediasdk
exec_prefix=${prefix}
libdir=${prefix}/lib/lin_x64
includedir=${prefix}/include
Name: libmfx
Description: Intel Media Server Studio SDK
Version: 16.4.2
Libs: -L${libdir} -lmfx -lva -lstdc++ -ldl -lva-drm -ldrm
Cflags: -I${includedir} -I/usr/include/libdrm
4、设置libmfx.pc软连接,并设置PKG_CONFIG_PATH环境变量
cd /usr/lib64/pkgconfig
export PKG_CONFIG_PATH=/usr/lib64/pkgconfig
ln -s /opt/intel/mediasdk/lib64/pkgconfig/libmfx.pc libmfx.pc
5、安装libx264
apt-get install libx264-dev
6、安装编译ffmpeg
./configure --libdir=/usr/lib64 --enable-nonfree --disable-static --enable-shared --enable-opencl --enable-libmfx --enable-memalign-hack --enable-gpl --disable-libfdk-aac --enable-libx264 --extra-cflags=-I/opt/intel/opencl/include --extra-ldflags=-L/opt/intel/opencl --disable-yasm
make -j 4
make install
7、测试输出ffmpeg支持的解码模式
8、找hevc资源 用ffmpeg命令解码测试
ffmpeg -i input.mkv -vcodec h264_qsv output.mp4
如果执行以上命令有输出 证明安装成功
这一步在16.04上执行即可