网站建设用户调查问卷,北京企业响应式网站建设,网站开发合同模板,栾城seo整站排名工作小计-GPU编码以及依赖库
已经是第三篇关于编解码的记录了。项目中用到GPU编码很久了#xff0c;因为yuv太大#xff0c;所以编码显得很重要。这次遇到的问题是环境的搭建问题。需要把开发机上的环境放到docker中#xff0c;以保证docker中同样可以进行GPU的编码。
1 定…工作小计-GPU编码以及依赖库
已经是第三篇关于编解码的记录了。项目中用到GPU编码很久了因为yuv太大所以编码显得很重要。这次遇到的问题是环境的搭建问题。需要把开发机上的环境放到docker中以保证docker中同样可以进行GPU的编码。
1 定位问题
docker是算法部门提供的天然带了cudagpu驱动等环境。但是代码调用解码器时未找到对应的硬解码器。 定位问题先确定是否真的不支持编码器。
查看库是否支持GPU
strings libavcodec.so | grep -i cuda看到很多cuda输出最重要的还是这个编译选项可以看到是开启了对应的cudanvenccuvid都有的
--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-encoderh264_qsv --enable-decoderh264_qsv --enable-encoderhevc_qsv --enable-decoderhevc_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]