弄了2天,终于实现了在docker中ffmpeg+GPU硬编解码,基本上是参考:https://note.youdao.com/ynoteshare1/index.html?id=700052b0a49301059a34f20a00a830ca&type=note,但还是遇到了很多的坑。本手记默认已经安装好nvidia驱动,驱动版本在Tesla V100上是440,在我的笔记本电脑上是450
一、拉取镜像
sudo docker run -dit --gpus all docker.io/nvidia/cuda:10.2-base /bin/bash
这里我拉取的是最基础的镜像,也可以拉取devel版本的镜像,但是一是下载速度很慢,二是有些库缺失(这地方是一个坑),所以我干脆下载基础包,自己安装cuda和cudnn等库(备注:拉取devel版本:sodu docker run -dit --gpus all docker.io/nvidia/cuda:10.2-cudnn8-devel /bin/bash)
拉取镜像后就可以把拉取的容器停掉
1、先用 sudo docker ps -a 查看容器的ID,然后用sudo dokcer stop <容器编号> 先停掉容器
2、删除刚刚建立的容器:sudo docker rm <容器编号>
二、构建容器
这个地方有个坑,构建容器时一定要加上 -e NVIDIA_DRIVER_CAPABILITIES=compute,utility,video选项,具体如下:
sudo docker run -dit --gpus all -e NVIDIA_DRIVER_CAPABILITIES=compute,utility,video --name jian <镜像编号> /bin/bash
<镜像编号>就是上面拉取的镜像编号,可以用sudo docker images查看
我先没有加上这个选项,编译ffmpeg后始终没有出现硬件编解码的标志cuvid,运行ffmpeg硬编解码要么出现nvcuvid版本号未知,要么提示我的库的链接有问题。
三、编译ffmpeg
这个地方也有个大坑:不能在github上下载最新的ffmpeg,只能下载3.X版本的ffmpeg,我选择的是3.4.2。如果是最新版本的,怎么配置编译都不会出现在最后 ffmpeg -hwaccels 的时候出cuvid。
1、 下载ffmpeg: wget http://ffmpeg.org/releases/ffmpeg-3.4.2.tar.gz && tar zxvf ffmpeg-3.4.2.tar.gz
2、下载安装nv-codec-headers,注意不能下载最新版本11的,最新的版本要求nvidia驱动455以上,而Tesla V100适合的驱动是440,所以不能下载最新版本。我选择的是9.1版本。下载地址:https://github.com/FFmpeg/nv-codec-headers,不要选择master下载,而是选择9.1版本下载(后来看nvidia Video-Codec-Sdk上的官方文档,对于ffmpeg 3.X版本的应该下载8.0版本,但是我下载了9.1版本也过了)
下载后:
cd nv-codec-headers
make
sudo make install
3、安装依赖库
1)sudo apt-get -y install autoconf automake build-essential libass-dev libfreetype6-dev \
libsdl2-dev libtheora-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev \
libxcb-xfixes0-dev pkg-config texinfo zlib1g-dev
2)apt-get install yasm -y && apt-get install libx264-dev -y && apt-get install libx265-dev -y && \
apt-get install libvpx-dev -y && \
apt-get install libfdk-aac-dev -y && \
apt-get install libmp3lame-dev -y && \
apt-get install libopus-dev -y
4、安装nvenc
sudo apt-get -y install glew-utils libglew-dev libglew1.13 \
libglewmx-dev freeglut3 freeglut3-dev libghc-glut-dev \
libghc-glut-prof libalut-dev libxmu-dev libxmu-headers libxmu6 \
libxmuu-dev libxmuu1
5、编译ffmpeg
进入ffmpeg
./configure --prefix=/usr/local/ffmpeg --disable-asm --disable-x86asm \
--enable-cuda --enable-cuvid --enable-nvenc \
--enable-nonfree --enable-libnpp \
--extra-cflags=-I/usr/local/cuda/include \
--extra-cflags=-fPIC --extra-ldflags=-L/usr/local/cuda/lib64 \
--enable-gpl --enable-libx264 --enable-libx265 \
--enable-shared \
--enable-libass \
--enable-libfdk-aac \
--enable-libfreetype \
--enable-libmp3lame \
--enable-libopus \
--enable-libtheora \
--enable-libvorbis
make -j32
sudo make install
6、配置环境:
sudo vi /root/.bashrc (我是在docker中用root用户安装的)
加入以下内容
export FFMPEG_HOME=/usr/local/ffmpeg
export PATH=$PATH:$FFMPEG_HOME/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$FFMPEG_HOME/lib #添加动态库路径
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$FFMPEG_HOME/lib/pkgconfig:/usr/local/lib
执行
source ~/.bashrc
7、检查是否正确
执行 ffmpeg -hwaccels 查看是否支持硬件加速选项
如果出来了cuvid,则说明编译成功了,可以通过 ffmpeg -codecs | grep cuvid 来查看cuvid支持的编解码协议。
DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_cuvid ) (encoders: libx264 libx264rgb h264_nvenc nvenc nvenc_h264 )
DEV.L. hevc H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_cuvid ) (encoders: libx265 nvenc_hevc hevc_nvenc )
DEVIL. mjpeg Motion JPEG (decoders: mjpeg mjpeg_cuvid )
DEV.L. mpeg1video MPEG-1 video (decoders: mpeg1video mpeg1_cuvid )
DEV.L. mpeg2video MPEG-2 video (decoders: mpeg2video mpegvideo mpeg2_cuvid )
DEV.L. mpeg4 MPEG-4 part 2 (decoders: mpeg4 mpeg4_cuvid )
D.V.L. vc1 SMPTE VC-1 (decoders: vc1 vc1_cuvid )
DEV.L. vp8 On2 VP8 (decoders: vp8 libvpx vp8_cuvid ) (encoders: libvpx )
DEV.L. vp9 Google VP9 (decoders: vp9 libvpx-vp9 vp9_cuvid ) (encoders: libvpx-vp9 )
如果没有出现cuvid,则说明没有成功,回去检查配置,或者下载的版本是否正确
四、转码测试
ffmpeg -i input.flv -c:v h264_nvenc -c:a aac output.mp4
docker+nvidia+ffmpeg实现GPU硬编解码手记
最新推荐文章于 2024-04-14 18:46:08 发布