2020年版 デジタル放送録画の圧縮を最適化するFFmpegの使い方
目次
2021年3月24日 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を参考にすると、
- エンコーダーの設定 libx264
- 映像品質の設定 crf値の選択
- 圧縮速度と圧縮率の設定 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点である。
- MPEG-2 TSファイルの解像度
- MPEG-2 TSファイルの映像の複雑さ
- FFmpegのエンコードモード(固定品質モード)
- 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の間で、オプションの違いを調べた結果が、以下の表である。
オプション | ultrafast | superfast | veryfast | faster | fast | medium |
---|---|---|---|---|---|---|
cabac | 0 | 1 | 1 | 1 | 1 | 1 |
ref | 1 | 1 | 1 | 2 | 2 | 3 |
deblock | 0:00:00 | 1:00:00 | 1:00:00 | 1:00:00 | 1:00:00 | 1:00:00 |
analyse | 0:0 | 0x3: 0x3 | 0x3: 0x113 | 0x3: 0x113 | 0x3: 0x113 | 0x3: 0x113 |
me | dia | dia | hex | hex | hex | hex |
subme | 0 | 1 | 2 | 4 | 6 | 7 |
mixed_ref | 0 | 0 | 0 | 0 | 1 | 1 |
trellis | 0 | 0 | 0 | 1 | 1 | 1 |
8x8dct | 0 | 1 | 1 | 1 | 1 | 1 |
chroma _qp_offset | 0 | 0 | 0 | 0 | -2 | -2 |
lookahead _threads | 1 | 1 | 3 | 2 | 1 | 1 |
bframes | 0 | 3 | 3 | 3 | 3 | 3 |
weightp | 0 | 1 | 1 | 1 | 1 | 2 |
rc _lookahead | 10 | 20 | 30 | 40 | ||
mbtree | 0 | 0 | 1 | 1 | 1 | 1 |
aq | 0 | 1:1.00 | 1:1.00 | 1:1.00 | 1:1.00 | 1:1.00 |
オプションはいろいろあるが、上記オプション以外は同じ値が使われていた。
特に、圧縮速度や圧縮率に影響が大きいと思われるオプションの説明を以下に示す。
オプション | 説明 |
---|---|
ref | 動き予測の際に参照できるフレームの上限数 (デフォルト=1)。 |
subme | サブピクセル精度の動き予測方式を決めるオプション。 基本的に上げるほど高負荷高画質になるが、11は非常に高負荷。 10以上を指定するためにはaq-mode1以上とtrellis2が必要。 6以上を指定するとpsy-rdの使用が可能になる。 |
trellis | dct(離散コサイン変換)によって失われた極細部の情報を回復させるオプション。 これもビットの再配分を行い最適化するもの。 cabacが必要となる。 ビットあたりの画質が向上するため、ビットの節約にもなる。 0…無効 1…最終マクロブロックエンコード時のみ適用 デフォルト 2…常時適用 さらに高効率で高画質高負荷 subme10で必要 |
lookahead_threads | 先読みフレーム解析を複数のスレッドに分割して実行する。 |
rc_lookahead | mbtreeにおいて先読みするフレームの数を決めるオプション。 これによって指定される範囲内で、 フレームをまたいでビットレートの再配分が行われる。 大きくすることによって先読み範囲が増え、 画質の向上と範囲内に収まる急激な映像の変化に強くなるが遅延が増える。 |
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番組の平均値である。
preset | faster | veryfast | superfast | ultrafast | ||||
---|---|---|---|---|---|---|---|---|
CRF | 速度 | 圧縮率 | 速度 | 圧縮率 | 速度 | 圧縮率 | 速度 | 圧縮率 |
21 | 3.75 | 0.367 | 5.59 | 0.306 | 6.91 | 0.529 | ||
22 | 3.91 | 0.311 | 5.76 | 0.257 | 7.05 | 0.441 | 9.32 | 0.743 |
23 | 4.06 | 0.264 | 5.92 | 0.217 | 7.15 | 0.366 | 9.3 | 0.637 |
24 | 4.19 | 0.225 | 6.04 | 0.183 | 7.28 | 0.303 | 9.4 | 0.54 |
25 | 4.34 | 0.191 | 6.17 | 0.155 | 7.36 | 0.251 |
NHKBSプレミアムのトランスコードを実測する
解像度1920×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番組の平均値である。
preset | faster | veryfast | superfast | ultrafast | ||||
---|---|---|---|---|---|---|---|---|
CRF | 速度 | 圧縮率 | 速度 | 圧縮率 | 速度 | 圧縮率 | 速度 | 圧縮率 |
21 | 2.45 | 0.587 | 3.77 | 0.5 | 4.9 | 0.78 | 6.87 | 1.18 |
22 | 2.55 | 0.501 | 3.93 | 0.421 | 4.96 | 0.653 | 6.98 | 1.02 |
23 | 2.68 | 0.426 | 4.08 | 0.354 | 5.13 | 0.544 | 7.09 | 0.881 |
24 | 2.81 | 0.363 | 4.2 | 0.297 | 5.21 | 0.452 | 7.11 | 0.754 |
25 | 2.92 | 0.308 | 4.32 | 0.249 | 5.24 | 0.375 | 7.09 | 0.645 |
26 | 2.95 | 0.262 | 4.48 | 0.209 | 5.49 | 0.311 | 7.3 | 0.55 |
27 | 3.08 | 0.223 | 4.43 | 0.176 | 5.54 | 0.258 | 7.35 | 0.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に圧縮する際、あなたが望む圧縮速度、圧縮率、映像品質を得ることが可能だろう。
コメントを残す