docker+nvidia+ffmpeg实现GPU硬编解码手记

弄了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
 
 

你可能感兴趣的:(cuda,docker,gpu,ffmpeg)