问题标签 [nvenc]

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 投票
0 回答
314 浏览

ffmpeg - ffmpeg:4K RGB->YUV实时转换

我正在尝试使用 Ffmpeg 从 Decklink 输入创建 hevc 实时流。目标是使用 10 位的高质量 HDR 流。Decklink SDI 输入输入 RGB 10 位,ffmpeg 使用 decklink 选项 -raw_format rgb10 很好地处理了这一点,ffmpeg 将其识别为“gbrp10le”。

我有一个基于 Nvidia pascal 的卡,它支持 yuv444 10 位(作为“yuv444p16le”),当使用“-c:v hevc_nvenc”时,auto_scaler 启动并转换为“yuv444p16le”,我猜这与转换相同给'-pix_fmt yuv444p16le'。

这在 1920x1080 分辨率下运行良好,但在 4096x2160 分辨率下,ffmpeg 无法保持实时 24 或 25 fps,并且我得到输入缓冲区溢出。罪魁祸首似乎是 ffmpeg swscale 中的 RGB->YUV 转换,因为;

  • 当使用 '-c:v copy' 将 Decklink 4K RGB 输入直接传输到 /dev/null 时,缓冲区欠载没有问题,
  • 当输入 Decklink YUV 并给出“-raw_format yuv422p10”(在 ffmpeg 中似乎没有用于 decklink 的 YUV444 输入)时,我没有遇到欠载,并且在 4K 中一切正常。即使我设置了'-pix_fmt yuv444p16le'。

有什么想法可以使用来自 Decklink 的 10 位 RGB 信号在 NVENC 中完成 4K hevc 吗?有没有办法让 NVENC 接受和使用 RGB 数据而无需先转换为 YUV?或者有没有办法用 cuda 或 scale_npp 过滤器转换 gbrp10le->yuv444p16le?我已经用 npp 和 cuda 编译了 ffmpeg,但我不知道我是否可以让它与 RGB 一起工作?每当我尝试执行 '-vf "hwupload_cuda"' 时,auto_scaler 就会启动并尝试在 cpu 上转换为 yuv,这又会造成欠载。

我想可能有帮助的另一件事是,是否有办法使 swscale cpu 过滤器(或者是否有另一个合适的过滤器?)使用多个线程?现在它似乎一次只使用一个线程,在我的 Ryzen 3950x(3.5GHz,32 个线程)上最高可达 99%。

ffmpeg 输出示例:

0 投票
1 回答
325 浏览

ffmpeg - 使用 ffmpeg 完全 GPU 加速(解码、去隔行、缩放、编码)HLS 可变流

我正在尝试使用 ffmpeg 创建一个可变的 HLS MBR 实时流,它将在 GPU 级别完全加速。这意味着加速解码、去隔行、缩放和编码。这是我破碎的例子......

注意:我的显卡可以处理超过 2 个并发编码。我收到一个经典错误“无法在过滤器'Parsed_split_1'和过滤器'auto_scaler_0'支持的格式之间进行转换”。

我的目标是真的吗?或者在这种情况下尽可能高效地使用 GPU 的正确方法是什么?谢谢您的帮助。

0 投票
0 回答
210 浏览

c++ - 使用 AV_PIX_FMT_D3D11 的 FFMPEG 从 NVENC 给出“注册输入资源时出错”

输入帧在 GPU 上作为ID3D11Texture2D指针开始。

我使用 FFMPEG + NVENC 将它们编码为 H264。如果我将纹理作为 format 下载到 CPU 内存,NVENC 可以完美运行AV_PIX_FMT_BGR0,但我想完全删除 CPU 纹理下载,并将 GPU 内存指针以原生格式直接传递到编码器。我这样写框架:

使用此修改运行代码会出现以下错误:


下面是一些用于设置和配置硬件上下文和编码器的补充代码:

0 投票
0 回答
506 浏览

ffmpeg - FFMPEG编码16bit视频数据结果为10bit

我想压缩一个每个像素有 16 位信息的深度图。一般来说,这样的深度图可以以不同的方式存储,例如 p016le、gray16le、yuv420p16le、yuv444p16le……但为简单起见,我们假设深度图是 yuv420p16le(其中 y 通道包含深度)。

