2020年の自宅録画サーバー環境

(2020年07月11日追記)

「2020年初夏版 『自宅全録サーバー』の概要」について紹介。

CentOS 8.1で、6チャンネル全録サーバーを作ってみました。
(2020年03月08日追記)

「2020年版 デジタル放送録画の圧縮を最適化するFFmpegの使い方」について紹介。

FFmpegのパラメータを決める際に参考にしてください。

2020年は、QSVを使わず第8世代・第9世代のIntel Coreで十分

2019年は、Intel Coreが第8世代、第9世代になり、性能が大幅に向上した。
周辺チップの性能も上がっているようで、QSVを使わなくてもトランスコードは十分な状況である。

2019年版との違いは、以下2点である。
(1)Intel Media Server Studioのインストールをしない。CentOSは、7.7を使う。
(2)第8世代・第9世代のIntel Core、i3-8100・i3-9100を使う。マザーボードは、H370系統。

実際に変更点はわずかだが、インストールが楽になり、総合的な録画サーバーとしての性能も向上した。

2020年の自宅録画サーバー構成

上記が2020年版の構成。とてもシンプルになった。

この構成で、2K(1920×1080、1440×1080)の映像をリモートでも快適に視聴できるようになった。

特に、途中から再生する場合に、2019年版では5秒以上の遅延があったが、2020年版ではほとんど遅れず再生できる。

第8世代のIntel Coreとその周辺チップの性能向上によって、トランスコード性能、ネットワーク性能が向上した結果と考えている。

—————-余談————————-
IntelはCPUが思うように出荷できず業績が振るわなかったが、最近復調。
第8・9世代で産みの苦しみがあったように思う。しかし、今回性能を測定してみて、大幅にグレードアップしていることがわかった。第6・7世代とは比べ物にならない。

と思ったが、それも冷静になって考えれば当たり前。第6世代のi3は2コア4スレッド、第8世代のi3は4コア4スレッド。つまり、第6世代のi5が第8世代のi3になっただけで、実際は大幅な値下げといってもいい。安くなったのだから文句はないが、値下げに思わせないところが、頭がいいのかもしれない。
———————————————–

2020年版自宅録画サーバーの性能

2020年版のポイントは、libx264によるトランスコードでどのくらいの性能が出ているかである。

libx264のオプションによる性能差

libx264でトランスコードする場合のオプションを調べると、crf=23 preset=veryfastという設定が妥当という情報が多い。

これを確認するために、以下の条件で調べた。

調査条件
(1)サンプル映像 BSプレミアム2019年12月10日0~24時 (1920×1080 TSファイル)41番組
(2)トランスコード ffmpeg 2.8.15 (CentOS 7.6) codec=libx264
(3)調査1 crf=23 preset=ultrafast, superfast, veryfast, faster
(4)調査2 preset=veryfast crf=22~24

調査1 presetの違いによる性能の変化

preset=veryfastの時が圧縮率が29.28%、速度が2.65倍でバランスがいい。

preset=veryfastより遅いfasterでは、なぜか圧縮率が34.85%と悪くなっており、速度は1.91倍で使えない。

逆にpreset=superfastは、速度が4.16倍と速くなるが、圧縮率が44.5%となる。

結局、preset=veryfastを使うのが、良さそうである。これは、BSなので、地上波ではさらに性能向上が見込める。

調査2 crfの違いによる性能の変化

crf=23は、画質として十分と言われているレベルで性能もバランスが良い。

crf=24は、画質は悪くなるが、速度が2.8倍、圧縮率が24.4%と性能は良くなる。

crf=22は、画質は良くなるが、速度は2.58倍、圧縮率は35.14%と性能は悪くなる。

画質が十分なcrf=23を採用。ただし、映像によって圧縮率が50%を超える番組もあるので、crf=24も選択として残すことにする。

TV局による性能差

crf=23 preset=veryfastとオプションを決めたので、TV局による差を調査した。

