问题标签 [vaapi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
4349 浏览

c++ - 使用 libavcodec 和 VAAPI 从 C++ 编码视频

我正在尝试使用 libavcodec(版本 3.4.6)对 H.264 中的视频进行编码。当我使用软件编码器“libx264”时它可以工作,但是当我尝试将我的英特尔 cpu 的硬件编码器与 VAAPI 一起使用时它不起作用。通过 VAAPI 使用 ffmpeg 进行硬件编码可从命令行工作(使用此处的命令)。

显然,没有示例或教程如何使用 VAAPI 和 libav* 进行编码。我通读了涵盖相关用例(硬件解码、软件编码、复用)的ffmpeg 示例,并尝试相应地调整它们。

当我设置 VAAPI 编码器时,avcodec_open2()返回AVERROR(EINVAL)(-22) 并将以下错误消息打印到控制台:

AVCodecContext.pix_fmt 和 AVHWFramesContext.format 不匹配

Encoder::setupEncoder()您可以在我的代码末尾找到它。我错过了什么?

下面是我的代码,分为三个文件:

编码器.h

编码器.cpp

主文件

请注意,我有意省略了各种 free() 函数和析构函数以保持代码简短。

0 投票
1 回答
3245 浏览

ffmpeg - 使用 ffmpeg 和 vaapi 对 HEVC 4K HDR 进行转码

我正在尝试为我的 LG OLED 电视使用 ffmpeg 和 VAAPI 硬件加速将 4K HEVC HDR 视频转码为较低的比特率。

我使用以下文件: 视频

使用以下命令:

但是这个文件在我的电视上没有被识别为 HDR。

使用 libx265 编码器(当然速度要慢得多)时,它可以正常工作:

在比较两个文件的 mediainfo 输出时,我可以看到没有为视频轨道设置以下属性:

  • 颜色范围
  • 原色
  • 传输特性

vaapi 编码的媒体信息:

libx265 编码的媒体信息:

我怀疑颜色范围、颜色原色和传输特性对于使文件被我的电视识别为 HDR 是必要的。如何将这些属性添加到 VAAPI 编码文件中?

编辑:这个补丁解决了这个问题: 补丁

0 投票
0 回答
188 浏览

encoding - 使用硬件加速在定格视频中刻录字幕

我正在尝试使用从网络摄像头拍摄的图像制作长达一年的定格视频。我在input.txt里面创建了一个这种格式的文件:

我制作的命令(主要取自官方 ffmpeg 文档中的示例)是:

但是这个输出严重失败:

老实说,我迷失了:根据我的理解,所有的阐述都应该直接在视频卡内存中完成,所以我不明白为什么要转换表面格式。还有其他一些我必须输入的参数format吗?我错过了什么?

0 投票
1 回答
620 浏览

linux - 如何使用 GStreamer 和 VAAPi 解决 RAW 流播放问题

我目前在使用 GStreamer 时遇到了一个小问题,这里有更多详细信息:

配置:

  • 英特尔 i7-6700
  • 英特尔核芯显卡 530
  • Ubuntu 18.04 LTS
  • GStreamer1.0
  • VAAPI 插件

UDP从视频源接收流,该流以RAW UYVY格式发送。这是我的命令行来解码它:

gst-launch-1.0 -v udpsrc port="1234" caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string)YCbCr-4:2:2, depth=(string)8, width=(string)1920, height=(string)1080, colorimetry=(string)BT709-2, payload=(int)96, ssrc=(uint)1188110121, timestamp-offset=(uint)4137478200, seqnum-offset=(uint)7257, a-framerate=(string)25" ! rtpvrawdepay ! decodebin ! queue ! videoconvert ! xvimagesink

问题正如我们在下面的屏幕截图中看到的,CPU负载(右)对于此类任务来说太高了,我们可以看到GPU负载(左)几乎为零。

CPU 和 GPU 费用

为了克服这个问题,我想使用 VAAPI 图形加速,就像我在之前的项目中所做的那样,H264下面是命令行:

gst-launch-1.0 -v udpsrc port=1234 caps= "application/x-rtp, media\=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, packetization-mode=(string)1, profile-level-id=(string)640028, payload=(int)96, ssrc=(uint)2665415388, timestamp-offset=(uint)3571350145, seqnum-offset=(uint)18095, a-framerate=(string)25" ! rtph264depay ! queue ! vaapih264dec low-latency=1 ! autovideosink

上面的行完美运行,CPU几乎没有更多负载。所以我调整了这个命令行以将它与RAW流一起使用,这里是命令:

gst-launch-1.0 -v udpsrc port="1234" caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string)YCbCr-4:2:2, depth=(string)8, width=(string)1920, height=(string)1080, colorimetry=(string)BT709-2, payload=(int)96, ssrc=(uint)1188110121, timestamp-offset=(uint)4137478200, seqnum-offset=(uint)7257, a-framerate=(string)25" ! rtpvrawdepay ! vaapidecodebin ! videoconvert ! xvimagesink

它与开头的那一行是同一行,但我将元素更改decodebin为我vaapidecodebin在流中替换avdec_h264为。不幸的是,它不起作用,我最终遇到了这个错误:vaapih264decH264

WARNING: wrong pipeline: unable to connect rtpvrawdepay0 to vaapidecodebin0

我该如何解决这个问题?你有解决这个问题的线索吗?

0 投票
1 回答
586 浏览

