Ubuntu18.04 编译FFmpeg 支持 QSV 硬编解码

在Linux下,由于FFmpeg软解码CPU占用过高,所以打算使用h264_qsv硬解码,本文并非原创,主要参考以下文章,在此记录下编译过程,以便日后使用。

参考文章:

编译过程: 

  1. 下载MediaSDK 20.1.1 相关依赖库  Release Media SDK 20.1.1 · Intel-Media-SDK/MediaSDK · GitHub
    1.  
  2. 安装 libva 
    1. ./autogen.sh --prefix=/opt/intel/libva --libdir=/opt/intel/libva/lib
    2. make -j8 & sudo make install
    3. export PKG_CONFIG_PATH=/opt/intel/libva/lib/pkgconfig
    4. export LD_LIBRARY_PATH=/opt/intel/libva/lib:$LD_LIBRARY_PATH
    5. sudo ldconfig
  3. 安装libva-util
    1. ./autogen.sh --prefix=/opt/intel/libva-utils  --libdir=/opt/intel/libva-utils/lib
    2. make -j8 & sudo make install
  4. 安装media-driver
    1. 分别解压 gmmlib-intel-gmmlib-20.1.1.zip和 media-driver-intel-media-20.1.1.zip
    2. cd gmmlib-intel-gmmlib-20.1.1.zip
    3. mkdir build & cd build
    4. cmake .. & make -j8 & sudo make install
    5. 创建gmmlib-mediadriver目录
    6. cd gmmlib-mediadriver
    7. cmake ../media-driver \
          -DMEDIA_VERSION="2.0.0" \
          -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 -j8
      sudo make install

      8. 

  5. 配置环境变量

    1. export LIBVA_DRIVER_NAME=iHD

    2. export LIBVA_DRIVERS_PATH=/opt/intel/media-driver/lib/dri

  6. 验证

    1. cd /opt/intel/libva-utils/bin

    2. ./vainfo

  7. 安装intel media SDK

    mkdir build
    
    cd build
    
    make -j8 & 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:"

  8. 编译 FFmpeg n4.3

    1. 修改libavformat/movenc.c 支持G711

    2. 修改 movenc.c

    3.  static int mov_write_audio_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track)
      
          if (track->mode == MODE_MOV) {
                  avio_wb16(pb, track->par->channels);
                  if (track->par->codec_id == AV_CODEC_ID_PCM_U8 ||
                      track->par->codec_id == AV_CODEC_ID_PCM_S8)
                      avio_wb16(pb, 8); /* bits per sample */
                  else if (track->par->codec_id == AV_CODEC_ID_ADPCM_G726)
                      avio_wb16(pb, track->par->bits_per_coded_sample);
                  else
                      avio_wb16(pb, 16);
                  avio_wb16(pb, track->audio_vbr ? -2 : 0); /* compression ID */
              } else { /* reserved for mp4/3gp */
                  avio_wb16(pb, track->par->channels > 0 ?
                                track->par->channels : 1);
                  track->par->bits_per_coded_sample = av_get_bits_per_sample(track->par->codec_id);
                  avio_wb16(pb, track->par->bits_per_coded_sample > 0 ?
                                track->par->bits_per_coded_sample : 16);
                  avio_wb16(pb, 0);
              }
      
      
            avio_wb16(pb, 0); /* packet size (= 0) */
              if (track->par->codec_id == AV_CODEC_ID_OPUS)
                  avio_wb16(pb, 48000);
              else
                  avio_wb16(pb, track->par->sample_rate <= UINT16_MAX ?
                                track->par->sample_rate : 0);
              avio_wb16(pb, 0); /* Reserved */
      
      
      static unsigned int mov_find_codec_tag(AVFormatContext *s, MOVTrack *track)
      {
          int tag;
      
      
          if (track->mode == MODE_MP4 || track->mode == MODE_PSP)
              tag = track->par->codec_tag;
          else if (track->mode == MODE_ISM)
              tag = track->par->codec_tag;
          else if (track->mode == MODE_IPOD) {
              if (!av_match_ext(s->filename, "m4a") &&
                  !av_match_ext(s->filename, "m4v") &&
                  !av_match_ext(s->filename, "m4b"))
                  av_log(s, AV_LOG_WARNING, "Warning, extension is not .m4a nor .m4v "
                         "Quicktime/Ipod might not play the file\n");
              tag = track->par->codec_tag;
          } else if (track->mode & MODE_3GP)
              tag = track->par->codec_tag;
          else if (track->mode == MODE_F4V)
              tag = track->par->codec_tag;
          else
              tag = mov_get_codec_tag(s, track);
      
      
          if (tag == 0){
              tag = mov_get_codec_tag(s, track);
          }
      
      
          return tag;
      }

    4. 编译FFmpeg:

      1. ./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 \
                      --enable-libfreetype \
                      --enable-libfontconfig \
                      --enable-libfribidi \
                      --enable-encoder=pcm_alaw \
                      --enable-decoder=pcm_alaw \
                      --prefix=/opt/ffmpeg \
                      --libdir=/opt/ffmpeg/lib \
        
        make -j8
        sudo make install

  9. 测试

    1. ./ffplay -vcodec h264_qsv -i test.mp4

    2. ./ffmpeg -y -i 1.mp4 -pix_fmt nv12 -c:v h264_qsv -profile:v baseline -preset fast -b:v 4000k -an test_output.mp4

参考:

  1. ubuntu1604 i7-7600u安装ffmpeg intel qsv环境-shiyigudong-ChinaUnix博客
  2. 视频和视频帧:FFMPEG+Intel QSV硬解的环境安装篇 - 知乎

注:

  1. 编译所有流程最好在一个进程中进行
  2. LIBVA_DRIVER_NAME和LIBVA_DRIVER_PATH, 可配置系统环境 etc/environment
  3. MediaSDK 20.1.1 亲测 FFmpeg n4.3 h264_qsv成功 ,FFmpeg n4.1h264_qsv失败
    [h264_qsv @ 0x55ef1dc72040] Low power mode is unsupported
    [h264_qsv @ 0x55ef1dc72040] Current frame rate is unsupported
    [h264_qsv @ 0x55ef1dc72040] Current picture structure is unsupported
    [h264_qsv @ 0x55ef1dc72040] Current resolution is unsupported
    [h264_qsv @ 0x55ef1dc72040] Current pixel format is unsupported
    [h264_qsv @ 0x55ef1dc72040] some encoding parameters are not supported by the QSV runtime. Please double check the input parameters.
    Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height

END

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Ubuntu 18.04上安装ffmpeg,你可以按照以下步骤进行操作: 1. 首先,确保你已经安装了必要的编译工具和依赖项。你可以使用以下命令安装它们: ```shell sudo apt-get update sudo apt-get install build-essential ``` 2. 下载ffmpeg的源代码。你可以在官方网站或者其他可信的资源中找到最新版本的源代码。 3. 解压下载的源代码文件。你可以使用以下命令进入解压后的文件夹: ```shell cd ffmpeg-<version> ``` 4. 配置和编译ffmpeg。你可以按照以下命令依次执行: ```shell ./configure make sudo make install ``` 5. 安装完成后,你可以通过以下命令检查ffmpeg是否成功安装: ```shell ffmpeg -version ``` 如果你想卸载或重新安装ffmpeg,你可以按照以下步骤进行操作: 卸载ffmpeg: 1. 删除相关的软链接: ```shell sudo rm /usr/bin/ffmpeg sudo rm /usr/bin/ffprobe ``` 2. 清空环境变量中修改的地方并更新: ```shell sudo ldconfig ``` 重新安装ffmpeg: 1. 如果你需要更新、回退或增加库支持,你可以按照以下步骤进行操作: - 删除ffbuild目录下带"config"字段的文件:`rm ffmpeg-<version>/ffbuild/config` - 删除相关的软链接: ```shell sudo rm /usr/bin/ffmpeg sudo rm /usr/bin/ffprobe ``` - 重新编译和安装ffmpeg: ```shell cd ffmpeg-<version> ./configure make sudo make install ``` - 配置ffmpeg依赖环境并更新环境变量: ```shell sudo nano /etc/ld.so.conf ``` 在打开的文件中添加ffmpeg所在的目录,保存并关闭文件。然后运行以下命令更新环境变量: ```shell sudo ldconfig ``` 通过以上步骤,你可以在Ubuntu 18.04上安装、卸载或重新安装ffmpeg。请根据你的需求选择相应的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Ubuntu 18.04 安装FFmpeg](https://blog.csdn.net/weixin_43804210/article/details/108198399)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Ubuntu 18.04 安装ffmpeg支持GPU件加速)](https://blog.csdn.net/txf1931783593/article/details/128250457)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值