Ubuntu

NVENC実戦配備

昨日、NVENCに対応したUbuntuでのハードウェアエンコード環境ができたので、溜まったtsファイルをエンコードしていくことに。

PT2とPT3の複数実装で録画は並列でできるものの、GPUエンコードは並列処理できないと思われるので予約録画の流れでエンコードさせる仕組みは見直し、録画スクリプトはtsファイルを/mnt/ts_pool/10_recordedに移動させたところで終了とする。

yano@GT110b:~$ ll /mnt/ts_pool/
total 76
drwxr-xr-x  6 yano family    97 Feb  3 22:00 ./
drwxr-xr-x 14 root root    4096 Dec  9 17:23 ../
drwxrwxrwx  2 yano family 49152 Feb  4 22:45 10_recorded/
drwxrwxrwx  2 yano family  4096 Feb  4 09:39 19_encode_failed/
drwxrwxrwx  2 yano family 12288 Feb  4 22:45 20_encoded/
drwxrwxrwx  2 yano family 16384 Feb  4 08:02 30_ts_files/
yano@GT110b:~$

10分ごとにcronで起動する周期タスク~/etc/cron.sh/encode_mp4.cron/mnt/ts_pool/10_recordedから古い順に数本ずつピックアップして、エンコードできたのは/mnt/ts_pool/20_encodedに、エラーになったものは/mnt/ts_pool/19_encode_failedに移動させていく仕組みに。PIDFILEを使って重複起動しないようにするのを忘れずに。

yano@GT110b:~$ cat ~/etc/cron.sh/encode_mp4.cron
#!/bin/bash
PATH=/bin:/usr/bin:/sbin:/usr/sbin
NUM_FILES=5
EXT_TS=".ts"
PIDFILE=/home/yano/run/`basename $0`.pid
UUID=`id | sed 's/uid=\([0-9]*\)(.*/\1/'`;
[ $UUID -eq 0 ] && PIDFILE=/var/run/`basename $0`.pid;
if [ -e ${PIDFILE} ];
then
    exit;
fi
echo $$ > ${PIDFILE}
trap "/bin/rm -f ${PIDFILE}; exit" 1 2 3 15
CONFIGFILE=/etc/default/epgrec
# source config info
[ -r ${CONFIGFILE} ] && . ${CONFIGFILE}
TS_FILES=`ls -1 ${TS_RECORDED}/*${EXT_TS} | head -${NUM_FILES}`
for f in ${TS_FILES};
do
    /home/yano/bin/ts2mp4_nvidia.sh $f 2>&1 > /dev/null
    if [ $? -eq 0 ];
    then
        chown ${OWNER} ${MP4DIR}/`basename $f ${EXT_TS}`.mp4;
        mv $f ${TS_ENCODED};
    else
        mv $f ${TS_ENCODE_FAILED};
    fi;
done
if [ -e ${PIDFILE} ];
then
    rm -f ${PIDFILE};
fi
yano@GT110b:~$

参照

www.nodoka.org http://www.nodoka.org/

UbuntuとNVENC

Ubuntuでのハードウェアエンコード環境構築作業は先月18日24日とGStreamer+VAAPIにトライしたもののまだ先が長そうだ。

とはいえGT110bにもひと月分の録画済みファイルが溜まってしまったので、気分転換も兼ねてCUDA改めNVENCを試してみることに。

まずはGT710なMSI GT710 1GD3H LPを突っ込んで、libcudaとnvidiaドライバをインストール。

yano@haswell:~$ sudo apt-get install libcuda1-367 nvidia-367 nvidia-367-dev

nvidiaドライバと喧嘩するらしいnouveauをblacklistに登録して再起動。 続いてCompilationGuide/Ubuntuを読みながら、ffmpegのインストール。と思ったが、気まぐれに"ffmpeg -encoders"を見たところ、“NVIDIA NVENC H.264 encoder"が有効になっている事に気付いた。

yano@haswell:~$ ~/bin/ffmpeg -encoders 2>&1 | grep NVIDIA
 V..... 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..... hevc_nvenc           NVIDIA NVENC hevc encoder (codec hevc)
yano@haswell:~$

ダメ元で

yano@haswell:~$ ~/bin/ffmpeg -i input.ts -vcodec h264_nvenc ouput.mkv
yano@haswell:~$

てな感じで動かしたところ、あっさりエンコードできたっぽい。まだチューニングの余地はあるものの

UbuntuとQSV

昨日構築したQSVハードウェアエンコード環境。

16x32 8bit AVC/H.264って

真空波動研SuperLite 150418より

mp4/720pのエンコードが200fpsを超え、x264ソフトウェアと比較して10分の1以下という強烈な時短効果が得られる結果に満足。

同ファイルサイズ(≒ビットレート)での画質を考えるとx264には遠く及ばないものの、TVのオンエアを録画する観点では充分な印象だ。

ただ気になっているのが、エクスプローラーでの詳細情報で時間などが表示されないこと。

「真空波動研SuperLite」でもちょっとおかしなプロファイル表示になるので、宿題としておきたい。

参照

Qiita http://qiita.com/

大ちゃんのいろいろ雑記 https://www.taruki.com/

Web Net Force http://webnetforce.net/

hirooka.pro https://hirooka.pro/

Kung Noi Blog http://www.goodnai.com/

rigayaの日記兼メモ帳 http://rigaya34589.blog135.fc2.com/

UbuntuとQSV

H97 Pro4は修理に出して、再びUbuntuでのハードウェアエンコード環境構築に着手。

