2019/11/1

worklog -- prepare docker container for ffmpeg cuda

用 docker 測試 ffmpeg cuda ..
docker
  • 以daemon 方式執行,使用 ssh 登入
  • ssh login uid/gid 要與 host 端一致
  • 使用 host folder
  • 要 support cuda
要 support cuda,所以用 nvidia 的 docker image。
而且啟動的時候要加上 "--gpu all"
docker run -idt --gpus all -v ~/dockerfolder:/dockerfolder -p 8022:22 nvidia/cuda:10.1-base
docker exec -it container-name bash
進入後...
apt-get update
apt-get install openssh-server vim sudo
/etc/init.d/ssh start
addgroup --gid 1001 myname
adduser --uid 1001 --gid 1001 myname
vi /etc/group  -- add myname to sudo and root group
這樣,已經可以 ssh -p 8022 hostname 登入了..

安裝需要的 compiler 和 tool
sudo apt-get install build-essential pkgconfig

要 install cuda sdk (Toolkit)
chmod a+x cuda_10.1.243_418.87.00_linux.run
sudo ./cuda_10.1.243_418.87.00_linux.run
...
然後依照說明,把 bin 和 so path 加入..
/etc/profil.d/cuda101.sh
export PATH=$PATH:/usr/local/cuda-10.1/bin
/etc/ld.so.conf.d/cuda-10.1.conf
/usr/local/cuda-10.1/target/x86_64-linux/lib
/usr/local/cuda-10.1/lib64
改完 ld.so.conf.d, sudo run 一次 ldconfig 來 update ld cache.
至於 path. 如果不重新開機,就要自己 source 一次。

follow nvidia ffmpeg,因為 ffmpeg 已經把 nvidia 要的 header 分離開來,所以要到 nvidia 下載:
git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
cd nv-codec-headers
make
sudo make install

開始 download and build ffmpeg...
git clone https://git.ffmpeg.org/ffmpeg.git
cd ffmpeg
git checkout n4.2.1
git checkout -b 4.2.1

./configure --prefix=/dockerfolder/cudaffmpeg --enable-cuda-nvcc --enable-cuvid --enable-nvenc
 --enable-nonfree --enable-libnpp --extra-cflags=-I/usr/local/cuda/include
 --extra-ldflags=-L/usr/local/cuda/lib64
make -j10
make install
會安裝到 /dockerfolder/cudaffmpeg 下,
所以還要增加 share library path
export LD_LIBRARY_PATH=/dockerfolder/cudaffmpeg/lib
然後就可以測試...
:/dockerfolder/cudaffmpeg/bin$ ./ffmpeg -version
ffmpeg version N-95607-gb414cff630 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 7 (Ubuntu 7.4.0-1ubuntu1~18.04.1)
configuration: --prefix=/dockerfolder/cudaffmpeg --enable-cuda-nvcc --enable-cuvid --enable-nvenc
 --enable-nonfree --enable-libnpp --extra-cflags=-I/usr/local/cuda/include
 --extra-ldflags=-L/usr/local/cuda/lib64
libavutil      56. 35.101 / 56. 35.101
libavcodec     58. 60.100 / 58. 60.100
libavformat    58. 33.100 / 58. 33.100
libavdevice    58.  9.100 / 58.  9.100
libavfilter     7. 66.100 /  7. 66.100
libswscale      5.  6.100 /  5.  6.100
libswresample   3.  6.100 /  3.  6.100

測試..20sec 的 mp4 轉 h264
time ~/cudaffmpeg/bin/ffmpeg -i testvideo.mp4 -an -vcodec h264_nvenc  testvideo.h264
...
real    0m4.157s
user    0m14.736s
sys     0m0.214s

time ~/cudaffmpeg/bin/ffmpeg -i testvideo.mp4 -an -vcodec libx264  testvideo0.h264
...
real    0m24.757s
user    2m19.679s
sys     0m2.956s
好像快了 10 倍...

一些其他的 ffmpeg, 一般的options..
scale:
ffmpeg -i testvideo.h264 -vf scale=320:240 -vcodec h264_nvenc test320.h264

這個docker container 執行 ffmpeg hvenc 失敗,找不到 libnvidia-encode.so。要用這一篇 的方法加上 capability 參數,enable video 才行。

沒有留言:

張貼留言