ffmpeg - 为什么 ffmpeg 没有完整记录所有 VAAPI 过滤器图形操作,并且比我在这里列出的更多

我已经从启用ffmpeg的快照编译。vaapi

我很好奇我可以使用我的 GPU 执行的可用过滤器图操作,并找到了这个文档页面

https://ffmpeg.org/ffmpeg-filters.html#toc-VAAPI-Video-Filters

此页面显示单个过滤器,tonemap_vaapi。我觉得奇怪的是只有一个过滤器,tonemap而不是像缩放这样的东西。

所以我运行了这个命令

它显示了更多我在任何地方都找不到的过滤器。没有记录这些是否有原因,我在哪里可以找到如何使用它们?此外,我注意到这tonemap_vaapi不是那些可用的过滤之一。

当我们讨论这个主题时,我真的希望有某种方法可以使用硬件加速来转置视频。我没有看到transpose_vaapi过滤器,但我确实注意到了这个线程https://patchwork.ffmpeg.org/project/ffmpeg/patch/20181225061644.6384-1-zachary.zhou@intel.com/,这个功能是否曾添加到 ffmpeg 或为什么不是吗?有什么方法可以用 OpenCL 进行转置吗?我在这里没有看到任何提到在 OpenCL 过滤器下转置的内容 https://ffmpeg.org/ffmpeg-filters.html#OpenCL-Video-Filters

谢谢

编辑 -

我找到了ffmpeg/libavfilter/allfilters.c列出许多未记录的过滤器的文件。

https://github.com/FFmpeg/FFmpeg/blob/master/libavfilter/allfilters.c

这如何transpose_vaapi

0 投票
1 回答
321 浏览

ffmpeg - 为什么在 libavfilter 中存在 vaapi 过滤器,但在我编译的 ffmpeg 版本中不存在?

vaapi我已经编译了启用的 ffmpeg 的最新快照

我知道这vaapi是有效的,因为我可以将它用于 h264 视频的硬件解码和编码。我也可以看到一些vaapi过滤器

但是,我注意到此列表缺少我专门寻找的过滤器,即transpose_vaapi. 如果您查看 libavfilter 源代码,您将看到以下内容

这显示了文件 https://github.com/FFmpeg/FFmpeg/blob/master/libavfilter/allfilters.c#L414transpose_vaapi中定义的过滤器allfilters.c

这显示了transpose_vaapi过滤器源代码 https://github.com/FFmpeg/FFmpeg/blob/master/libavfilter/vf_transpose_vaapi.c

如果过滤器是在源代码中定义的,它是在 中定义的allfilters.c,并且我已经从这个源编译了 ffmpeg 并vaapi启用了,为什么我不能将此过滤器与 ffmpeg 一起使用?

编辑 -

查看源代码,vf_transpose_vaapi.c我看到以下逻辑

这是函数的内部,transpose_vaapi_build_filter_params它是过滤器初始化过程的一部分。我想有可能,如果该调用失败,过滤器将无法构建并且它不会被注册为有效过滤器?这似乎是在我尝试运行过滤器时在运行时发生的事情,而不是在设置定义哪些过滤器时在编译时发生的事情。

0 投票
0 回答
1025 浏览

video - ffmpeg vaapi 硬件加速,某些视频无法正常工作

我在对 Synology NAS 上的各种视频进行转码时遇到问题。有些视频有效,有些则无效。

ffmpeg 命令:

输入上面的命令后,我得到以下错误输出:

不幸的是,我对视频转码知之甚少。有谁知道这里可能是什么问题?

没有硬件支持(没有 -hwaccel_output_format vaapi)它可以工作。

多谢!

0 投票
2 回答
611 浏览

docker - 在 docker 中运行 gstreamer vaapi

我正在尝试在 docker 中运行 Gstreamer vaapi 插件。我只需要带有英特尔后端的 vaapi 解码器。在docker中,看起来它可以支持vainfo:

但在 gst-inspect-1.0 vaapi 上没有显示任何元素(从 gst-build 1.18 构建 gstreamer)这是我检查 vaapi 运行 docker 的步骤:

有一些线索,当我查看 gstreamer-vaapi 时,所有元素都需要显示。有没有人有在 docker 中运行 vaapi 解码器的经验?

0 投票
0 回答
95 浏览

node.js - 我可以通过使用 ffmpeg-fluent 在 node.js 中使用 vaapi 吗?

我的目标是从电子应用程序中捕获屏幕,但我想通过使用 ffmpeg 的 h264_vaapi 编码器来实现。通过使用 ffmpeg-fluent,我可以选择设置编解码器,但是当我尝试使用 vaapi 编码器时,它不会抓取任何东西。通过使用默认的 libx264 编码器,它可以工作,但 CPU 功率低,所以我必须依赖内置的英特尔 iGPU。使用 h264_vaapi 从 bash 脚本捕获屏幕效果很好。操作系统:Ubuntu 20.04,硬件:带有英特尔高清显卡的 Pentium N5000。

这是我的代码(编码器被注释掉):

0 投票
0 回答
50 浏览

gstreamer - 如何在 Ubunut 18.04 上使用 gst-launch-1.0 将 yuv V210 无损转换为 h264

是否可以使用 gst-launch 从 YUV v210 编码视频创建具有 Hi444PP 配置文件的 H264 视频?(我正在尝试使用 vaapih264enc )