Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1706054
  • 博文数量: 98
  • 博客积分: 667
  • 博客等级: 上士
  • 技术积分: 1631
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-27 15:59
个人简介

一沙一世界 一树一菩提

文章分类

全部博文(98)

文章存档

2021年(8)

2020年(16)

2019年(8)

2017年(1)

2016年(11)

2015年(17)

2014年(9)

2013年(4)

2012年(19)

2011年(1)

2009年(4)

分类: LINUX

2020-07-02 10:54:53

参考链接地址:

再次感谢 我是小北挖哈哈,上述2链接地址就是小北的。建议先看小北的记录。

一 项目背景:
    我们使用海思3559编码,通过ffmpegsrtrtmp推流到服务器,然后个人终端通过webrtcvlcffplay来实时观看。整个流程分为大概五阶段:采集、编码、传输、解码、观看,所以如果要优化系统,主要也就集中在三个点上,编码端,解码端,中间网络阶段。其中中间网络端包括服务器部分,这部分也是重点,如果你用一台老旧的笔记本搭建服务器,不管你源和目的端用的多猛的引擎,都是白搭啊。但是不管哪里有问题,反映出来就是最终端播放延时大,花屏,马赛克等现象。我们的测试方案是这样的:把编码前的秒表网页作为视频采集源,最后通过某种播放工具播放,然后对比看两个时间差情况。而我就想看看软解码和硬解吗究竟有多大偏差,所以也就有了此文。今年疫情期间开始接触视频,感觉这水很深啊。目前在浅水处玩闹。老白一枚,有不正确的地方,大家多批评指正。

二 硬件环境:

Thinkpad x1c i7-7600uintel HD Graphics 620,ubuntu-160406,linux版本4.15.0-106,具体如下图。


三 环境版本信息
    如同小北说的一样:必须大Kernel 4.14.16及以上,gcc版本>=4.9,camke版本>=3.6,这两个条件只要你的环境是buntu160406,问题不大,我的kernel版本是4.15,cmake版本是3.11,gcc版本是5.4.0。如果你的基本环境达不到要求,该安装gcc就安装gcc,该安装cmake就安装cnmake,具体baidu或者google。一般情况只要你的ubuntu是160406,上面的都不是事。

四 安装软件版本信息

· Media SDK and Samples: 

· 

· Driver: 

· Gmmlib: 

· libva: 

· libva-utils: 

这是原截图:

ffmpeg我使用的是ffmpeg-4.3。
下面我会打包上传。下面是3个包,还有3个,不知道是因为大还是其他原因,老是失败。我先附上链接地址,后面我回再上传,实在不行的话,大家就从链接地址下载。
intel-media-20.1.1下载地址:
intel-mediasdk-20.1.1下载地址
ffmpeg4.3下载地址:。
下载ffmpeg,需要checkout到4.3版本,否则等到最后运行ffplay的时候会出现mfx返回错误值。
libva-2.zip,  libva-utils-2.zip, gmmlib-intel-gmmlib-20.zip,
五 流程:
A 安装依赖,我的环境基本不用安装依赖,不知道啥时候全都已经安装了。这里我没有经历过,所以完全参考小北的记录,总之就是缺什么安装什么,都是直接apt-get install即可。
$ sudo apt-get install -y git             # 使用git需要
$ sudo apt-get install -y make            # make编译源码很多地方需要
$ sudo apt-get install -y dh-autoreconf   # autogen编译源码时需要
$ sudo apt-get install pkg-config         # 编译libva时需要
$ apt-get install -y libncurses5-dev libpthread-stubs0-dev \
  libpciaccess-dev libxvmc-dev xutils-dev libsdl2-dev      \
  libxcb-shm0-dev
在我的安装过程当中,各软件包都是下载的固定版本包,没有使用git。
B安装libva:这里基本都是按照小北的操作流程来即可。注意,在下面所有的操作过程当中,最好不要更换终端,否则你就的重新设置环境参数。
B.1 解压libva-2.zip,得到libva-2.7.1目录,进入libva-2.7.1,依次执行下面命令:
$ ./autogen.sh --prefix=/opt/intel/libva --libdir=/opt/intel/libva/lib
$ make
$ sudo make install
export PKG_CONFIG_PATH 这一命令,如果你什么都做了,还是找不到相关库,那好好检查下
你是否书写正确。 export PKG_CONFIG_PATH=/opt/intel/libva/lib/pkgconfig
export LD_LIBRARY_PATH=/opt/intel/libva/lib:$LD_LIBRARY_PATH
sudo ldconfig

