2020年版 デジタル放送録画の圧縮を最適化するFFmpegの使い方

デジタル放送録画の課題

デジタル放送の録画(MPEG-2 TSの保存)は簡単に行えるようになったが、問題はファイルサイズが大きく、ビットレートが高いことである。

ファイルサイズが大きいと保存できる数が少なく、ビットレートが高いとリモートで再生する際に停止してしまう可能性がある。

解像度ファイルサイズビットレート
1440x1080
(地上波デジタル放送、
BSプレミアム、BS11 を除くBSデジタル放送)
平均6.9GB/時間12~13.5Mbps
1920x1080
(BSプレミアム、BS11)
平均7.7GB/時間15~15.4Mbps

例えば8TBのHDDでも、解像度1440×1080の録画をすると、1159時間しかできない。
具体的な例を上げれば、以下のようになる。

  • 6チャンネル全録であれば、8日間に相当する。
  • 2時間の映画であれば、580本に相当する。
  • 1クール10回の1時間ドラマであれば、116作品に相当する。

課題解決のためのFFmpeg

FFmpeg(エフエフエムペグ)は動画と音声を記録・変換・再生するためのクロスプラットフォームのフリーソフトウェアである。

FFmpegを使えば、ファイルサイズの大きいデジタル放送の録画(MPEG-2 TS)ファイルを、画像品質が同等で圧縮率の高いMPEG-4ファイルにトランスコードすることが可能である。

トランスコード性能が高いとは、画質を落とすことなく、短い時間で、ファイルサイズを小さくすることである。

ここでは、指標を以下のように定義する。
圧縮速度=録画した時間/圧縮するために要した時間
圧縮率=圧縮したファイルサイズ/録画したファイルサイズ

従って、トランスコード性能が高いとは、圧縮速度が大きく、圧縮率が高い(ファイルサイズが小さくなる)、と言い換えることができる。

FFmpeg H.264 Video Encoding Guideを参考にすると、

  1. エンコーダーの設定 libx264
  2. 映像品質の設定 crf値の選択
  3. 圧縮速度と圧縮率の設定 preset値の選択

この方法によって、最適なトランスコード性能が得られるという。

FFmpegのインストール

FFmpegを調べるために、インストールをする。

実験環境として、以下の選択をした。

  • CPU i5-9400
  • MotherBoard ASUS H370M-PLUS
  • Memory DDR4 PC4-19200 4G × 2
  • OS CentOS 7.7

この環境下、以下のコマンドでFFmpegをインストールした。

sudo yum -y install epel-release
sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm
sudo yum -y install ffmpeg ffmpeg-devel

インスール後、以下のコマンドで確認する。

[euser@test ~]$ ffmpeg -version
ffmpeg version 2.8.15 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-36)
configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --optflags='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic' --extra-ldflags='-Wl,-z,relro ' --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-amrwbenc --enable-version3 --enable-bzlib --disable-crystalhd --enable-gnutls --enable-ladspa --enable-libass --enable-libcdio --enable-libdc1394 --enable-libfdk-aac --enable-nonfree --disable-indev=jack --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-openal --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libx264 --enable-libx265 --enable-libxvid --enable-x11grab --enable-avfilter --enable-avresample --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-runtime-cpudetect
libavutil      54. 31.100 / 54. 31.100
libavcodec     56. 60.100 / 56. 60.100
libavformat    56. 40.101 / 56. 40.101
libavdevice    56.  4.100 / 56.  4.100
libavfilter     5. 40.101 /  5. 40.101
libavresample   2.  1.  0 /  2.  1.  0
libswscale      3.  1.101 /  3.  1.101
libswresample   1.  2.101 /  1.  2.101
libpostproc    53.  3.100 / 53.  3.100

2020年3月1日現在、CentOS 7.7でyumを使ってバイナリをインストールすると、ffmpegのバージョンは2.8.15となる。

2020年3月1日現在の最新バージョンは、2019年12月31日リリースの4.2.2″Ada”。FFmpegの公式サイトからソースコードをダウンロードしてコンパイルする必要がある。

デジタル放送録画MPEG-2 TSの圧縮に関して

デジタル放送の録画でできるMPEG-2 TSファイルを、圧縮してMPEG-4にする際、映像品質、圧縮速度、圧縮率に影響する要素は、主に以下の4点である。

  1. MPEG-2 TSファイルの解像度
  2. MPEG-2 TSファイルの映像の複雑さ
  3. FFmpegのエンコードモード(固定品質モード)
  4. FFmpegのオプション(プリセット値)

 