調査条件
(1)サンプル映像 地上波6チャンネル(NHK、日テレ、TBS、フジ、テレ朝、テレ東)BS1チャンネル(BSプレミアム)
(2)録画内容 各局0~24時
(3)crf=23 preset=veryfast

TV局による速度、圧縮率の差はほとんどない。
地上波(1440×1080)、BSプレミアム(1920×1080)の解像度の違いの分、BSプレミアムの速度は遅く、圧縮率も悪くなる。

地上波で平均速度が3.5倍、平均圧縮率が21%程度なので、トランスコード性能としては十分と考えている。

番組によるバラツキ

ffmpegでコーデックlibx264のCRFモードを使う場合、映像の内容によって、圧縮速度・圧縮率が変わるということである。

以下に、NHK・BSプレミアムの一日の番組の圧縮速度・圧縮率をグラフにした。

crf=23 preset=veryfastで1日の番組をTSからmp4にトランスコードした場合、速度・圧縮率にかなりのバラツキがあることがわかる。

特に目立つのは、以下2点である。
(1)BSプレミアムで圧縮率が50%を超えるファイルが存在する。
(2)圧縮率が悪くなると圧縮速度も低下する。

すなわち、映像の内容によっては、圧縮速度・圧縮率が大幅に低下する番組が存在するということである。

実際には、圧縮率の悪い番組があったとしても、Plex Media Serverで再生する際には、リアルタイムでトランスコードしてビットレートを指定したビットレートに下げることができるので、問題なくローカルでもリモートでも視聴は可能である。ファイルサイズが大きいことだけが懸念事項として残るだけで、数が少なければそれほど問題ではない。

参考に、各TV局ごとに圧縮率が悪い番組を以下に示す。

TV局名番組名圧縮率
NHKNHK-名曲アルバム「きよしこの夜」グルーバー作曲46.1%
日本テレビぶらり途中下車の旅[解][字]東横線の旅▽36.4%
TBS世界遺産「超巨大!仁徳天皇陵古墳のナゾ」52.7%
フジテレビ中央競馬ダイジェスト38.8%
テレビ朝日ポツンと一軒家 鹿児島県と愛知県で発見42.2%
テレビ東京日向坂で会いましょう▽こんなに言っちゃっていいの?32.5%
BSプレミアムにっぽん百名山「天城山」76.6%

圧縮率の悪い番組は、屋外の映像が多い。

ドラマ、映画、アニメなどは、一般に平均圧縮率より良くなる傾向がある。

2020年版自宅録画サーバーの電気代

消費電力を調査したところ、以下の結果を得た。
(1)待機時 27W
(2)録画時 30W
(3)トランスコード時 79W

この結果から以下のように考えた。
(1)待機電力 27W
(2)録画電力 3W
(3)トランスコード電力 52W

1kWh=27円とすると、
1ヶ月待機電気料金=524円
1時間番組の録画電気料金=0.081円
1時間番組のトランスコード電気料金=0.42円(18分のトランスコード時間)

従って、1時間の番組を録画してトランスコードすると約0.5円かかる。
1日に20時間を録画して、1か月継続すると以下の通り。
0.5✕20✕30=300円

毎日20時間録画して1か月続けると、総合電気料金は以下の通り。
524円+300円=824円

従って
824円÷600時間=1.4円/1時間番組

月間600時間の録画は、1時間あたり1.4円で録画ができることになる。

2020年以降の展望

2020年版自宅録画サーバーは、実用的なシステムとしてほぼ完成したと感じている。

