【问题标题】:Using hardware acceleration with libavcodec通过 libavcodec 使用硬件加速
【发布时间】:2014-11-05 15:43:10
【问题描述】:

我下载了一个软件 (info-beamer),我想使用 GPU 加速来解码 H.264 视频。我知道我的平台能够使用 GPU 解码 H.264 视频。我使用以下命令对 gstreamer 进行了一些测试,视频播放流畅,没有过多的 CPU 使用:

gst-launch-1.0 filesrc location=./Sintel.mp4 ! qtdemux ! vaapidecode ! vaapisink

但是当我使用 info-beamer 播放相同的视频时,会使用 100% 的 CPU。我认为 libavcodec 如果可用的话会自动使用 VAAPI ...我应该使用另一个库吗?我做错了什么?

我的平台正在运行带有 Intel HD 的 Atom E3826,并安装了 Ubuntu 14.04。

编辑:

我想我安装了所有必需的库:

nap@nap:~$ dpkg -l | grep libva
ii  libva-dev:amd64                             1.3.0-2                                             amd64        Video Acceleration (VA) API for Linux -- development files
ii  libva-drm1:amd64                            1.3.0-2                                             amd64        Video Acceleration (VA) API for Linux -- DRM runtime
ii  libva-egl1:amd64                            1.3.0-2                                             amd64        Video Acceleration (VA) API for Linux -- EGL runtime
ii  libva-glx1:amd64                            1.3.0-2                                             amd64        Video Acceleration (VA) API for Linux -- GLX runtime
ii  libva-intel-vaapi-driver                    1.3.0-1ubuntu1                                      all          VAAPI driver for Intel G45 & HD Graphics family (transitional package)
ii  libva-tpi1:amd64                            1.3.0-2                                             amd64        Video Acceleration (VA) API for Linux -- TPI runtime
ii  libva-wayland1:amd64                        1.3.0-2                                             amd64        Video Acceleration (VA) API for Linux -- Wayland runtime
ii  libva-x11-1:amd64                           1.3.0-2                                             amd64        Video Acceleration (VA) API for Linux -- X11 runtime
ii  libva1:amd64                                1.3.0-2                                             amd64        Video Acceleration (VA) API for Linux -- runtime
nap@nap:~$ dpkg -l | grep vaapi
ii  gstreamer1.0-vaapi:amd64                    0.5.7-0ubuntu4                                      amd64        VA-API plugins for GStreamer
ii  libgstreamer-vaapi1.0-0:amd64               0.5.7-0ubuntu4                                      amd64        GStreamer libraries from the "vaapi" set
ii  libva-intel-vaapi-driver                    1.3.0-1ubuntu1                                      all          VAAPI driver for Intel G45 & HD Graphics family (transitional package)

这是 vainfo 的输出:

nap@nap:~$ sudo vainfo 
error: XDG_RUNTIME_DIR not set in the environment.
libva info: VA-API version 0.35.0
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_35
libva info: va_openDriver() returns 0
vainfo: VA-API version: 0.35 (libva 1.3.0)
vainfo: Driver version: Intel i965 driver - 1.3.0
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Simple            : VAEntrypointEncSlice
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileNone                   : VAEntrypointVideoProc
      VAProfileJPEGBaseline           : VAEntrypointVLD

【问题讨论】:

  • 你安装了libva吗?你能显示vainfo 命令的输出吗?
  • 似乎 info beamer 的主要目标是 raspebbeyr pi,可能不支持其他 cpu 和 gpu 上的硬件加速。
  • 阅读 info-beamer.com/doc/info-beamer#opensourceversion 并使用 git clone github.com/dividuum/info-beamer.git 获取源代码,我没有看到任何对 libva 支持的引用。
  • 完全重新编译它之后: ldd info-beamer |grep libva libva.so.1 => /usr/lib/x86_64-linux-gnu/libva.so.1 ,所以它至少链接有了它...

标签: gpu gstreamer h.264 libavcodec


【解决方案1】:

仍在研究它,我错误地认为硬件编解码器是 AVCodec => 事实并非如此。 AVHWAccel 绑定到上下文,它不是直接编解码器...所以 avcodec_find_decoder_by_name("h264_vaapi") 不会返回任何内容。

info-beamer 不支持硬件解码编解码器(即 h264_vaapi):

video.c 代码:

video->codec = avcodec_find_decoder(video->codec_context->codec_id);

我加了

if (video->codec_context->hwaccel != NULL)
  {
    fprintf(stderr, "HW accel IN USE : %s\n", video->codec_context->hwaccel->name);
  }
else
  {
    fprintf(stderr, "NO HW accel IN USE\n");
  }

并显示"NO HW accel IN USE\n",而我之前检查过它已注册:

fprintf(stderr,"\n hw Decoders\n");
AVHWAccel *first_hwaccel   = av_hwaccel_next(NULL);
fprintf(stderr,"%p", first_hwaccel);
AVHWAccel *hwaccel = first_hwaccel; 
AVHWAccel *h264 = NULL; 
const char * h264_name = "h264_vaapi";
while (hwaccel != NULL) 
  {
if ( hwaccel != NULL)
  {
    fprintf(stderr,"%s ", hwaccel->name);
    if (strcmp(hwaccel->name, h264_name)== 0)
      {
    h264=hwaccel;
      }
  }
hwaccel=av_hwaccel_next(hwaccel);

if (hwaccel == first_hwaccel)
  {
    break;
  }
  }
fprintf(stderr,"\n");

显示如下:

hw Decoders
0x7f19af53fa80h263_vaapi h263_vdpau h264_vaapi h264_vdpau mpeg1_vdpau mpeg2_vaapi mpeg2_vdpau mpeg4_vaapi mpeg4_vdpau vc1_vaapi vc1_vdpau wmv3_vaapi wm3
_vdpau 

所以 libavcodec 知道这些,但 stream-beamer 不使用它们。

标头中的 video.c 代码声明是从 avcodec_sample.0.5.0.c 派生出来的......所以它不是由 info-beamer 团队完全编写的。

【讨论】:

  • 感谢您的帮助!是否仍然可以使用硬件加速?你有什么建议?我应该在编译时使用系统中的 libavcodec 吗?
  • 我担心使用 vaapi 进行硬件解码并不能仅仅通过使用 libavcodec 来免费获得,而是需要将特定代码放入 stream-beamer 来支持它,我此时停止了我的调查......我怀疑它可以修复只需在静态中使用一些选项 libavcodec 重新编译。
猜你喜欢
  • 2018-11-24
  • 2017-09-26
  • 2012-08-28
  • 2011-06-05
  • 2015-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-15
相关资源
最近更新 更多