Ubuntu集成FFMpeg 硬件加速解码

系统环境:

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;

Ubuntu集成FFMpeg 硬件加速解码_第1张图片

集成流程:

1、安装Intel Media SDK

2、给内核打补丁,编译安装打完补丁后的内核

3、安装ffmpeg

安装前:

1、进入IntelMediaSDK下载页面,需要账号登录才能下载

2、下载自己需要的版本,这里注意,下载的版本跟你自己的系统,CPU型号,CPU架构都有关,Intel的CPU主要支持酷睿系列3代及以上;还要注意下载的版本支持的CPU的架构;还要注意显卡的一些要求

比如像我的CPU架构为Haswell;建议下载完后,解压看看里面的PDF文档介绍

Ubuntu集成FFMpeg 硬件加速解码_第2张图片

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支持的解码模式

Ubuntu集成FFMpeg 硬件加速解码_第3张图片

8、找hevc资源 用ffmpeg命令解码测试

ffmpeg -i input.mkv -vcodec h264_qsv output.mp4

 如果执行以上命令有输出 证明安装成功

这一步在16.04上执行即可

你可能感兴趣的:(Linux,FFMpeg,FFMpeg,硬件加速,Intel,CPU硬件加速)