このシステムに関連した現状について、考えてみた。

  1. 本サーバーの競合製品として、パナソニックや東芝のブルーレイレコーダーがある。
    現状3-10万円程度で買え、上位機種は4K録画にも対応している。
    しかし、これらのレコーダーは使い方や用途が限定されていて、実際には競合製品ではない。
    EPGStationの録画予約の柔軟性、Plex Media Serverのコンテンツ表示、リモート再生のレベルは、比較の対象にすらならない。
  2. TV番組のネット配信・リアルタイム視聴
    NHKのネット同時配信が始まろうとしているが、同時配信のニーズはどのくらいあるのだろうか。
    本サーバーが便利だと思うのは、時間に縛られず、必要な番組を視聴できる点につきる。
    TVerなどで、過去3年くらいの番組を検索し、すぐに再生できるなら、いくらかでもお金を払ってもいいが、権利関係などを考えると実現は当分ないと考えられる。
    そう考えると、本サーバーの有用性は少なくとも今後5年程度はあるように思う。
    ネット配信よりも電波配信の方がブロードキャストでは圧倒的に有利だから。
  3. 全録への可能性
    全録システムは、けっこう便利だと思っている。東芝レグザで地上波6チャンネルの全録システムを10年ほど使っている。
    ただし、用途は限定的で、主にネットで話題になった番組を見ることと、リアルタイム視聴で巻き戻す必要があった時くらいである。しかも、今は3週間ほどしか保持できない。
    今回本サーバーでは、現状で全録3チャンネルが可能なことがわかった。
    おそらく、i5-8400を使うか、Intel QSVが使えれば、1台で6チャンネル同時録画半年間くらいは、すぐに実現可能だろう。
    (地上波6チャンネル同時録画には、PX-Q3PE4とPX-W3PE4の2枚使いで対応できる。)

Appendix: EPGStationのconfig.jsonとトランスコードスクリプト

現在運用中のEPGStationの設定を以下に紹介する。

トランスコードスクリプトは、以下の機能がある。

  1. crf値とpreset値を引数として指定できる。(省略した場合は、crf=23 preset=veryfast)
  2. 圧縮速度と圧縮率をログとして保存できる。(csv形式)
    ログは、EPGStation/logs/transcodeの下に「年月日.log」として保存される。
    事前にtranscodeというフォルダを作成して、アクセス権を設定した方が間違いない。
    フォーマットは、以下のとおり。
    「ファイル名、CRF値、preset値、録画時間、圧縮時間、圧縮速度、ファイルサイズ、圧縮サイズ、圧縮率」

運用中のconfig.jsonは、以下のとおり。