MPEG-2 TSファイルの解像度

2020年3月1日現在のデジタル放送は、主に2種類の解像度で放送されている。

  • 1440×1080 (1,555,200ドット)
  • 1920×1080 (2,073,600ドット)

トランスコード処理の時間はドット数に比例するので、解像度1920×1080では1440×1080の約1.33倍の処理時間がかかる。

従って、解像度が高ければ圧縮速度は遅くなる。

 

MPEG-2 TSファイルの映像の複雑さ

MPEG-2 TSファイルの映像内容によって、圧縮速度・圧縮率は影響を受ける。

映像が単純で動きが少なければ、圧縮してファイルサイズを小さくできる。

TV番組の特徴から、一般に以下のような傾向がある。

  • 圧縮がし易い 室内・人工・動きが少ない
  • 圧縮が難しい 屋外・自然・動きが激しい

TV番組のジャンルでいえば、一般に以下の左にいくほど圧縮し易く、ファイルサイズを小さくできる。

ドラマ・アニメ<映画<ニュース・ドキュメンタリー<バラエティ<音楽<旅<スポーツ

 

FFmpegのエンコードモード(固定品質モード)

MPEG-2 TSファイルをMPEG-4にトランスコードする際、エンコーダーはlibx264を指定する。その際、エンコードモードを設定する。

エンコードモードを設定しないと、デフォールトの固定品質(Constant Rate Factor=CRF)モードが適用される。

crf値は0~51の範囲で設定できるが、デフォールト値は23である。crf値が小さくなると高品質になる。

映像の品質は、crf値と映像の解像度で決まる。

経験的に解像度に関わらずファイルサイズを一定にすると、解像度とcrf値の設定は例えば以下のようになる。

  • 720×480     crf=16
  • 1440×1080 crf=23
  • 1920×1080 crf=24~25(≒24.3)

他に、固定ビットレート、可変ビットレート、固定量子化、などのモードがあるが、現状固定品質(CRF)モードが最適と考えられている。

固定品質(CRF)モードが最適な理由は、映像の複雑さに応じて、ビットレートを最適化して圧縮を行ってくれるからである。動きが激しい屋外の映像ではビットレートを高く(ファイルサイズを大きく)、動きの少ない室内の映像ではビットレートを低く(ファイルサイズを小さく)してくれる。

映像の複雑さに応じてビットレートを可変にする必要があることは、例えば固定ビットレート4Mbpsでトランスコードした場合によくわかる。固定ビットレートでは、激しい動きのあるスポーツや屋外のランニングや旅番組でブロックノイズが多数発生する。また、多くの番組は4Mbpsで十分な画質が得られるが、アニメやドラマは2~3Mbpsで十分な画質が得られるので、ファイルサイズが最適化されていないともいえる。

従って、映像の複雑さに応じてファイルサイズを最適化できる、固定品質(CRF)モードを選択する必要がある。

 

FFmpegのオプション(プリセット値)

FFmpegを使ってトランスコードする際、いろいろなオプションを選択することによって、圧縮速度、圧縮率が変わってくる。そのオプションのセットとしてプリセットがある。プリセットを使えば、一つ一つのオプションを指定する手間が省ける。また、自分でカスタマイズしてプリセットを定義することも可能である。

最初から用意されているプリセットは、ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslowが選べる。デフォールト値は、mediumである。

ultrafastからmediumの間で、オプションの違いを調べた結果が、以下の表である。

オプションultrafastsuperfastveryfastfasterfastmedium
cabac011111
ref111223
deblock0:00:001:00:001:00:001:00:001:00:001:00:00
analyse0:00x3:
0x3
0x3:
0x113
0x3:
0x113
0x3:
0x113
0x3:
0x113
mediadiahexhexhexhex
subme012467
mixed_ref000011
trellis000111
8x8dct011111
chroma
_qp_offset
0000-2-2
lookahead
_threads
113211
bframes033333
weightp011112
rc
_lookahead
10203040
mbtree001111
aq01:1.001:1.001:1.001:1.001:1.00

オプションはいろいろあるが、上記オプション以外は同じ値が使われていた。

特に、圧縮速度や圧縮率に影響が大きいと思われるオプションの説明を以下に示す。

