NVIDIA GPUサーバでハードウェア対応ffmpegを動かす（１）インストール編

Ubuntu 18.04のAMDサーバにGPUを積んだのでエンコード環境を整えることにしました。
### ffmpeg
サイト「俺の外付けHDD」様に良くまとまっているようです。encdecいろいろ出来るのがffmpegです。
https://nyanshiba.hatenablog.com/entry/2018/02/03/071256

### 環境の確認
私の環境はUbuntu18.04です。下記サイトを参照して実機のドライババージョンやnvcc環境、GPU使用状況を確認しました。
https://qiita.com/sao_rio/items/4ef5604d685f04669f74

### NGCコンテナ

https://catalog.ngc.nvidia.com/orgs/nvidia/containers/tensorflow

まず、ベースとなるコンテナをNVIDIAのコンテナカタログNGC からダウンロードします。
Pullコマンドをコピペさせるボタンもあり、簡単です。ここではTensorflowをダウンロードします。

```
docker pull nvcr.io/nvidia/tensorflow:21.11-tf2-py3
```

つぎに、 docker runコマンドを走らせます。--gpusの後は必ずしもallでなくともいいかもしれません。1-2でも良いかもしれません。

```
docker run --gpus all --runtime nvidia -it --rm -v local_dir:continer_dir -v /dev/video0:/dev/video0 nvcr.io/nvidia/tensorflow:21.11-tf-py3
```

+ -itはインタラクティブモード、ターミナルへの入出力あり
+ --rmはコンテナ終了時にコンテナが削除されます
+ -v はマウント元ホストディレクトリ:マウント先ホストディレクトリです。コンテナ終了しても作業結果は残ります。Webカメラを使うなどで/dev/video0もマウントしました


その他run　のオプションは --runtime nvidia, --privilegeあたりがあれば大丈夫と思います。詳細は下記にてご確認ください。

::: note info 

https://docs.nvidia.com/deeplearning/frameworks/user-guide/index.html#runcont

:::

### NVIDIAハードウェア対応ffmpeg

https://docs.nvidia.com/video-technologies/video-codec-sdk/ffmpeg-with-nvidia-gpu/

コンテナを起動したら、NVIDIA公式 ffmpegモジュールの追加を試みます。手順はリンク先の通りですが、 ポイントは下記３つだけとシンプルです。一か所 configure前にcd xxxが抜けているのでそこは適宜移動しましょう。

+ nvcodecヘッダを取ってくる
+ ffmpegをgit cloneする
+ configure & make

nvcodec-headersを取ってきます

```
git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
```
ffnvcodecのインストール

```
cd nv-codec-headers && sudo make install && cd -
```

FFmpegを公式リポジトリからクローン

```
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg/
```

必須パッケージのインストール

```
apt update -U apt （これをしないとyasmが見つからなかった）
sudo apt-get install build-essential yasm cmake libtool libc6-dev wget unzip libbnuma2 libnuma-dev
```

Configure, make, install

```
./configure --enable-nonfree --enable-cuda-nvcc --enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64 --disable-static -enable-shared

make -j 8

sudo make install 
```

共有ライブラリの設定

```
hoge$ ldd /usr/bin/ffmpeg
 # 必要な共有ライブラリが表示される
hoge$ echo LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib
```
これで ffmpeg -hwaccell が使えるようになりました。



### myoshimi氏 docker_runでビデオエンコード

myoshimiさんもハードウェア対応ffmpegをGitHubに公開されています。

2016年の記事ですが、ソフトウェアコーデックもlibx264, libx265が有効です。ffmpeg-4.1.1 がダウンロードされますが、2021年現在 書き換えにより4.4.1がダウンロード可能です。Dockerfileには nvencの記載のみで、nvdecはありませんでした。書き足したらデコードもできるのでは...?

```
　　 --enable-cuda \
	--enable-cuvid \
	--enable-nvenc \
	--enable-libnpp \
```

## buildしてみる
```
$　docker build -t ffmpeg-nvenc
```

とすると、 25/33: x264のダウンロード箇所でSSL証明書エラーが出てストップしました。曰く証明書がないため、git cloneが出来ません。

```
server certificate verification failed. CAfile: /etc/ssl/certs/cacertificates.crt
```
下記、回避策の１行を、Dockerfileの  x264 gitアクセス行直前に追加し、SSLチェックを無効としたところ、イメージが無事に作成されました。

```
$ git config --global http.sslVerify false
```

https://qiita.com/TKR/items/5f23fe5a341e228cf9b5　
https://qastack.jp/programming/21181231/server-certificate-verification-failed-cafile-etc-ssl-certs-ca-certificates-c

```
Step 34/34 : CMD ["--help"]
 ---> Running in 4dbd6489c0d4
Removing intermediate container 4dbd6489c0d4
 ---> d99d5d702eab
Successfully built d99d5d702eab
Successfully tagged ffmpeg-nvenc:latest

$ docker images
ffmpeg-nvenc
```

# 終わりに
NVIDIA製GPUのハードウェアを活用する ffmpegの設定方法を２種類ご紹介しました。Happy video encoding life!