参考文档
这篇文章不是在docker内的
编译过程写的非常详细了,亲测可以使用
注意ffmpeg版本要3.x, 我用4.3 4.2都没有成功
0.安装依赖
yum install autoconf automake bzip2 cmake freetype-devel gcc gcc-c++ git libtool make mercurial pkgconfig zlib-devel
1. 首先宿主机要有显卡驱动
这里省略掉可
2. 再 安装nvidia-docker
3. 再下载 nvidia的基础镜像
选择合适的版本,我选择的是
nvidia/cuda:10.2-cudnn7-devel-centos7
带devel
字样的 ,里面才有nvcc -V
命令
10.2
是cuda
版本
4. 编写Dockerfile
具体如何下载源码包,可以到最上面的参考文档博客中找
https://www.jianshu.com/p/59da3d350488
或者我的分享连接
链接: https://pan.baidu.com/s/1bDxEWuJvD9Mlj79zHHbWFA 密码: f4an
FROM nvidia/cuda:10.2-cudnn7-devel-centos7
MAINTAINER tenten "vtenten@163.com"
WORKDIR /work
RUN mkdir ffmpeg_source
# 更换yum源
COPY ./docker_env/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo
RUN yum makecache && yum install -y autoconf automake bzip2 cmake freetype-devel gcc gcc-c++ git libtool make mercurial pkgconfig zlib-devel zip unzip
# 编译 nasm-2.13.02
ADD ./ffmpeg_souRUN cd ffmpeg_source/nasm-2.13.02 && ./autogen.sh && ./configure --prefix="/root/ffmpeg_build" --bindir="/root/bin" && make && make install
# 设置bin目录 lib
ENV PATH="/root/bin:${PATH}"
ENV LD_LIBRARY_PATH="/root/ffmpeg_build/lib"
ENV PKG_CONFIG_PATH="/root/ffmpeg_build/lib/pkgconfig"
# 编译 yasm-1.3.0
ADD ./ffmpeg_source/yasm-1.3.0.tar.gz ./ffmpeg_source/
RUN cd ffmpeg_source/yasm-1.3.0 && ./configure --prefix="/root/ffmpeg_build" --bindir="/root/bin" && make && make install
# 编译 x264
ADD ./ffmpeg_source/x264.tar.gz ./ffmpeg_source/rce/nasm-2.13.02.tar.bz2 ./ffmpeg_source/
RUN cd ffmpeg_source/x264 && ./configure --prefix="/root/ffmpeg_build" --bindir="/root/bin" --enable-static && make && make install
# 编译 libfdk_acc
ADD ./ffmpeg_source/fdk-aac.tar.gz ./ffmpeg_source/
RUN cd ffmpeg_source/fdk-aac && autoreconf -fiv && ./configure --prefix="/root/ffmpeg_build" --disable-sharedi && make && make install
# 编译 libmp3lame
ADD ./ffmpeg_source/lame-3.100.tar.gz ./ffmpeg_source/
RUN cd ffmpeg_source/lame-3.100 && ./configure --prefix="/root/ffmpeg_build" --bindir="/root/bin" --disable-shared --enable-nasm && make && make install
# 编译 nv-codec-headers
ADD ./ffmpeg_source/nv-codec-headers.tar.gz ./ffmpeg_source/
RUN cd ffmpeg_source/nv-codec-headers && make PREFIX="/root/ffmpeg_build" BINDDIR="/root/bin" && make install PREFIX="/root/ffmpeg_build" BINDDIR="/root/bin"
# 编译 ffmpeg
ADD ./ffmpeg_source/ffmpeg-3.3.8.tar.bz2 ./ffmpeg_source/
RUN cd ffmpeg_source/ffmpeg-3.3.8 && ./configure --prefix="/root/ffmpeg_build" --pkg-config-flags="--static" \
--extra-cflags="-I/root/ffmpeg_build/include -I/usr/local/cuda/include" \
--extra-ldflags="-L/root/ffmpeg_build/lib -L/usr/local/cuda/lib64" \
--extra-libs=-lpthread --extra-libs=-lm --bindir="/root/bin" \
--enable-gpl --enable-libfdk_aac --enable-libmp3lame --enable-libx264 --enable-nonfree \
--enable-cuda \
--enable-cuvid \
--enable-nvenc \
--enable-libnpp \
&& make && make install && hash -r
测试
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i 1.mp4 -c:v h264_nvenc -b:v 2048k -vf scale_npp=1280:-1 -y out.mp4
错误信息
使用测试命令,可能会报如下错误
Cannot load libnvcuvid.so.1
Cannot load libnvidia-encode.so.1
因为docker容器内没有这两个文件,经过我查找发现,在宿主机中有,我们需要拷贝今容器内,然后再作一个软连接。
ubuntu 系统
# 在这些目录下查找上述文件
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
centos系统
# 在下面这个目录里
/lib64/nvidia
找到这两个文件,我们发现,他们其实是软连接
我们ll
命令文件,找到原始文件,
libnvcuvid.so.440.100
libnvidia-encode.so.440.100
后面的尾号可能不一样,它是显卡驱动版本号,
我们把这个拷贝到docker中,然后软连接
# 宿主机
/usr/lib/x86_64-linux-gnu/libnvcuvid.so.440.100
/usr/lib/x86_64-linux-gnu/libnvidia-encode.so.440.100
# 拷贝到docker这里
/lib64/libnvcuvid.so.440.100
/lib64/libnvidia-encode.so.440.100
# docker内软连接
ln -s /lib64/libnvcuvid.so.440.100 /lib64/libnvcuvid.so.1
ln -s /lib64/libnvidia-encode.so.440.100 /lib64/libnvidia-encode.so.1
# 然后上面的操作,也最好写在dockerfile内