问题标签 [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.
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() 函数和析构函数以保持代码简短。
ffmpeg - 使用 ffmpeg 和 vaapi 对 HEVC 4K HDR 进行转码
我正在尝试为我的 LG OLED 电视使用 ffmpeg 和 VAAPI 硬件加速将 4K HEVC HDR 视频转码为较低的比特率。
我使用以下文件: 视频
使用以下命令:
但是这个文件在我的电视上没有被识别为 HDR。
使用 libx265 编码器(当然速度要慢得多)时,它可以正常工作:
在比较两个文件的 mediainfo 输出时,我可以看到没有为视频轨道设置以下属性:
- 颜色范围
- 原色
- 传输特性
vaapi 编码的媒体信息:
libx265 编码的媒体信息:
我怀疑颜色范围、颜色原色和传输特性对于使文件被我的电视识别为 HDR 是必要的。如何将这些属性添加到 VAAPI 编码文件中?
编辑:这个补丁解决了这个问题: 补丁
encoding - 使用硬件加速在定格视频中刻录字幕
我正在尝试使用从网络摄像头拍摄的图像制作长达一年的定格视频。我在input.txt
里面创建了一个这种格式的文件:
我制作的命令(主要取自官方 ffmpeg 文档中的示例)是:
但是这个输出严重失败:
老实说,我迷失了:根据我的理解,所有的阐述都应该直接在视频卡内存中完成,所以我不明白为什么要转换表面格式。还有其他一些我必须输入的参数format
吗?我错过了什么?
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
负载(左)几乎为零。
为了克服这个问题,我想使用 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
为。不幸的是,它不起作用,我最终遇到了这个错误:vaapih264dec
H264
WARNING: wrong pipeline: unable to connect rtpvrawdepay0 to vaapidecodebin0
我该如何解决这个问题?你有解决这个问题的线索吗?
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
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
它是过滤器初始化过程的一部分。我想有可能,如果该调用失败,过滤器将无法构建并且它不会被注册为有效过滤器?这似乎是在我尝试运行过滤器时在运行时发生的事情,而不是在设置定义哪些过滤器时在编译时发生的事情。
video - ffmpeg vaapi 硬件加速,某些视频无法正常工作
我在对 Synology NAS 上的各种视频进行转码时遇到问题。有些视频有效,有些则无效。
ffmpeg 命令:
输入上面的命令后,我得到以下错误输出:
不幸的是,我对视频转码知之甚少。有谁知道这里可能是什么问题?
没有硬件支持(没有 -hwaccel_output_format vaapi)它可以工作。
多谢!
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 解码器的经验?
node.js - 我可以通过使用 ffmpeg-fluent 在 node.js 中使用 vaapi 吗?
我的目标是从电子应用程序中捕获屏幕,但我想通过使用 ffmpeg 的 h264_vaapi 编码器来实现。通过使用 ffmpeg-fluent,我可以选择设置编解码器,但是当我尝试使用 vaapi 编码器时,它不会抓取任何东西。通过使用默认的 libx264 编码器,它可以工作,但 CPU 功率低,所以我必须依赖内置的英特尔 iGPU。使用 h264_vaapi 从 bash 脚本捕获屏幕效果很好。操作系统:Ubuntu 20.04,硬件:带有英特尔高清显卡的 Pentium N5000。
这是我的代码(编码器被注释掉):
gstreamer - 如何在 Ubunut 18.04 上使用 gst-launch-1.0 将 yuv V210 无损转换为 h264
是否可以使用 gst-launch 从 YUV v210 编码视频创建具有 Hi444PP 配置文件的 H264 视频?(我正在尝试使用 vaapih264enc )