2015年9月にIntel® Media Server StudioのCommunity Editionが無償公開されたので、予てよりこそこそとトライしていたのだが、対応するCPU世代がHaswell以降に限定されてたり、カーネルのカスタマイズ(rebuild)が必要なことからCentOSやカーネル版数の縛りが避けられずUbuntuでの環境構築になかなか難儀。昨年9月公開のIntel Media Server Studio 2017ではカーネルのrebuildも不要になったという噂も耳にしたが、CentOSとUbuntuでは話が異なる事から鵜呑みにするわけにも行かず。

Intel® Media Server StudioではなくVAAPI経由でffmpegから気軽にQSVを使えるレポートがtappieさんから報告されていたので、試してみる事に。

まずはVAAPIドライバのインストール。

yano@haswell:~$ sudo apt-get update
yano@haswell:~$ sudo apt-get install libva1 vainfo i965-va-driver
yano@haswell:~$ vainfo
error: can't connect to X server!
libva info: VA-API version 0.39.2
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_38
libva info: va_openDriver() returns 0
vainfo: VA-API version: 0.39 (libva 1.7.1)
vainfo: Driver version: Intel i965 driver for Intel(R) Haswell Desktop - 1.6.1.pre1 (1.6.1.pre1)
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Simple            : VAEntrypointEncSlice
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileH264MultiviewHigh      : VAEntrypointVLD
      VAProfileH264MultiviewHigh      : VAEntrypointEncSlice
      VAProfileH264StereoHigh         : VAEntrypointVLD
      VAProfileH264StereoHigh         : VAEntrypointEncSlice
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileNone                   : VAEntrypointVideoProc
      VAProfileJPEGBaseline           : VAEntrypointVLD
      VAProfileH264MultiviewHigh      : VAEntrypointVLD
      VAProfileH264MultiviewHigh      : VAEntrypointEncSlice
      VAProfileH264StereoHigh         : VAEntrypointVLD
      VAProfileH264StereoHigh         : VAEntrypointEncSlice
yano@haswell:~$ ls -n /dev/dri
total 0
crw-rw----+ 1 0 44 226,   0 Jan 12 22:30 card0
crw-rw----  1 0 44 226,  64 Jan 12 22:30 controlD64
crw-rw----+ 1 0 44 226, 128 Jan 12 22:30 renderD128

と/dev/dri配下にrenderD128ができれば(恐らく)OK。 続いてCompilationGuide/Ubuntuを読みながら、ffmpegのインストール。

Xenial Xerus

6月に試したUbuntu 16.04 (Xenial Xerus)

Ubuntu 16.04 'Xenial Xerus' LTS

Ubuntu Maniacより

Hyper-Vではゲストとのファイル共有ができないので、sambaをインストールして「sudo service samba restart」とやったところ

yano@Xenial:~$ sudo service samba restart
Failed to restart samba.service: Unit samba.service is masked.

と怒られた。statusを診たら

yano@Xenial:~$ sudo service samba status
● samba.service
   Loaded: masked (/dev/null; bad)
   Active: inactive (dead)

と言われて、何が何やら。

結局、Ubuntu 16.04: sambaをインストールしてWindows 10とファイル共有するに倣って

sudo systemctl restart smbd nmbd

とする事でOKだったのだが、Ubuntu Wikiを調べてみたところ、SystemdForUpstartUsers

Switching init systems If you are running Ubuntu vivid (15.04), you can easily switch between upstart and systemd at will since both packages are installed at present. As of March 9 2015, vivid was changed to use systemd by default, before that upstart was the default.

Ubuntu on Windows

RedStone1が降ってきた X201s。

Bash on Ubuntu on Windows インストール中

C:\Windows\System32\bash.exe

3月の発表以来、楽しみにしていた「Bash on Ubuntu on Windows」(BoW)ことWindows Subsystem for Linuxの事を忘れてたので、入れてみた。

まず「Windowsを開発者モードに変更」し、「PowerShellでMicrosoft-Windows-Subsystem-Linuxを有効」にする。一旦再起動した後、bash.exeを起動し、Windows Subsystem for Linuxをインストールする流れになるそうだ。

今回は時間的にここで終了したが、LinuxのELF64バイナリがそのままWindows上で実行できる時代が来るとは感慨深いねぇ…

参照

@IT http://www.atmarkit.co.jp/

Build Insider http://www.buildinsider.net/

Engadget Japanese http://japanese.engadget.com/

MSDN Blogs https://blogs.msdn.microsoft.com/

Wikipedia https://ja.wikipedia.org/wiki/

Let's Encrypt自動更新

先月25日に行ったLet’s Encrypt対応。

仕上げに証明書の自動更新手順を試行錯誤していたところ、

The rate limit is 5 certs in 7 days per domain

と怒られた。どうやら1ドメインにつき週に5証明書しか発行できない制限があるらしく、wwwとmailの2サーバを設定した結果、速攻で上限に引っかかったようだ。

…という不手際で間が空いてしまったが、letsencrypt-auto renew一撃で証明書が更新できる事が確認できたので、apacheのrestartまでセットにしたスクリプト /usr/local/bin/letsencrypt-renew を作成。

yano@vps:~$ cat `/usr/local/bin/letsencrypt-renew`
#!/bin/sh
/opt/letsencrypt/letsencrypt-auto renew --force-renew \
    --webroot --webroot-path=/var/www/html --no-self-upgrade;
/usr/sbin/apachectl restart;
yano@vps:~$

最後に毎月末の11時59分に証明書を自動更新するよう/etc/cron.d/letsencrypt を設定。

yano@vps:~$ cat `/etc/cron.d/letsencrypt`
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user  command
59 11 28-31 * * root if [ $(date -d 'tomorrow' +\%d) -eq 1 ]; then `letsencrypt-renew` > /dev/null;fi
yano@vps:~$

なるほど、「明日が1日」という条件は"目から鱗"だったよ。

これでひと安心。

参照

INTERNET Watch http://internet.watch.impress.co.jp/