B.2 解压libva-utils-2.zip,得到libva-utils-2.7.1目录,进入libva-utils-2.7.1,
依次执行下面命令:
$ ./autogen.sh --prefix=/opt/intel/libva-utils \
   --libdir=/opt/intel/libva-utils/lib
$  make
$  sudo make install 
这是第一步,这一步如果你输入命令不出错,基本不会出问题。唯一可能的就是需要
安装pkg-config,或者在上一步没有执行设置命令。
 B.3  安装media-driver
这里其实编译安装的是两个包,分别是gmmlib-intel-gmmlib-20.1.1.zip和
media-driver-intel-media-20.1.1.zip。把这两个压缩包解压到一个空文件夹下,
比如在/home/xxxx/codes/目录下新建一个目录gmmlib-mediadriver。把2个压缩包拷贝到 /home/xxxx/codes/gmmlib-mediadriver目录下,解压,
然后在/home/xxxx/codex/gmmlib-mediadriver/目录下新建一个build的目录。
为了一会输入方便,我把解压后的intel-gmmlib-20.1.1目录修改为gmmlib,
把media-driver-intel-media-20.1.1目录改为media-driver。
然后进入build目录,依次执行下面命令:
$ cmake ../media-driver -DBUILD_ALONG_WITH_CMRTLIB=1 \
-DBS_DIR_GMMLIB=$(pwd)/../gmmlib/Source/GmmLib/  \
-DBS_DIR_COMMON=$(pwd)/../gmmlib/Source/Common/  \
-DBS_DIR_INC=$(pwd)/../gmmlib/Source/inc/  \
-DBS_DIR_MEDIA=$(pwd)/../media-driver \
-DCMAKE_INSTALL_PREFIX=/opt/intel/media-driver \
-DCMAKE_INSTALL_LIBDIR=/opt/intel/media-driver/lib \
-DINSTALL_DRIVERS_SYSCONF=OFF \
-DLIBVA_DRIVERS_PATH=/opt/intel/media-driver/lib/dri

$ make
$ sudo make install
$ export LIBVA_DRIVER_NAME=iHD
$ export LIBVA_DRIVERS_PATH=/opt/intel/media-driver/lib/dri
在我的环境下,只要设置了export PKG_CONFIG_PATH这一环境参数,基本上没有什么问题。
当然如果你拼写错了,谁也帮不了你。最后看看你安装的driver对不对:
$ cd /opt/intel/libva-utils/bin;
$ ./vainfo.
如果输出和小北记录的差不多就没有问题。
我的输出如下:
lf@lf-ThinkPad-X1-Carbon:/opt/intel/libva-utils/bin$ ./vainfo
libva info: VA-API version 1.7.0
libva info: User environment variable requested driver 'iHD'
libva info: Trying to open /opt/intel/media-driver/lib/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_7
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.7 (libva 2.7.1)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 20.1.1 ()
vainfo: Supported profile and entrypoints
      VAProfileNone                   :    VAEntrypointVideoProc
      VAProfileNone                   :    VAEntrypointStats
      VAProfileMPEG2Simple            :    VAEntrypointVLD
      VAProfileMPEG2Simple            :    VAEntrypointEncSlice
      VAProfileMPEG2Main              :    VAEntrypointVLD
      VAProfileMPEG2Main              :    VAEntrypointEncSlice
      VAProfileH264Main               :    VAEntrypointVLD
      VAProfileH264Main               :    VAEntrypointEncSlice
      VAProfileH264Main               :    VAEntrypointFEI
      VAProfileH264Main               :    VAEntrypointEncSliceLP
      VAProfileH264High               :    VAEntrypointVLD
      VAProfileH264High               :    VAEntrypointEncSlice
      VAProfileH264High               :    VAEntrypointFEI
      VAProfileH264High               :    VAEntrypointEncSliceLP
      VAProfileVC1Simple              :    VAEntrypointVLD
      VAProfileVC1Main                :    VAEntrypointVLD
      VAProfileVC1Advanced            :    VAEntrypointVLD
      VAProfileJPEGBaseline           :    VAEntrypointVLD
      VAProfileJPEGBaseline           :    VAEntrypointEncPicture
      VAProfileH264ConstrainedBaseline:    VAEntrypointVLD
      VAProfileH264ConstrainedBaseline:    VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline:    VAEntrypointFEI
      VAProfileH264ConstrainedBaseline:    VAEntrypointEncSliceLP
      VAProfileVP8Version0_3          :    VAEntrypointVLD
      VAProfileVP8Version0_3          :    VAEntrypointEncSlice
      VAProfileHEVCMain               :    VAEntrypointVLD
      VAProfileHEVCMain               :    VAEntrypointEncSlice
      VAProfileHEVCMain               :    VAEntrypointFEI
      VAProfileHEVCMain10             :    VAEntrypointVLD
      VAProfileHEVCMain10             :    VAEntrypointEncSlice
      VAProfileVP9Profile0            :    VAEntrypointVLD
      VAProfileVP9Profile2            :    VAEntrypointVLD