{
    "readOnlyOnce": false,
    "serverPort": "8888",
    "mirakurunPath": "http+unix://%2Fvar%2Frun%2Fmirakurun.sock/",
    "dbType": "mysql",
    "mysql": {
    "host": "localhost",
    "port": 3306,
    "user": "epgstation",
    "password": "mirakurun",
    "database": "epgstation",
    "connectTimeout": 20000,
    "connectionLimit": 10
     },
    "ffmpeg": "/usr/local/bin/ffmpeg",
    "ffprobe": "/usr/local/bin/ffprobe",

    "recorded": "/mnt/data1",
    "recordedTSDefaultDirectory": "/tv/",
    "recordedEncodeDefaultDirectory": "/temp/",
    "recordedFormat": "%TITLE%_%YEAR%-%MONTH%-%DAY%",

    "maxEncode": 1,

    "encode": [
        {
            "name": "crf23",
            "cmd": "/bin/bash %ROOT%/config/enc-libx-crf.sh",
            "suffix": "-crf23.mp4",
            "default": true
        },
	{
            "name": "crf24",
            "cmd": "/bin/bash %ROOT%/config/enc-libx-crf.sh 24 veryfast",
            "suffix": "-crf24.mp4"
        }
    ],

    "recordedViewer": {

トランスコードスクリプトenc-libx-crf.shは、以下の通り。

※注意点:以下の表示で1行が長い所が4箇所ある。表示は折返し表示になっているので注意。利用する際は、全体を選択してコピーするのが安全。

#!/bin/sh
# enc-libx-crf.sh
# version 2.1 created on 2019-12-23 by simplelife0530
#
#
#時間測定サブプログラム
function setStartTime() {
start_time=`date +%s`
}
function getEndTime() {
end_time=`date +%s`
process_time=`expr ${end_time} - ${start_time}`
}
#
#ファイル名
file=${INPUT##*/}
filename1=${file%.*}
filename2=`echo "$filename1" | sed 's/ / /g'`
#
#パラメーターの設定
if [ $# = 2 ]
then 
crfValue=${1}
presetValue=${2}
else
crfValue="23"
presetValue="veryfast"
fi
#ログファイルの設定
today=$(date "+%Y%m%d")
logExt=".log"
logFile="./logs/transcode/"$today$logExt
if [ ! -e $logFile ]; then
{
echo "ファイル名,CRF値,preset値,録画時間,圧縮時間,圧縮速度,ファイルサイズ,圧縮サイズ,圧縮率"
} >> $logFile
fi
#
#エンコード設定
inputPara=" -y -i "
videoCodec=" -vf yadif -preset ${presetValue} -c:v libx264"
videoOpt=" -crf ${crfValue} -f mp4"
audioCodec=" -c:a aac"
audioOpt=" -strict -2 -ar 48000 -ab 192k -ac 2"
advancedOpt=" -loglevel error "
#
command="$FFMPEG$inputPara\"$INPUT\"$videoCodec$videoOpt$audioCodec$audioOpt$advancedOpt\"$OUTPUT\""
#
#エンコード開始
setStartTime
eval ${command}
getEndTime
#
#エンコード終了
{
duration=`/usr/local/bin/ffprobe "$OUTPUT" -hide_banner -show_entries format=duration | sed -n 2p`
recordingTime=${duration#duration=}
compressSpeed=`echo "scale=2; ${recordingTime}/${process_time}" | bc`
inputFileSize=`ls -l "$INPUT" | awk '{ print $5; }'`
outputFileSize=`ls -l "$OUTPUT" | awk '{ print $5; }'`
compressionRate=`echo "scale=3; ${outputFileSize}/${inputFileSize}" | bc`
echo "${filename2},${crfValue},${presetValue},${recordingTime},${process_time},${compressSpeed},${inputFileSize},${outputFileSize},${compressionRate}"
} >> $logFile

exit
2019年12月20日 | Posted in 電脳:録画サーバー | タグ: , 11 Comments » 

関連記事

コメント11件

  • こやた より:

    こんばんは。
    年末年始の準備がようやく終わりましていよいよ録画サーバーの構築に時間がとれるようになり
    再び挑戦しておりEPGStationからの録画予約までは問題なく動作するようになりました。
    しかし、録画修了後のffmpegと貴殿のシェルスクリプトでの自動エンコードの途中でエラーになってしまいます。
    インストールからセットアップまで数々の場面でつまづきながらなので、途中の設定などが影響しているのかもしれませんが、原因がなにかお分かりでしたらご教示いただけないでしょうか?

    <各種バージョン>
    CentOS Linux release 7.7.1908 (Core)
    ffmpeg version git-2019-12-26-c991e9c Copyright (c) 2000-2019 the FFmpeg developers
    built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-39)

    <エンコード実行時ログ>$HOME/git/EPGStation/logs/Service

    [2019-12-29T22:24:03.665] [INFO] system – push encode: /mnt/data1/tv/日曜劇場「グランメゾン東京」 最終回「マグロ」[終][字][デ]_2019-12-29(3).ts 0
    [2019-12-29T22:24:03.666] [INFO] system – encode start: /mnt/data1/tv/日曜劇場「グランメゾン東京」 最終回「マグロ」[終][字][デ]_2019-12-29(3).ts crf23
    [2019-12-29T22:24:03.671] [INFO] system – create new encode child: 1577625843671
    [2019-12-29T22:25:07.273] [INFO] system – code { code : 1, signal: null }
    [2019-12-29T22:25:07.273] [ERROR] system – encode failed: /mnt/data1/temp/日曜劇場「グランメゾン東京」 最終回「マグロ」[終][字][デ]_2019-12-29(3)-crf23.mp4
    [2019-12-29T22:25:07.273] [INFO] system – delete encoding file: /mnt/data1/temp/日曜劇場「グランメゾン東京」 最終回「マグロ」[終][字][デ]_2019-12-29(3)-crf23.mp4

    エンコード自体は開始され、途中まで同一ディレクトリにmp4ファイルが作成され容量が増えていく様子が見れます。
    気持ち的には7割くらいになるとエラーが発生し、エンコードファイルは自動で削除されてしまいます。
    尚、シェルスクリプト内のffmpegコマンドやオプションを整理し、ターミナルウィンドウから手動で打ち込むとエンコードできました。
    シェルスクリプトをなるべくシンプルなコマンドで書き換えたりしてみたのですがうまくいきませんでした。。。

    年末年始を迎えるにあたり大変お忙しいとは存じますがお手隙の際にご教示いただけましたら幸いです。
    宜しくお願い致します。

  • simplelife0530 より:

    こやたさん、こんばんは。
    こちらのログでは、以下のようになります。
    system – push encode: /mnt/data1/tv/日曜劇場「グランメゾン東京」 最終回「マグロ」[終][字][デ]_2019-12-29.ts 0
    system – encode start: /mnt/data1/tv/日曜劇場「グランメゾン東京」 最終回「マグロ」[終][字][デ]_2019-12-29.ts crf23
    [INFO] system – create new encode child: 1577625843577
    [INFO] system – code { code : 0, signal: null }
    [INFO] system – fin encode: /mnt/data1/drama/rec-drama/グランメゾン東京/日曜劇場「グランメゾン東京」 最終回「マグロ」[終][字][デ]_2019-12-29-crf23.mp4

    スクリプトはきちんと動いているようなので、その周辺の問題かもしれませんね。
    途中で終わるという現象は今まで経験したことがないです。

    現状で調べる価値があるのは、EPGStationの録画でTSファイルを残す設定にして、「録画済み」画面から右上のメニューでencodeを選択して、再度TSからmp4にトランスコードしてみたらどうでしょう。

    それからmp4のファイルを書き込むフォルダのアクセス権の設定や容量も確認してみたらどうでしょう。

    今のところそれぐらいしか考えられません。

  • こやた より:

    simplelife0530さん

    こんばんは。早速のご返信誠にありがとうございます。
    色々試していたらこんな時間になってしまいました。まだ解決はできていないです。。。
    EPGStationのメニュー「元ファイルと同じ場所に保存する」や「TS 削除 (ソースが TS の場合に限る)」のチェック有無で実行しても同じように途中でエラーになりました。

    当初、私のffmpeg環境設定などを疑っておりましたが、ffmpegコマンドとオプションを少しずつ追加しつながら、スクリプトと同等のオプションまで問題なく動作することが確認できました。
    ただしスクリプトの中の「advancedOpt」についてはログ関連と判断し除外していました。

    コマンド直打ちでエンコードができることが確認できたので次はスクリプト内のエラー発生部分についてエンコード動作と直接関係のないような部分に対してコメント「#」を入れてみましたが、今度はスクリプト自体が動作せずにログに別のエラーが表示されてしまいました。

    ご指摘いただきましたアクセス権についても/mnt/data1以下はすべて777になっておりました。

    以上のことより録画およびエンコードはなんとかできているため、自分自身で解決できるよう色々と試してみようと思います。また進捗がございましたらお知らせ致します。

  • simplelife0530 より:

    こやたさん

    解決方法として、「2020年版自宅録画サーバーの準備」という記事の、configとトランスコードスクリプトにしたら、どうでしょう。
    こちらは、単純になっているので、問題がすぐにわかると思います。

  • こやた より:

    simplelife0530さん

    こんにちは。ご教示いただきました通り「2020年版自宅録画サーバーの準備」のトランスコードスクリプトのシンプルな記述に変更しましたら自動エンコード等が正常にできるようになりました。
    また色々いじってみて良い方法など見つけましたらご連絡させていただきます。
    有難うございました!

  • simplelife0530 より:

    こやたさん

    とりあえず安心しました。

    逆に、最新のスクリプトがなぜ動かないのか、気になってきました。logsの中のtranscodeフォルダの中にログ・ファイルがあれば、その中身も知りたいです。
    動かすために、何かインストールする必要があるのかもしれません。

  • こやた より:

    simplelife0530さん

    こんにちは。
    transcodeログについては見つからないなと思いつつ、トランスコードスクリプトをよくよく読み返してみたら「logFile=”./logs/transcode/”$today$logExt」と書いてありましたね。

    $HOME/EPGStation/logs配下にはOperatorとServiceディレクトリしか存在しておりませんでしたのでmkdirで「transcode」ディレクトリを作成し、パーミッションを777に設定しました。

    今現在は「いだてん総集編」を自動エンコード中ですのでこれが終わり次第、スクリプトを元に戻して検証したいと思います。

  • こやた より:

    simplelife0530さん

    こんばんは。transcodeディレクトリを作成して再度実行してみましたがダメでした。
    やはり下記のエラーになってしまいます。

    [2019-12-30T16:36:02.582] [INFO] system – push encode: /mnt/data1/tv/「いだてん~東京オリムピック噺(ばなし)~」総集編 第二部(前編)[解][字]_2019-12-30.ts 0
    [2019-12-30T16:36:02.583] [INFO] system – encode start: /mnt/data1/tv/「いだてん~東京オリムピック噺(ばなし)~」総集編 第二部(前編)[解][字]_2019-12-30.ts crf23
    [2019-12-30T16:36:02.608] [INFO] system – create new encode child: 1577691362607
    [2019-12-30T16:57:30.279] [INFO] system – code { code : 1, signal: null }
    [2019-12-30T16:57:30.279] [ERROR] system – encode failed: /mnt/data1/「いだてん~東京オリムピック噺(ばなし)~」総集編 第二部(前編)[解][字]_2019-12-30–23.mp4
    [2019-12-30T16:57:30.279] [INFO] system – delete encoding file: /mnt/data1/「いだてん~東京オリムピック噺(ばなし)~」総集編 第二部(前編)[解][字]_2019-12-30–23.mp4

    私の環境だけに発生する事象なのかもしれませんので、しばらくは2020年準備編のシンプルなスクリプトで運用しようと思います。

    色々と有難うございました。今後ともどうぞ宜しくお願い致します。

  • simplelife0530 より:

    こやたさん

    情報ありがとうございます。

    おおよそ問題がつかめました。行が長くて、表示で2行になっているところが4箇所ほどありました。

    実際には、すべて選択してコピーすれば1行になるところが、コピーの仕方によっては2行になる可能性があります。
    (1)echo “ファイル名,CRF値,preset値,録画時間,圧縮時間,圧縮速度,ファイルサイズ,圧縮サイズ,圧縮率”

    (2)command=”$FFMPEG$inputPara\”$INPUT\”$videoCodec$videoOpt$audioCodec$audioOpt$advancedOpt\”$OUTPUT\””

    (3)duration=`/usr/local/bin/ffprobe “$OUTPUT” -hide_banner -show_entries format=duration | sed -n 2p`

    (4)echo “${filename2},${crfValue},${presetValue},${recordingTime},${process_time},${compressSpeed},${inputFileSize},${outputFileSize},${compressionRate}”

    上記の4行です。

    おそらく、これを1行にすれば直る可能性は高いですが、うまく動いているならばそれでいいと思います。

  • Nick より:

    CentOS Linux 8.0.1905.は録画サーバーに使えますか?
    録画サーバー前提です。

  • simplelife0530 より:

    Nickさん、コメントありがとうございます。
    CentOS 8は、まだ使っていないのでわかりません。
    いつもメジャーバージョンアップで、問題が多いので、私は使わないことにしています。
    CentOS 7.7で使っていますが、実は7.6の方がおすすめです。
    なぜかと言えば、CentOS7.7では日本語入力が使っているうちに、かな漢字変換ができなくなります。
    とにかく、バージョンアップするたびに、細かい点でいろいろな不具合が生じます。
    単に録画サーバーとして使うならば、CentOS7.6が一番安定しています。

    CentOS7は2024年まではサポートしているので、2023年頃にCentOS8にバージョンアップするのが適当かと思います。

    Linuxは、Windowsではないので、それほどサポートが良いわけではなく、だましだまし使うものです。サブバージョンが3くらいから使うものではないでしょうか?

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください