書いていたら長くなったので、目次です。
2023年5月に録画サーバーを再構築しました。手順をまとめていますので、新しい手順を参照したい方は「録画サーバーの構築手順(2023年5月版)」をご覧ください。
- 1. はじめに
- 2. 構成の変化
- 3. 構築手順
- 3.1. OSインストール
- 3.2. パッケージのアップデート
- 3.3. SSHの設定
- 3.4. 録画サーバーに必要なパッケージをインストールする
- 3.5. dockerのインストール
- 3.6. docker-composeのインストール
- 3.7. カードリーダーのドライバーをインストール
- 3.8. チューナーのドライバーをインストール
- 3.9. ビデオカードのドライバーインストール
- 3.10. cudaのインストール
- 3.11. ffmpegのインストール
- 3.12. NVIDIA/nvidia-dockerのインストールする
- 3.13. dockerファイルや定義ファイルをダウンロード
- 3.14. カスタマイズ
- 4. GitHubにPUSH
1. はじめに
録画サーバーを構築しました。今は旧サーバーと新サーバーを並行運転しています。もうしばらく並行運転で運用して、いくつかの問題はあるもののこのまま切り替えてしまっても大丈夫だと考えました。
そこで、改めてOSからクリーンインストールしました。
この記事では、録画サーバーをクリーンインストールで構築した手順をまとめます。この手順利用するとテレビ番組を録画して、NVIDIA製品を使用したハードウエアエンコードができるようになります。
様々な記事を参考にさせていただきました。
録画サーバーは個人開発や検証で自分の勉強するためにも使用します。今後のことも考えて、できるだけ最新のパッケージを使用したいと考えています。そこで、以下の記事で公開されているシェルスクリプトをベースに自分の手順にしました。先人の知恵に感謝です。
2022年1月版 15分でできる自宅録画サーバー(Ubuntu 20.04) - Simple Life in the digital age
2. 構成の変化
新サーバーで使用しているサーバーのハード構成は以下の記事を参考にしてください。
OSやソフトウエアは以下のように変化しています。
2.1. 旧サーバー
- OS:CentOS7.4
- チューナーアプリ:mirakurun2.7.0
- 録画アプリ:chinachuγ
2.2. 新サーバー
OSを変更し、dockerを利用したmirakurun・EPGStationの構成に変更しました。
- OS:Ubuntu22.04
- チューナーアプリ:mirakurun3.8.0
- 録画アプリ:EPGStation2.6.20
3. 構築手順
参考にしたページにはシェルが提供されています。シェルでラッピングされると、どのような処理をしているのかが見えにくいです。
そのため、コマンドを手入力する手順にしています。ただ、dockerを使用しているので、それほど手間ではないと思います。
ansibleで作ろうと試みました。が、これまでRHELやCentOSをメインに使用してきた私にはUbuntuの方言にまだ慣れてなくて、もう少し慣れてからansibleのplaygook作成に挑戦しようと考えています。
3.1. OSインストール
Ubuntu22.04のインストールはウィザードにお任せで進みます。
3.2. パッケージのアップデート
まずはパッケージのアップデートを実施します。
sudo apt update && sudo apt upgrade -y
3.3. SSHの設定
次にSSHを設定します。
Ubuntuに慣れていないこともあり、ターミナルを使用してのコピペに慣れません。UNIX特有の真ん中のホイールをクリックで貼り付けが使いにくいです。なので、手元のパソコンからSSHで操作できるようにします。
参考にした記事。
sudo systemctl status ssh ● ssh.service - OpenBSD Secure Shell server Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2022-09-14 19:42:23 JST; 26s ago Docs: man:sshd(8) man:sshd_config(5) Main PID: 40770 (sshd) Tasks: 1 (limit: 18847) Memory: 1.7M CPU: 12ms CGroup: /system.slice/ssh.service └─40770 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
sudo systemctl status ssh
3.4. 録画サーバーに必要なパッケージをインストールする
dockerを等をインストールするのに必要なパッケージをインストールします。
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release \
dkms \
git
3.5. dockerのインストール
以下の公式サイトの手順にのっとって、dockerをインストールします。
Install Docker Engine on Ubuntu | Docker Documentation
sudo apt-get update
DockerのGPG Keyを追加します。
sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
リポジトリを設定します。
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
準備が整ったところで、dockerをインストールします。
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
上記の公式サイトの手順でインストールできたら、バージョンを確認します。バージョンは2022年9月14日に確認したものです。
docker --version
Docker version 20.10.18, build b40c2f6
sudoしなくてもdockerを起動できるように設定します。
sudo usermod -aG docker $USER
3.6. docker-composeのインストール
docker domposeは2022年4月にバージョン2の一般提供が開始されました。バージョン1の保守期間も考慮して、バージョン2をインストールしていきます。
以下のURLでdocker composeの最新バージョンを確認します。
docker-composeは2.10.2が最新なので、URLをそれに合わせて書き換えます。
sudo curl -L "https://github.com/docker/compose/releases/download/v2.10.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
インストールしたdocker-composeに実行権限を付与します。
sudo chmod +x /usr/local/bin/docker-compose
バージョンを確認します。
docker-compose --version
以下のように出力されます。
docker-compose --version Docker Compose version v2.10.2
3.7. カードリーダーのドライバーをインストール
BCasカードを使用するためのカードリーダーのドライバーをインストールします。
カードリーダーに必要なパッケージをインストールします。
sudo apt install -y libpcsclite-dev pcscd pcsc-tools libccid
pcsc_scan
以下が表示されます。
Using reader plug'n play mechanism Scanning present readers... 0: SCM Microsystems Inc. SCR 3310 [CCID Interface] 00 00 Wed Sep 14 20:05:52 2022 Reader 0: SCM Microsystems Inc. SCR 3310 [CCID Interface] 00 00 Event number: 0 Card state: Card inserted, ATR: 3B F0 12 00 FF 91 81 B1 7C 45 1F 03 99 ATR: 3B F0 12 00 FF 91 81 B1 7C 45 1F 03 99 + TS = 3B --> Direct Convention + T0 = F0, Y(1): 1111, K: 0 (historical bytes) TA(1) = 12 --> Fi=372, Di=2, 186 cycles/ETU 21505 bits/s at 4 MHz, fMax for Fi = 5 MHz => 26881 bits/s TB(1) = 00 --> VPP is not electrically connected TC(1) = FF --> Extra guard time: 255 (special value) 3. TD(1) = 91 --> Y(i+1) = 1001, Protocol T = 1 ----- TA(2) = 81 --> Protocol to be used in spec mode: T=1 - Unable to change - defined by interface bytes 4. TD(2) = B1 --> Y(i+1) = 1011, Protocol T = 1 ----- TA(3) = 7C --> IFSC: 124 TB(3) = 45 --> Block Waiting Integer: 4 - Character Waiting Integer: 5 5. TD(3) = 1F --> Y(i+1) = 0001, Protocol T = 15 - Global interface bytes following ----- TA(4) = 03 --> Clock stop: not supported - Class accepted by the card: (3G) A 5V B 3V + Historical bytes: + TCK = 99 (correct checksum) Possibly identified card (using /usr/share/pcsc/smartcard_list.txt): 3B F0 12 00 FF 91 81 B1 7C 45 1F 03 99 Japanese Chijou Digital B-CAS Card (pay TV)
pcscdは使用しないため、停止します。
sudo systemctl stop pcscd.socket
sudo systemctl disable pcscd.socket
sudo systemctl status pcscd.socket
3.8. チューナーのドライバーをインストール
次にチューナーのドライバーをインストールします。ここでは、非公式のLinuxドライバーをインストールしていきます。
https://github.com/nns779/px4_drv
以下のGitHubに公開されている手順にのっとってインストールしていきます。
git@github.com:nns779/px4_drv.git
cd px4_drv/fwtool/
make
wget http://plex-net.co.jp/plex/pxw3u4/pxw3u4_BDA_ver1x64.zip -O pxw3u4_BDA_ver1x64.zip
unzip -oj pxw3u4_BDA_ver1x64.zip pxw3u4_BDA_ver1x64/PXW3U4.sys
./fwtool PXW3U4.sys it930x-firmware.bin
sudo mkdir -p /lib/firmware
sudo cp it930x-firmware.bin /lib/firmware/
cd ../
sudo cp -a ./ /usr/src/px4_drv-0.2.1
sudo dkms add px4_drv/0.2.1
sudo dkms install px4_drv/0.2.1
read -p "ドライバがインストールされました。enterキーを押すとリブートします。"
sudo reboot
カーネルモジュールのロード確認
lsmod | grep -e ^px4_drv
以下のように表示されます。
px4_drv 172032 0
以下のように表示されればOKです。なお、私が使用しているチューナーの表示です。0から7までの8つのチューナーがあるように表示されてます。
デバイスファイルの確認
ll /dev/pxmlt8video*
crw-rw-r-- 1 root video 508, 0 9月 14 20:12 /dev/pxmlt8video0
crw-rw-r-- 1 root video 508, 1 9月 14 20:12 /dev/pxmlt8video1
crw-rw-r-- 1 root video 508, 2 9月 14 20:12 /dev/pxmlt8video2
crw-rw-r-- 1 root video 508, 3 9月 14 20:12 /dev/pxmlt8video3
crw-rw-r-- 1 root video 508, 4 9月 14 20:12 /dev/pxmlt8video4
crw-rw-r-- 1 root video 508, 5 9月 14 20:12 /dev/pxmlt8video5
crw-rw-r-- 1 root video 508, 6 9月 14 20:12 /dev/pxmlt8video6
crw-rw-r-- 1 root video 508, 7 9月 14 20:12 /dev/pxmlt8video7
3.9. ビデオカードのドライバーインストール
私はハードウエアエンコードをしますので、ビデオカードのドライバーをインストールします。
以下を参考にドライバーをインストールします。
ubuntuにCUDA、nvidiaドライバをインストールするメモ - Qiita
使用しているGPUの確認
lspci | grep -i nvidia
以下のように表示されます。
01:00.0 VGA compatible controller: NVIDIA Corporation TU116 [GeForce GTX 1650] (rev a1)
01:00.1 Audio device: NVIDIA Corporation TU116 High Definition Audio Controller (rev a1)
01:00.2 USB controller: NVIDIA Corporation TU116 USB 3.1 Host Controller (rev a1)
01:00.3 Serial bus controller: NVIDIA Corporation TU116 USB Type-C UCSI Controller (rev a1)
以下で推奨のドライバーを確認します。
ubuntu-drivers devices
私は以下のように表示されます。使用しているビデオカードによって表示が異なります。
recommendedされているので、「driver : nvidia-driver-515 - distro non-free recommended」を入れましょう。
$ ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00002188sv00001462sd00008D97bc03sc00i00
vendor : NVIDIA Corporation
model : TU116 [GeForce GTX 1650]
driver : nvidia-driver-515-server - distro non-free
driver : nvidia-driver-470-server - distro non-free
driver : nvidia-driver-510-server - distro non-free
driver : nvidia-driver-515 - distro non-free recommended
driver : nvidia-driver-510 - distro non-free
driver : nvidia-driver-450-server - distro non-free
driver : nvidia-driver-470 - distro non-free
driver : xserver-xorg-video-nouveau - distro free builtin
repoを追加
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
レコメンされていた以下の515のナンバリングをインストールします。
sudo apt install nvidia-driver-515
この後はrebootです。
sudo reboot
reboot後にnvidia-smi
で状態を確認します。コマンドが通ればOKです。
$ nvidia-smi
Wed Sep 14 20:25:01 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 515.65.01 Driver Version: 515.65.01 CUDA Version: 11.7 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... Off | 00000000:01:00.0 On | N/A |
| 30% 38C P8 8W / 75W | 336MiB / 4096MiB | 2% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 1062 G /usr/lib/xorg/Xorg 206MiB |
| 0 N/A N/A 1317 G /usr/bin/gnome-shell 125MiB |
| 0 N/A N/A 1678 G ...bexec/gnome-initial-setup 1MiB |
+-----------------------------------------------------------------------------+
3.10. cudaのインストール
次にcudaをインストールします。cudaとは何か?というのは、wikipediaがわかりやすいと思います。CUDA - Wikipedia
誤解を恐れずにざっくりいうと、プログラムからビデオカードを操作できるようにするための実行環境といったところです。
以下のように、自分の環境に合った手順が表示されます。ほとんど何も考えずに、コマンドを入力していくだけです。
CUDA Toolkit 11.7 Update 1 Downloads | NVIDIA Developer
実際に投入したのは以下のコマンド群です。
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb
sudo dpkg -i cuda-keyring_1.0-1_all.deb
sudo apt-get update
sudo apt-get -y install cuda
3.11. ffmpegのインストール
dockerで動くEPGStationでのエンコードに失敗することがあるので、Ubuntu22.04からもエンコードできるようにします。そのため、ffmpegをインストールします。
この手順で入れると、デコーダーとしてnvencも使用可能となります。
Ubuntu 22.04 LTSへのFFmpegのインストール | ジコログ
sudo apt-get update
sudo apt-get -y install ffmpeg
エンコーダーの確認
$ ffmpeg -encoders | grep -i nvidia
ffmpeg version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 11 (Ubuntu 11.2.0-19ubuntu1)
configuration: --prefix=/usr --extra-version=0ubuntu0.22.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
V....D h264_nvenc NVIDIA NVENC H.264 encoder (codec h264)
V..... nvenc NVIDIA NVENC H.264 encoder (codec h264)
V..... nvenc_h264 NVIDIA NVENC H.264 encoder (codec h264)
V..... nvenc_hevc NVIDIA NVENC hevc encoder (codec hevc)
V....D hevc_nvenc NVIDIA NVENC hevc encoder (codec hevc)
エンコードオプションの確認
ffmpeg -h encoder=hevc_nvenc
ffmpeg version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 11 (Ubuntu 11.2.0-19ubuntu1)
configuration: --prefix=/usr --extra-version=0ubuntu0.22.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
Encoder hevc_nvenc [NVIDIA NVENC hevc encoder]:
General capabilities: dr1 delay hardware
Threading capabilities: none
Supported hardware devices: cuda cuda
Supported pixel formats: yuv420p nv12 p010le yuv444p p016le yuv444p16le bgr0 rgb0 cuda
hevc_nvenc AVOptions:
-preset <int> E..V....... Set the encoding preset (from 0 to 18) (default p4)
default 0 E..V.......
slow 1 E..V....... hq 2 passes
medium 2 E..V....... hq 1 pass
fast 3 E..V....... hp 1 pass
hp 4 E..V.......
hq 5 E..V.......
bd 6 E..V.......
ll 7 E..V....... low latency
llhq 8 E..V....... low latency hq
llhp 9 E..V....... low latency hp
lossless 10 E..V....... lossless
losslesshp 11 E..V....... lossless hp
p1 12 E..V....... fastest (lowest quality)
p2 13 E..V....... faster (lower quality)
p3 14 E..V....... fast (low quality)
p4 15 E..V....... medium (default)
p5 16 E..V....... slow (good quality)
p6 17 E..V....... slower (better quality)
p7 18 E..V....... slowest (best quality)
-tune <int> E..V....... Set the encoding tuning info (from 1 to 4) (default hq)
hq 1 E..V....... High quality
ll 2 E..V....... Low latency
ull 3 E..V....... Ultra low latency
lossless 4 E..V....... Lossless
-profile <int> E..V....... Set the encoding profile (from 0 to 4) (default main)
main 0 E..V.......
main10 1 E..V.......
rext 2 E..V.......
-level <int> E..V....... Set the encoding level restriction (from 0 to 186) (default auto)
auto 0 E..V.......
1 30 E..V.......
1.0 30 E..V.......
2 60 E..V.......
2.0 60 E..V.......
2.1 63 E..V.......
3 90 E..V.......
3.0 90 E..V.......
3.1 93 E..V.......
4 120 E..V.......
4.0 120 E..V.......
4.1 123 E..V.......
5 150 E..V.......
5.0 150 E..V.......
5.1 153 E..V.......
5.2 156 E..V.......
6 180 E..V.......
6.0 180 E..V.......
6.1 183 E..V.......
6.2 186 E..V.......
-tier <int> E..V....... Set the encoding tier (from 0 to 1) (default main)
main 0 E..V.......
high 1 E..V.......
-rc <int> E..V....... Override the preset rate-control (from -1 to INT_MAX) (default -1)
constqp 0 E..V....... Constant QP mode
vbr 1 E..V....... Variable bitrate mode
cbr 2 E..V....... Constant bitrate mode
vbr_minqp 8388612 E..V....... Variable bitrate mode with MinQP (deprecated)
ll_2pass_quality 8388616 E..V....... Multi-pass optimized for image quality (deprecated)
ll_2pass_size 8388624 E..V....... Multi-pass optimized for constant frame size (deprecated)
vbr_2pass 8388640 E..V....... Multi-pass variable bitrate mode (deprecated)
cbr_ld_hq 8388616 E..V....... Constant bitrate low delay high quality mode
cbr_hq 8388624 E..V....... Constant bitrate high quality mode
vbr_hq 8388640 E..V....... Variable bitrate high quality mode
-rc-lookahead <int> E..V....... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0)
-surfaces <int> E..V....... Number of concurrent surfaces (from 0 to 64) (default 0)
-cbr <boolean> E..V....... Use cbr encoding mode (default false)
-2pass <boolean> E..V....... Use 2pass encoding mode (default auto)
-gpu <int> E..V....... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from -2 to INT_MAX) (default any)
any -1 E..V....... Pick the first device available
list -2 E..V....... List the available devices
-delay <int> E..V....... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX)
-no-scenecut <boolean> E..V....... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
-forced-idr <boolean> E..V....... If forcing keyframes, force them as IDR frames. (default false)
-spatial_aq <boolean> E..V....... set to 1 to enable Spatial AQ (default false)
-spatial-aq <boolean> E..V....... set to 1 to enable Spatial AQ (default false)
-temporal_aq <boolean> E..V....... set to 1 to enable Temporal AQ (default false)
-temporal-aq <boolean> E..V....... set to 1 to enable Temporal AQ (default false)
-zerolatency <boolean> E..V....... Set 1 to indicate zero latency operation (no reordering delay) (default false)
-nonref_p <boolean> E..V....... Set this to 1 to enable automatic insertion of non-reference P-frames (default false)
-strict_gop <boolean> E..V....... Set 1 to minimize GOP-to-GOP rate fluctuations (default false)
-aq-strength <int> E..V....... When Spatial AQ is enabled, this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive) (from 1 to 15) (default 8)
-cq <float> E..V....... Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0)
-aud <boolean> E..V....... Use access unit delimiters (default false)
-bluray-compat <boolean> E..V....... Bluray compatibility workarounds (default false)
-init_qpP <int> E..V....... Initial QP value for P frame (from -1 to 51) (default -1)
-init_qpB <int> E..V....... Initial QP value for B frame (from -1 to 51) (default -1)
-init_qpI <int> E..V....... Initial QP value for I frame (from -1 to 51) (default -1)
-qp <int> E..V....... Constant quantization parameter rate control method (from -1 to 51) (default -1)
-weighted_pred <int> E..V....... Set 1 to enable weighted prediction (from 0 to 1) (default 0)
-b_ref_mode <int> E..V....... Use B frames as references (from 0 to 2) (default disabled)
disabled 0 E..V....... B frames will not be used for reference
each 1 E..V....... Each B frame will be used for reference
middle 2 E..V....... Only (number of B frames)/2 will be used for reference
-a53cc <boolean> E..V....... Use A53 Closed Captions (if available) (default true)
-s12m_tc <boolean> E..V....... Use timecode (if available) (default false)
-dpb_size <int> E..V....... Specifies the DPB size used for encoding (0 means automatic) (from 0 to INT_MAX) (default 0)
-multipass <int> E..V....... Set the multipass encoding (from 0 to 2) (default disabled)
disabled 0 E..V....... Single Pass
qres 1 E..V....... Two Pass encoding is enabled where first Pass is quarter resolution
fullres 2 E..V....... Two Pass encoding is enabled where first Pass is full resolution
-ldkfs <int> E..V....... Low delay key frame scale; Specifies the Scene Change frame size increase allowed in case of single frame VBV and CBR (from 0 to 255) (default 0)
3.12. NVIDIA/nvidia-dockerのインストールする
dockerからビデオカードを操作するには、もう一手間かける必要があります。
nvida-dockerというのを入れるのです。以下のドキュメントにインストール方法が掲載されています。
Installation Guide — NVIDIA Cloud Native Technologies documentation
具体的には以下のコマンドで構築します。
リポジトリとGPG Keyを設定します。
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
nvidia-dockerとしてnvidia-docker2を入れます。
sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker
dockerでnvidia-smiが動くかを確認します。
$ docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi
Wed Sep 14 12:36:33 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 515.65.01 Driver Version: 515.65.01 CUDA Version: 11.7 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... Off | 00000000:01:00.0 Off | N/A |
| 30% 34C P8 4W / 75W | 394MiB / 4096MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
+-----------------------------------------------------------------------------+
3.13. dockerファイルや定義ファイルをダウンロード
私はビデオカードを使用したハードウエアエンコードをしたいので、ちょっとイレギュラーです。
ハードウエアエンコードは他の方も希望されているようです。
本家に以下のIssueがあって、私と同じようにハードウエアエンコードされている方がいました。
ffmpegを入れたdckerfileの扱い · Issue #541 · l3tnun/EPGStation
Issueをたてた方がハードウエアエンコードするためのEPGStationを公開されているので、こちらを利用させていただきました。リポジトリは以下です。
https://github.com/kazuki0824/EPGStation-nvenc-docker
このリポジトリをcloneして、setup.shを動かせば動作します。
3.14. カスタマイズ
リポイトリをベースに自分用にカスタマイズしました。
3.14.1. mirakurunのconfig
- TV局のtunner.ymlは関東地上波だけにする
3.14.2. docker-compose.ymlの変更
- チューナーを自分が使用している型番に変更
3.14.3. EPGStationのconfig.yml変更
- ハードウエアエンコード用のシェルを追加
- 録画後、ハードウエアエンコードできるようにする(エンコードオプションに表示されるようにする)
- 同時にエンコードできる数を1から2に変更
- 録画データの保存先を変更
具体的な設定内容は以下のとおりです。ハードウエアエンコード用に設定を追加・変更しました。
encodeProcessNum: 2 concurrentEncodeNum: 2 encode: - name: H265/nvenc cmd: /bin/bash %ROOT%/config/enc_nvenc.sh suffix: _nvenc.mp4 rate: 4.0
また、enc_nvenc.sh
の内容は以下のとおりです。シンプルに1行だけ書いてます。
ffmpeg -i "$INPUT" -vcodec hevc_nvenc -preset p6 "$OUTPUT"
3.14.4. その他変更
- ルールのリストア
4. GitHubにPUSH
と、ここまでで大体1時間ぐらいです。ビデオカード周りのファイルが大きいようで、ダウンロードなどに時間がかかるんですよね。
動いているのを確認したので、いつでも再構築できるようにGitHubにPUSHします。dockerはこういうのができるから便利です。