zoukankan      html  css  js  c++  java
  • 【视频开发】【CUDA开发】FFMPEG硬件加速-nvidia方案

    1.目标

    <1>显卡性能参数;
    <2>方案可行性;
    

    2.平台信息

    2.1.查看当前显卡信息

    命令: 
    lspci |grep VGA 
    信息: 
    01:00.0 VGA compatible controller: NVIDIA Corporation GK106 [GeForce GTX 645 OEM] (rev a1)

    解析: 
    GK106,是一个由英伟达公司制造的适配器图形处理和加速核心芯片。

    从NVIDIA支持的矩阵表中查找出GK106支持格式分别为: 
    NVDEC解码:MPEG-2 VC-1 H.264(AVCHD) 
    NVENC编码:H.264 (AVCHD) YUV 4:2:0

    3.NVIDIA

    3.1.NVIDIA参考资料

    3.2.NVIDIA性能参数

    从NVIDIA的video encode performance中查找到Quadro K4000:支持同时编码16路1920 X 1080 H.264 (AVCHD) YUV 4:2:0,支持高性能和高质量,以及低延时模式;

    注意:目前所有的NVIDIA都不支持 4:2:2编码 
    支持的编码格式总集:

    H.264 (AVCHD) YUV 4:2:0     
    H.264 (AVCHD) YUV 4:4:4     
    H.264 (AVCHD) Lossless  
    H.265 (HEVC) YUV 4:2:0  
    H.265 (HEVC) YUV 4:4:4  
    H.265 (HEVC) Lossless   
    H.265 (HEVC) 8k
    

    支持的解码格式总集:

    MPEG-2  
    VC-1            
    H.264(AVCHD)    
    H.265(HEVC)     
    VP8         
    VP9    
    

    3.3.NVIDIA显卡驱动

    驱动网站打开较慢,因此把我的驱动上传到个人云盘NVIDIA驱动,里面有产品支持列表

    3.3.1.删除旧驱动

    sudo apt-get purge nvidia*
    

    3.3.2.禁用自带nouveau nvidia驱动

    gedit /etc/modprobe.d/blacklist-nouveau.conf
    

    并在文件blacklist-nouveau.conf中添加以下内容:

    blacklist nouveau
    options nouveau modeset=0
    

    更新:

    update-initramfs -u
    

    修改后需要重启系统。确认下Nouveau是否已经被禁用,使用命令:

    lsmod | grep nouveau
    

    3.3.3.安装驱动

    重启系统,使用Ctrl+Alt+F1进入tty1控制台:

    service lightdm stop
    ./NVIDIA-Linux-x86_64-375.26.run
    service lightdm start
    
    3.3.4.其他
       ./NVIDIA-Linux-x86_64-375.26.run --update     安装时先下载最新驱动包
       ./NVIDIA-Linux-x86_64-375.26.run --uninstall  卸载驱动
    

    4.ffmpeg

    4.1.ffmpeg对NVIDIA GPU的支持

    • 支持h.264和hevc硬件加速编码; 支持h.264, hevc, VP9, VP8, MPEG2和MPEG4的硬件加速解码;
    • 可设置跟视频编码质量相关的参数,如:preset, rate等;
    • 可使用FFmpeg中的filters进行端对端1:n编码或1:n转码视频硬件加速通道;
    • 能添加自己编写的高性能CUDA filters;
    • 同时支持Windows和Linux support;

    此外, NVIDIA 也为GPU的视频处理任务提供的插件功能. 
    GPU Resize:将一个输入转换为多个分辨率并行输出; 
    GPU Zero-copy:使能GPU-accelerated插件就可以避免在处理视频时,系统和GPU内存间的数据拷贝;

    4.2.ffmpeg对NVIDIA GPU的支持步骤

    • 下载FFmpeg源码 (https://git.FFmpeg.org/FFmpeg.git) 下载NVIDIA的最新Video Codec SDK 将NVIDIA的头文件复制到ffmpeg的编译环境中;
    • 下载安装NVIDIA驱动(apt install nvidia-375)
    • 添加如下的configure命令(nv_sdk应包含cuda的库和头文件) :
    ./configure 
               --enable-nonfree 
               --disable-shared 
               --enable-nvenc 
               --enable-cuda 
               --enable-cuvid 
               --enable-libnpp 
               --extra-cflags=-Ilocal/include 
               --extra-cflags=-I../nv_sdk 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    注意:实际使用的是以下配置:

    #! /bin/bash
    bash configure 
        --enable-shared 
        --disable-static 
        --disable-yasm 
        --disable-doc 
        --enable-gpl 
        --enable-pthreads 
        --disable-w32threads 
        --disable-os2threads 
        --enable-debug  
        --enable-nvenc 
        --enable-cuda 
        --enable-cuvid 
        --extra-cflags="-Invidia_sdk -I/usr/local/cuda-8.0/include" 
        --extra-ldflags="-Lnvidia_sdk -L/usr/local/cuda-8.0/lib64" 
        --enable-nonfree 
        --enable-libfreetype 
        --enable-libfribidi 
        --enable-libfontconfig 
        --enable-libnpp 
        --enable-gpl
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    4.3. 查看nvidia硬件加速编解码器:

    ffmpeg -codecs | grep cuvid
    信息如下:
      DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_cuvid ) (encoders: h264_nvenc h264_vaapi nvenc nvenc_h264 )
      DEV.L. hevc  H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_cuvid ) (encoders: nvenc_hevc hevc_nvenc hevc_vaapi )
    
    ffmpeg -codecs | grep nvenc
      信息如下:
        DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_cuvid ) (encoders: h264_nvenc h264_vaapi nvenc nvenc_h264 )
        DEV.L. hevc H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_cuvid ) (encoders: nvenc_hevc hevc_nvenc hevc_vaapi )
        DEVIL. mjpeg Motion JPEG (decoders: mjpeg mjpeg_cuvid ) (encoders: mjpeg mjpeg_vaapi )
        DEV.L. mpeg1video MPEG-1 video (decoders: mpeg1video mpeg1_cuvid )
        DEV.L. mpeg2video MPEG-2 video (decoders: mpeg2video mpegvideo mpeg2_cuvid )
        DEV.L. mpeg4 MPEG-4 part 2 (decoders: mpeg4 mpeg4_cuvid )
        D.V.L. vc1 SMPTE VC-1 (decoders: vc1 vc1_cuvid )
        D.V.L. vp8 On2 VP8 (decoders: vp8 vp8_cuvid )
        D.V.L. vp9 Google VP9 (decoders: vp9 vp9_cuvid )
    

    5.结论

    • 最后成功进行了硬件加速转码,由于显卡是GeForce系列,因此只能验证一路:
    • 从结果来看,使用硬件加速确实释放了CPU资源,编码速度也有明显提高,但质量相比X264有稍微的不足;
    • 抛开编解码质量和速度的严格要求,nvidia需要图形专业级别的显卡支持,方能做出产品;

    6.后记

    在20170125时,再一次投入nvidia的开发

    7.工具

    vmstat -w -n 1 
    nvidia-bug-report.sh 
    nvidia-cuda-mps-server 
    nvidia-detector 
    nvidia-modprobe 
    nvidia-settings 可图形查看显卡使用情况 
    nvidia-uninstall 
    nvidia-cuda-mps-control 
    nvidia-debugdump 
    nvidia-installer 
    nvidia-smi 
    nvidia-xconfig

    8.问题list

    8.1.cannot load libcuda.so.1

    原因:该问题是由于我升级了nvidia(ubuntu版本)的驱动(由375.39升级到375.51)引起的 
    解决:卸载驱动,下载官方驱动375.39重新安装

    8.2.解码阻塞

    现象: 
    1.源丢包时,解码函数总是被阻塞,使用新的接口解决; 
    这里写图片描述

    8.3.结果

    采用M2000,最终极限并发能达到48路左右,但实际采用32路

  • 相关阅读:
    win7下jdk安装环境变量配置
    !function($){}(window.jQuery)
    转载几篇
    YeeLink
    坑爹JDK8,可怜的XP
    一致性Hash
    CSS
    仿函数
    launch4j
    GOAL!!!!!!!!!!!!!
  • 原文地址:https://www.cnblogs.com/huty/p/8517137.html
Copyright © 2011-2022 走看看