一沙一世界 一树一菩提
分类: LINUX
2020-07-02 10:54:53
参考链接地址:
1
2
再次感谢 我是小北挖哈哈,上述2链接地址就是小北的。建议先看小北的记录。
一 项目背景:
我们使用海思3559编码,通过ffmpeg走srt或rtmp推流到服务器,然后个人终端通过webrtc,vlc或ffplay来实时观看。整个流程分为大概五阶段:采集、编码、传输、解码、观看,所以如果要优化系统,主要也就集中在三个点上,编码端,解码端,中间网络阶段。其中中间网络端包括服务器部分,这部分也是重点,如果你用一台老旧的笔记本搭建服务器,不管你源和目的端用的多猛的引擎,都是白搭啊。但是不管哪里有问题,反映出来就是最终端播放延时大,花屏,马赛克等现象。我们的测试方案是这样的:把编码前的秒表网页作为视频采集源,最后通过某种播放工具播放,然后对比看两个时间差情况。而我就想看看软解码和硬解吗究竟有多大偏差,所以也就有了此文。今年疫情期间开始接触视频,感觉这水很深啊。目前在浅水处玩闹。老白一枚,有不正确的地方,大家多批评指正。
二 硬件环境:
Thinkpad x1c i7-7600u,intel 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:
这是原截图:$ 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
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使用率是不是小了很多啊。
总结:现在看起来,貌似整个过程很简单,其实在过程中,经历很多坑,把过程记录下来希望对有
同样需求的同学有帮助。可能其中会有一些描述不清楚或者有误的地方,大家看到,欢迎交流。
另外,再次感谢小北的文章。我看了很多次。