由于某种原因,当使用hevc_nvenc(我使用 NVIDIA GTX 1660 Ti GPU)进行编码时,ffmpeg(命令行工具)将像素格式更改为 10 位或 12 位变体(p010le、gray12le、yuv420p10le、yuv444p12le、...),但是我想保留完整的 16 位,因为这会影响存储深度的质量。

例如:

如果我在 output.mp4 上使用 ffprobe,它会告诉我底层像素格式实际上是yuv444p10le。(解码并查看原始像素数据,我可以确认精度已从 16 位降低到 10 位)。

我希望 16 位压缩是可能的,因为根据

支持的像素格式有:

但是 p016le 会导致 p010le 输出,yuv444p16le 在 yuv444p10le 中。

有谁知道问题可能出在哪里?我应该重新安装 ffmpeg(版本 4.3.2-2021-02-27-essentials_build-www.gyan.dev)吗?是因为 Windows 10 的编码/解码能力有限吗?购买HEVC 视频扩展有助于解决这个问题吗?

附加信息: usinglibx256看起来不适用于此目的,因为支持的像素格式是:

任何帮助将不胜感激。

0 投票
0 回答
46 浏览

ffmpeg - 使用 FFMPEG 一次使用超过 2 个 NV_ENC

我目前正在使用我的 CPU 上的线程生成延时视频,并在 nodejs 上运行 fluent-ffmpeg。生成 10 秒延时拍摄大约需要 1 分钟。我同时生成许多(基本上每个线程一个),这样我倾向于在 8 个工作线程中获得最佳性能。... 整个系统吞吐量约为每 12 秒一个视频。

使用 h264_nvenc 的 GPU 处理将单线程时间缩短到大约 3-4 秒。伊皮!我出去买了一些nVidia 1660来利用。

不幸的是,当我去生成第三个同步视频时,我得到“转换失败!” 来自 FFMPEG 的错误。

一些基础研究似乎表明你一次只能做 2 个。也许 3 带有更新的驱动程序。

有没有办法解决这个问题?此处的帖子表明此限制是人为的,可以解决:https ://www.techpowerup.com/268495/nvidia-silently-increases-geforce-nvenc-concurrent-sessions-limit-to-3

也许是一种使用所有 cuda/tensor/etc 内核来渲染延时视频而不是仅仅依赖有限的 nv_enc 的方法?

0 投票
1 回答
79 浏览

textures - DXGI/NvEnc YUV44 10bit 格式兼容性

使用 DirectX 11、DXGI DDA 和 NvEnc。我必须支持 YUV420、YUV444、8bit 和 10bit。我的转换适用于 YUV420、YUV444 和 8bit。使用 10 位时,我遇到了 DXGI_FORMAT 与 NV_ENC_BUFFER_FORMATS 的兼容性问题。

我有计算着色器将 DDA 捕获格式(DXGI_FORMAT_B8G8R8A8_UNORM 用于 8 位,DXGI_FORMAT_R16G16B16A16_FLOAT 用于 10 位)转换为 NvEnc 的 YUV 格式。在 NvEnc 中使用内置 RGB 格式似乎不起作用,因为它们都在内部转换为 YUV420(没有 YUV444)并且我无法控制色度坐标(例如 BT.601、BT.709)

DXGI 支持的 YUV444 10bit 格式有:

DXGI_FORMAT_Y410(10 位压缩,2 位 alpha,每像素 32 位)

DXGI_FORMAT_Y416(10 位解压缩为每通道 16 位,16 位 alpha,每像素 64 位)

NvEnc 支持的 YUV444 10bit 格式有:

NV_ENC_BUFFER_FORMAT_YUV444_10BIT(10bit 解压为每通道 16bit,无 alpha,每像素 48bit)

所以这就是问题所在。这里没有兼容的格式。看来我在两者之间转换的唯一选择是结构化缓冲区(并做更多的手动工作),或 DXGI_FORMAT_R16_FLOAT 格式,并使尺寸成为我框架尺寸的 3 倍。它还需要我建立另一个管道。每次转换我已经有 4 个,因为我还必须将鼠标指针(颜色、蒙版颜色或单色)写入图像。这只会让我的系统比现在更令人讨厌和臃肿。

