工作小计-GPU硬编以及依赖库 nvcuvidnvidia-encode

工作小计-GPU编码以及依赖库

已经是第三篇关于编解码的记录了。项目中用到GPU编码很久了,因为yuv太大,所以编码显得很重要。这次遇到的问题是环境的搭建问题。需要把开发机上的环境放到docker中,以保证docker中同样可以进行GPU的编码。

1 定位问题

docker是算法部门提供的,天然带了cuda,gpu驱动等环境。但是代码调用解码器时,未找到对应的硬解码器。
定位问题,先确定是否真的不支持编码器。

查看库是否支持GPU

strings libavcodec.so | grep -i cuda

在这里插入图片描述
看到很多cuda输出,最重要的还是这个编译选项,可以看到是开启了对应的cuda,nvenc,cuvid都有的

--prefix=/opt/ffmpeg --enable-shared --enable-ffplay --enable-cuda --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp --enable-gpl --extra-cflags='-I/usr/local/cuda/include /usr/local/cuda-11.1/targets/x86_64-linux/include' --extra-ldflags='-L/usr/local/cuda/lib64 -L/usr/local/cuda-11.1/targets/x86_64-linux/lib' --disable-x86asm --extra-cflags=-fPIC --extra-cxxflags=-fPIC --enable-libmfx --enable-nonfree --enable-encoder=h264_qsv --enable-decoder=h264_qsv --enable-encoder=hevc_qsv --enable-decoder=hevc_qsv --prefix=/opt/ffmpeg --libdir=/opt/ffmpeg/lib --extra-cflags=-I/opt/intel/mediasdk/include --extra-ldflags=-L/opt/intel/mediasdk/lib64

查看运行时是否支持硬件解码

手头有现成h265文件,

# 得到yuv文件
ffmpeg -i input.h265 -c:v rawvideo -pix_fmt yuv420p output.yuv
# 得到MP4文件
ffmpeg -i input.h265 -c:v libx264 -crf 23 -c:a aac -strict experimental output.mp4# 对yuv进行h264/hevc(h265) 硬件编码
ffmpeg -f rawvideo -pix_fmt yuv420p -s 3840x2160 -r 30 -i output.yuv -c:v hevc_nvenc output.mp4
ffmpeg -f rawvideo -pix_fmt yuv420p -s 3840x2160 -r 30 -i output.yuv -c:v h264_nvenc output.mp4

果然硬编码报错了
可见h264和h265的硬编都报错了

[h264_nvenc @ 0x258a880] Cannot load libnvidia-encode.so.1
[hevc_nvenc @ 0x258a880] The minimum required Nvidia driver for nvenc is (unknown) or newer

2 解决问题

直接搜宿主机的环境
在这里插入图片描述
i386-linux-gnu 是32位环境的,直接忽略。去对应的文件夹找nvidia对应的库

在这里插入图片描述
和docker中的对比下
在这里插入图片描述
果然查了很多,因为docker中的是深度学习的环境,和我们的硬件编码库肯定会有偏

拷贝过去,仍然报错。最终定位到cuvid的问题。坑爹的是,ffmpeg缺少硬件编码缺少cuvid的时候,同样会报错缺少 libnvidia-encode.so的问题

在这里插入图片描述
可以看到nvenc和cuvid这两个库分别对应硬件的编解码,之前的项目用硬解比较多,而这边则是硬编比较多

libnvcuvid.so 是NVIDIA Video Codec SDK中的一个库文件,它提供了用于解码和处理视频的功能。它允许应用程序使用NVIDIA GPU来加速视频解码,从而提高视频处理性能。
libnvidia-encode.so 是NVIDIA Video Codec SDK中的另一个库文件,它提供了用于编码和处理视频的功能。它允许应用程序使用NVIDIA GPU来加速视频编码,从而提高视频处理性能。

这两个库文件都是NVIDIA提供的用于视频处理的工具,可以在支持NVIDIA GPU的系统上使用。它们为开发人员提供了使用GPU进行视频解码和编码的接口和功能,以实现更高效的视频处理和加速。
至此,问题解决。

3 docker相关

额外记录一些docker相关的理解。
docker想要调用gpu和必定要和宿主机中的gpu进行通信(肤浅的理解可以是各自安装了 nvidia-container-toolkit),完成一次远程调用/中转调用。这个调用之前是由nvidia-docker完成的。高版本的docker集成了nvidia-docker,所以只要如入–gpu 参数就好。只要在容器中的nvidia-smi正常之后,就基本差不多了,因为是进行了一次交互。但是驱动,指的是调用gpu的指令,*.so这些,还是要在docker中安装的,不然即没有办法和宿主机通讯,也没有办法被上层应用调用。

nvidia-container-cli --version # 查看是否安装了对应的版本

在容器中使用 GPU,通常需要在宿主机和容器中都安装 NVIDIA Container Toolkit。在宿主机中安装 NVIDIA Container Toolkit 用于管理宿主机上的 GPU 资源,而在容器中安装 NVIDIA Container Toolkit 则用于在容器内访问这些 GPU 资源。
宿主机
https://github.com/NVIDIA/k8s-device-plugin#preparing-your-gpu-nodes

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update && sudo apt-get install -y nvidia-docker2

