東京生まれHOUSE MUSIC育ち

悪そうな奴はだいたい友達なの?

録画サーバーの構築手順(Ubuntu22.04でMirakurunとEPGStation)


スポンサードリンク

書いていたら長くなったので、目次です。

2023年5月に録画サーバーを再構築しました。手順をまとめていますので、新しい手順を参照したい方は「録画サーバーの構築手順(2023年5月版)」をご覧ください。

1. はじめに

録画サーバーを構築しました。今は旧サーバーと新サーバーを並行運転しています。もうしばらく並行運転で運用して、いくつかの問題はあるもののこのまま切り替えてしまっても大丈夫だと考えました。

そこで、改めてOSからクリーンインストールしました。

この記事では、録画サーバーをクリーンインストールで構築した手順をまとめます。この手順利用するとテレビ番組を録画して、NVIDIA製品を使用したハードウエアエンコードができるようになります。

様々な記事を参考にさせていただきました。

録画サーバーは個人開発や検証で自分の勉強するためにも使用します。今後のことも考えて、できるだけ最新のパッケージを使用したいと考えています。そこで、以下の記事で公開されているシェルスクリプトをベースに自分の手順にしました。先人の知恵に感謝です。

2022年1月版 15分でできる自宅録画サーバー(Ubuntu 20.04) - Simple Life in the digital age

2. 構成の変化

新サーバーで使用しているサーバーのハード構成は以下の記事を参考にしてください。

nomusicnolife.hatenablog.com

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の最新バージョンを確認します。

Releases · 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はこういうのができるから便利です。