我有更好的选择吗?这些格式有什么我遗漏的吗?除了在定义它们的 NvEncodeApi.h 标头中之外,Nvidia 根本不谈论这些格式。

0 投票
0 回答
114 浏览

c++ - 为当前程序直接从任何 GPU 内存中提取(原始或编码)视频帧?

Camera Video Frame Capturing过去一年我一直在努力。我正在尝试使用webrtc及其相关技术制作视频流插件。我知道市场上已经有一些插件可以流式传输视频,即PixelStreaming.

最近,我提出了执行以下操作所需的新研究;

因为这latency是开发更可靠的流插件的关键因素。因此,我尽最大努力优化Camera Video Frame Capturing期间运行的每个进程。我还试图在此过程中减少额外的跃点数。


我开发的这个当前系统运行100良好,没有任何崩溃,正如您在此处看到的那样;

在此处输入图像描述

我在这里关注的一点是,我是否有可能直接从 GPU 中提取相机视频RAWEncoded

因为我想Camera使用 GPU运行Nvidia GPU (GTX GEFORCE),我可以使用 Python 模块获取一些详细信息,以便在 Python 中以编程方式使用 Nvidia-SMI 从 NVIDIA GPU 获取 GPU 状态。但它没有让我有任何访问权限来获取、获取或提取在 GPU 上运行的相机的视频帧。


简单示例:

作为一个例子,让我们以一个简单的相机为例,它的帧被处理,GPU而不是CPU这样;

在此处输入图像描述

我已经访问了这个非常酷的答案:

就目前Nvidia Encoder而言,我还使用过这个非常酷的编码器,并成功地使用NvEnc. 我也直接知道它的 C/C++ 实现。

让我们再举一个非常简单的例子。我曾尝试使用cudaMallocCUDA C++ 编程在 GPU 中分配内存。我还可以使用以下方法将分配的 GPU 内存复制到主机程序cudaMemcpy中;

对于当前运行的进程/程序plugin是否有人可以给我关于直接从 GPU 中提取帧而不是每次都从相机中获取帧的任何建议或一些建议。modulelibrary

0 投票
0 回答
62 浏览

c++ - libav 是否有任何形式的文档,特别是针对 NVENC

我想使用 ffmpeg 的 libav 库在我正在开发的应用程序中编码视频。不幸的是,软件编码太慢了。于是我又回到“文档”,开始搜索关于 NVENC 的文档,但我只能找到 VAAPI 示例和文档。NVIDIA 的所有“文档”都是针对 ffmpeg 实用程序而不是 api 的。只是将编码器从 libx264 更改为 h264_nvenc 只会导致崩溃,将 hwaccel cuda 添加到 dict 也不起作用

0 投票
1 回答
77 浏览

winapi - IMFTransform::SetInputType() 'MF_E_TRANSFORM_TYPE_NOT_SET'

我正在尝试设置编码器 IMFTransform。在这种情况下,它恰好是 NVENC H264 编码器。但是,IMFTransform::SetInputType()不为 工作ConfigureEncoder(),并且正在返回MF_E_TRANSFORM_TYPE_NOT_SETConfigureColorConversion()尽管代码几乎相同,但函数中不会出现此行为。我几乎尝试了所有方法,但根本没有帮助。

错误

命令行输出

完整的项目链接

0 投票
0 回答
17 浏览

c++ - NVENC 在关闭编码器后留下正在运行的线程

如果我使用 NVENC,它会创建一些内部nvwgf2umx.dll线程。但是如果我关闭编码器(我曾经nvEncDestroyEncoder这样做并cuCtxDestroy关闭 CUDA 设备),线程仍然存在并运行。我认为我的应用程序中发生了一些错误,这就是我问这个问题的原因。

我最关心的是NVFBCAsyncThread哪个不关闭。最有趣的部分是我不使用异步编码参数(_NV_ENC_INITIALIZE_PARAMS::enableEncodeAsync对我来说也是 0)。我检查了,无论我是否使用异步模式,线程仍然存在。

是否可以以关闭nvwgf2umx.dll线程的方式关闭编码器?或者至少NVFBCAsyncThread特别是?

关闭编码器后留下的 NVENC 线程