容器

# 基于一个带有 NVIDIA 驱动的基础镜像构建
FROM nvidia/cuda:11.0-base# 安装 NVIDIA Container Toolkit 相关的软件包
RUN apt-get update && apt-get install -y nvidia-container-toolkit# 设置 NVIDIA 运行时环境变量
ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES compute,utility# 验证 NVIDIA GPU 配置是否正确
RUN nvidia-smi# 运行你的应用程序或服务
CMD ["/your/app/command"]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/150690.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python轮廓追踪【OpenCV形态学操作】

文章目录 概要代码运行结果 概要 一些理论知识 OpenCV形态学操作理论1 OpenCV形态学操作理论2 OpenCV轮廓操作|轮廓类似详解 代码 代码如下,可以直接运行 import cv2 as cv# 定义结构元素 kernel cv.getStructuringElement(cv.MORPH_RECT, (3, 3)) # print kern…

小程序设计基本微信小程序的校园生活助手系统

项目介绍 通篇文章的撰写基础是实际的应用需要,然后在架构系统之前全面复习大学所修习的相关知识以及网络提供的技术应用教程,以校园生活助手系统的实际应用需要出发,架构系统来改善现校园生活助手系统工作流程繁琐等问题。不仅如此以操作者…

国产CAN总线收发芯片DP1042 兼容替换TJA1042

说明 1 简述 DP1042是一款应用于 CAN 协议控制器和物理总线之间的接口芯片,可应用于卡车、公交、小汽车、工业控制等领域,支持 5Mbps CAN FD 灵活数据速率,具有在总线与 CAN 协议控制器之间进行差分信号传输的能力,完全兼容“ISO…

Fabric.js 样式不更新怎么办?

本文简介 带尬猴,我嗨德育处主任 不知道你有没有遇到过在使用 Fabric.js 时无意中一些骚操作修改了元素的样式,但刷新画布却没更新元素样式? 如果你也遇到同样的问题的话,可以尝试使用本文的方法。 是否需要重新绘制 我先举个例…

最近面试遇到的高频面试题

大家好,我是 jonssonyan 互联网寒冬?金九银十真的不存在了么?虽说现在行情是差了一些,面试机会少了一些,但是大部分公司还是或多或少的招人,春招秋招都在进行。有人离职就有人入职。所以如果你还没约到面试…

npm改变npm缓存路径和改变环境变量

在安装nodejs时,系统会自动安装在系统盘C, 时间久了经常会遇到C盘爆满,有时候出现红色,此时才发现很多时候是因为npm 缓存保存在C盘导致的,下面就介绍下如何改变npm缓存路径。 1、首先找到安装nodejs的路径&#xff0c…

单元测试,集成测试,系统测试的区别是什么?

实际的测试工作当中,我们会从不同的角度对软件测试的活动进行分类,题主说的“单元测试,集成测试,系统测试”,是按照开发阶段进行测试活动的划分。这种划分完整的分类,其实是分为四种“单元测试,…

618京东到家APP-门详页反爬实战

一、背景与系统安全需求分析 1. 系统的重要性 上图所示是接口所属位置、对电商平台或在线商店而言,分类查商品都是很重要的,通过为用户提供清晰的商品分类,帮助他们快速找到所需产品,节省浏览时间,提升购物效率,是购物结算产生GMV的核心环节。那么电商平台为什么都很看重…

Kubernetes - 一键安装部署 K8S(附:Kubernetes Dashboard)

问题描述 不知道大伙是如何安装 K8s,特别还是集群的时候,我上一次安装搭建的时候,那个恶心到我了,真的是一步一个脚印走完整个搭建流程,爬了不少坑。 于是,才有了今天的文章,到底有没有可以一…

第16章总结

.1.1:访问构造方法 反射: 1.class类 2.获取构造方法 3.获取成员属性 4.获取成员方法 注解 1.内置注解 2.反射注解 3 创建Class对象的三种方式 1.使用getClass()方法 object str new object()…

javascript原生态xhr上传多个图片,可预览和修改上传图片为固定尺寸比例,防恶意代码,加后端php处理图片

//前端上传文件 <!DOCTYPE html> <html xmlns"http://www.w3.org/1999/xhtml" lang"UTF-8"></html> <html><head><meta http-equiv"Content-Type" content"text/html;charsetUTF-8;"/><title…

腾讯云国际-如何使用对象存储COS在 CKafka 控制台创建数据异步拉取任务?腾讯云代充

操作场景 Datahub 支持接入各种数据源产生的不同类型的数据&#xff0c;统一管理&#xff0c;再分发给下游的离线/在线处理平台&#xff0c;构建清晰的数据通道。 本文以 COS 数据为例介绍如何在 CKafka 控制台创建数据异步拉取任务&#xff0c;并对任务进行修改配置&#xf…