オプション説明
ref動き予測の際に参照できるフレームの上限数 (デフォルト=1)。
submeサブピクセル精度の動き予測方式を決めるオプション。
基本的に上げるほど高負荷高画質になるが、11は非常に高負荷。
10以上を指定するためにはaq-mode1以上とtrellis2が必要。
6以上を指定するとpsy-rdの使用が可能になる。
trellisdct(離散コサイン変換)によって失われた極細部の情報を回復させるオプション。
これもビットの再配分を行い最適化するもの。
cabacが必要となる。
ビットあたりの画質が向上するため、ビットの節約にもなる。
0…無効 
1…最終マクロブロックエンコード時のみ適用 デフォルト 
2…常時適用 さらに高効率で高画質高負荷 subme10で必要
lookahead_threads先読みフレーム解析を複数のスレッドに分割して実行する。
rc_lookaheadmbtreeにおいて先読みするフレームの数を決めるオプション。
これによって指定される範囲内で、
フレームをまたいでビットレートの再配分が行われる。
大きくすることによって先読み範囲が増え、
画質の向上と範囲内に収まる急激な映像の変化に強くなるが遅延が増える。

NHK総合のトランスコードを実測する

解像度1440×1080のデジタル放送のサンプルとして、以下のMPEG2-TSファイルを用意した。

  • 放送局 NHK総合
  • 解像度 1440×1080
  • 放送日 2020年1月16日0~24時
  • 番組  47番組

ffmpegの設定は、以下の通りである。

  • エンコーダー libx264
  • crf値     21~25
  • preset値   faster、veryfast、superfast、ultrafast

測定環境は、以下の通りである。

  • CPU i5-9400
  • MotherBoard ASUS H370M-PLUS
  • Memory DDR4 PC4-19200 4G × 2
  • OS CentOS 7.7

結果は、以下の通りである。測定値はすべて47番組の平均値である。

presetfasterveryfastsuperfastultrafast
CRF速度圧縮率速度圧縮率速度圧縮率速度圧縮率
213.750.3675.590.3066.910.529
223.910.3115.760.2577.050.4419.320.743
234.060.2645.920.2177.150.3669.30.637
244.190.2256.040.1837.280.3039.40.54
254.340.1916.170.1557.360.251

 

NHKBSプレミアムのトランスコードを実測する

解像度192×1080のデジタル放送のサンプルとして、以下のMPEG2-TSファイルを用意した。

  • 放送局 NHKBSプレミアム
  • 解像度 1920×1080
  • 放送日 2020年2月10日0~24時
  • 番組  34番組

ffmpegの設定は、以下の通りである。

  • エンコーダー libx264
  • crf値     21~27
  • preset値   faster、veryfast、superfast、ultrafast

測定環境は、以下の通りである。

  • CPU i5-9400
  • MotherBoard ASUS H370M-PLUS
  • Memory DDR4 PC4-19200 4G × 2
  • OS CentOS 7.7

結果は、以下の通りである。測定値はすべて34番組の平均値である。

presetfasterveryfastsuperfastultrafast
CRF速度圧縮率速度圧縮率速度圧縮率速度圧縮率
212.450.5873.770.54.90.786.871.18
222.550.5013.930.4214.960.6536.981.02
232.680.4264.080.3545.130.5447.090.881
242.810.3634.20.2975.210.4527.110.754
252.920.3084.320.2495.240.3757.090.645
262.950.2624.480.2095.490.3117.30.55
273.080.2234.430.1765.540.2587.350.47

デジタル放送録画に最適なFFmpegの使い方

デジタル放送録画MPEG2-TSファイルをMPEG-4に圧縮する際に、必要な情報は揃った。

私が推奨する設定は、以下の通りである。

  • 解像度1440×1080の場合、crf=22、preset=veryfast
  • 解像度1920×1080の場合、crf=25、preset=veryfast

その理由は、圧縮率25%付近が経験的にバランスが良く、またpreset=veryfastが圧縮速度が速いからである。

追加情報として、CPUによる違いを報告する。

  • i3-8100 4スレッド4コア 圧縮速度3.5 圧縮率21.3% (crf=23、preset=veryfast)
  • i5-9400 6スレッド6コア 圧縮速度5.92 圧縮率21.7% (crf=23、preset=veryfast)

この結果からi3=8100のトランスコード性能は、i5=9400の59%程度、およそスレッドの数に比例している。

i3-8100の圧縮速度 ≒ i5-9400の圧縮速度×59% ≒ i5=9400の圧縮速度×4/6

これらの情報を総合すれば、デジタル録画をMP-4に圧縮する際、あなたが望む圧縮速度、圧縮率、映像品質を得ることが可能だろう。

 

2020年03月08日 | Posted in 電脳:録画サーバー | タグ: , No Comments » 

関連記事

コメントを残す

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

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