当前位置:   article > 正文

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

ubuntu 硬解

在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
      1. cmake ../media-driver \
      2.     -DMEDIA_VERSION="2.0.0" \
      3.     -DBUILD_ALONG_WITH_CMRTLIB=1 \
      4.     -DBS_DIR_GMMLIB=`pwd`/../gmmlib/Source/GmmLib/ \
      5.     -DBS_DIR_COMMON=`pwd`/../gmmlib/Source/Common/ \
      6.     -DBS_DIR_INC=`pwd`/../gmmlib/Source/inc/ \
      7.     -DBS_DIR_MEDIA=`pwd`/../media-driver \
      8.     -DCMAKE_INSTALL_PREFIX=/opt/intel/media-driver \
      9.     -DCMAKE_INSTALL_LIBDIR=/opt/intel/media-driver/lib \
      10.     -DINSTALL_DRIVERS_SYSCONF=OFF \
      11.     -DLIBVA_DRIVERS_PATH=/opt/intel/media-driver/lib/dri
      12. make -j8
      13. 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

    1. mkdir build
    2. cd build
    3. make -j8 & sudo make install
    4. export LD_LIBRARY_PATH=/opt/intel/mediasdk/lib:$LD_LIBRARY_PATH
    5. export MFX_HOME=/opt/intel/mediasdk/lib/pkgconfig
    6. export PKG_CONFIG_PATH=/opt/intel/mediasdk/lib/pkgconfig:$PKG_CONFIG_PATH
    7. sudo ldconfig
    8. echo $LIBVA_DRIVER_NAME #应该输出 iHD
    9. echo $LIBVA_DRIVERS_PATH #应该输出 /opt/intel/media-driver/lib/dri
    10. echo $MFX_HOME #应该输出 /opt/intel/mediasdk/lib/pkgconfig
    11. echo $PKG_CONFIG_PATH #应该输出 "/opt/intel/mediasdk/lib/pkgconfig:/opt/intel/libva/lib/pkgconfig:"这部分内容。
    12. echo $LD_LIBRARY_PATH #输出的内容应该含有 "/opt/intel/mediasdk/lib:/opt/intel/libva/lib:"

  8. 编译 FFmpeg n4.3

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

    2. 修改 movenc.c

      1. static int mov_write_audio_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track)
      2. if (track->mode == MODE_MOV) {
      3. avio_wb16(pb, track->par->channels);
      4. if (track->par->codec_id == AV_CODEC_ID_PCM_U8 ||
      5. track->par->codec_id == AV_CODEC_ID_PCM_S8)
      6. avio_wb16(pb, 8); /* bits per sample */
      7. else if (track->par->codec_id == AV_CODEC_ID_ADPCM_G726)
      8. avio_wb16(pb, track->par->bits_per_coded_sample);
      9. else
      10. avio_wb16(pb, 16);
      11. avio_wb16(pb, track->audio_vbr ? -2 : 0); /* compression ID */
      12. } else { /* reserved for mp4/3gp */
      13. avio_wb16(pb, track->par->channels > 0 ?
      14. track->par->channels : 1);
      15. track->par->bits_per_coded_sample = av_get_bits_per_sample(track->par->codec_id);
      16. avio_wb16(pb, track->par->bits_per_coded_sample > 0 ?
      17. track->par->bits_per_coded_sample : 16);
      18. avio_wb16(pb, 0);
      19. }
      20. avio_wb16(pb, 0); /* packet size (= 0) */
      21. if (track->par->codec_id == AV_CODEC_ID_OPUS)
      22. avio_wb16(pb, 48000);
      23. else
      24. avio_wb16(pb, track->par->sample_rate <= UINT16_MAX ?
      25. track->par->sample_rate : 0);
      26. avio_wb16(pb, 0); /* Reserved */
      27. static unsigned int mov_find_codec_tag(AVFormatContext *s, MOVTrack *track)
      28. {
      29. int tag;
      30. if (track->mode == MODE_MP4 || track->mode == MODE_PSP)
      31. tag = track->par->codec_tag;
      32. else if (track->mode == MODE_ISM)
      33. tag = track->par->codec_tag;
      34. else if (track->mode == MODE_IPOD) {
      35. if (!av_match_ext(s->filename, "m4a") &&
      36. !av_match_ext(s->filename, "m4v") &&
      37. !av_match_ext(s->filename, "m4b"))
      38. av_log(s, AV_LOG_WARNING, "Warning, extension is not .m4a nor .m4v "
      39. "Quicktime/Ipod might not play the file\n");
      40. tag = track->par->codec_tag;
      41. } else if (track->mode & MODE_3GP)
      42. tag = track->par->codec_tag;
      43. else if (track->mode == MODE_F4V)
      44. tag = track->par->codec_tag;
      45. else
      46. tag = mov_get_codec_tag(s, track);
      47. if (tag == 0){
      48. tag = mov_get_codec_tag(s, track);
      49. }
      50. return tag;
      51. }

    3. 编译FFmpeg:

        1. ./configure --enable-shared \
        2. --disable-x86asm \
        3. --disable-lzma \
        4. --enable-pic \
        5. --extra-cflags=-fPIC \
        6. --extra-cxxflags=-fPIC \
        7. --enable-libmfx \
        8. --enable-nonfree \
        9. --enable-encoder=h264_qsv \
        10. --enable-decoder=h264_qsv \
        11. --enable-libfreetype \
        12. --enable-libfontconfig \
        13. --enable-libfribidi \
        14. --enable-encoder=pcm_alaw \
        15. --enable-decoder=pcm_alaw \
        16. --prefix=/opt/ffmpeg \
        17. --libdir=/opt/ffmpeg/lib \
        18. make -j8
        19. 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失败
  1.     [h264_qsv @ 0x55ef1dc72040] Low power mode is unsupported
  2.     [h264_qsv @ 0x55ef1dc72040] Current frame rate is unsupported
  3.     [h264_qsv @ 0x55ef1dc72040] Current picture structure is unsupported
  4.     [h264_qsv @ 0x55ef1dc72040] Current resolution is unsupported
  5.     [h264_qsv @ 0x55ef1dc72040] Current pixel format is unsupported
  6.     [h264_qsv @ 0x55ef1dc72040] some encoding parameters are not supported by the QSV runtime. Please double check the input parameters.
  7.     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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号