如果有问题,可以ldd vainfo,看看和libva相关的库究竟是链接的是
/usr/lib/x86_64-linux-gnu目录下的同名库,还是在/opt/intel目录下的库的,
/opt/intel/libva/lib下的库是你应该链接的库,如果连接的是系统的,运行vainfo可能
没有问题,但是等你最后运行ffmpeg的时候会出现问题。提示你格式不对,返回错误。原因就是
你没有按顺序设置几个环境变量。
B.4 安装intel media SDK
解压 MediaSDK-intel-mediasdk-20.1.1.zip,
得到MediaSDK-intel-mediasdk-20.1.1目录,进入这个目录,
$ mkdir build, #新建build目录
$ cd build, #进入build目录。
$ cmake .. #注意,cmake后面有一个空格
$ make
$ sudo make install
$ export LD_LIBRARY_PATH=/opt/intel/mediasdk/lib:$LD_LIBRARY_PATH
$ export MFX_HOME=/opt/intel/mediasdk/lib/pkgconfig $ export PKG_CONFIG_PATH=/opt/intel/mediasdk/lib/pkgconfig:$PKG_CONFIG_PATH
$ sudo ldconfig
如果你前面按部就班的做,这里应该也不会出问题 。这个时候最好看看你前面设置的几个环境
变量值究竟是不是你想要设置的值。依次:
$ echo $LIBVA_DRIVER_NAME #应该输出iHD
$ echo $LIBVA_DRIVERS_PATH #应该输出/opt/intel/media-driver/lib/dri
$ echo $MFX_HOME #应该输出/opt/intel/mediasdk/lib/pkgconfig
$ echo $PKG_CONFIG_PATH #应该输出
"/opt/intel/mediasdk/lib/pkgconfig:/opt/intel/libva/lib/pkgconfig:"这部分内容。
$ echo $LD_LIBRARY_PATH #输出的内容应该含有
"/opt/intel/mediasdk/lib:/opt/intel/libva/lib:"这部分内容,
表示没问题。当然除了上面你添加的两个库链接地址,还有你系统链接库。只要包含上面内容
就没问题。
在小北的过程当中,安装完sdk以后,运行sample可以检测。我没有进行,直接进入下一步。

B.5 编译安装ffmpeg
我的系统一些和ffmpeg相关的依赖都没有报错,可能以前安装过相关的包。github下载,
checkout到4.3版本。
$ ./configure --enable-shared \              --disable-x86asm \              --disable-lzma \              --enable-pic \              --extra-cflags=-fPIC \              --extra-cxxflags=-fPIC \              --enable-libmfx \              --enable-nonfree \              --enable-encoder=h264_qsv \              --enable-decoder=h264_qsv \              --prefix=/opt/ffmpeg \              --libdir=/opt/ffmpeg/lib \         $ make $ sudo make install
$ export LD_LIBRARY_PATH=/opt/ffmpeg/lib:$LD_LIBRARY_PATH
$ sudo ldconfig
这样,你的ffmpeg就安装/opt/ffmpeg目录了。
$ cd /opt/ffmpeg/bin
$ ./ffmpeg -vcodecs | grep qsv
看下有输出内容带红字的部分。有的话说明你已经使能了对应硬件加速部分。
如果你的bin目录下没有ffplay,那是因为你没有安装sdl,
这里
下载,我下的是2.2版本,解压,进入目录,执行:
$ ./configure
$ make
$ sudo make install
如果还有其他问题,直接baidu吧,挺容易搞定。
下面我们播放一个mp4文件,试试看。
$ ./ffplay -vcodec h264_qsv -i test.mp4
然后打开另外一个终端,top看看cpu使用率是不是小了很多啊。

总结:现在看起来,貌似整个过程很简单,其实在过程中,经历很多坑,把过程记录下来希望对有
同样需求的同学有帮助。可能其中会有一些描述不清楚或者有误的地方,大家看到,欢迎交流。
另外,再次感谢小北的文章。我看了很多次。
 


 


 


 
 




阅读(2761) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~