SSIMが0.98となるAV1ファイルの生成手順。
エンコーダーは、GentooLinuxで手軽に導入できるlibaom-av1とrav1eを採用。
画質を上げたくて、2pass処理で処理。
インストール
・USEフラグに、「libaom」と「rav1e」を設定して、「emerge ffmpeg」を実行
エンコード前の動画の情報
・ffprobeで取得
Duration: 00:01:00.03, start: 0.000000, bitrate: 3331 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 3196 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
エンコード結果
・libaom-av1の2pass
処理時間:
real 19m22.198s
user 30m38.319s
sys 0m4.159s
エンコード後の画像のビットレート:357 kb/s
エンコード後のファイルサイズ:2,694,454
SSIM:[Parsed_ssim_0 @ 0x56168ef95700] SSIM Y:0.981769 (17.391922) U:0.989772 (19.902020) V:0.989374 (19.736308) All:0.984370 (18.060516)
・rav1eの2pass
処理時間:
real 23m16.869s
user 204m59.578s
sys 0m49.470s
エンコード後の画像のビットレート:602 kb/s
エンコード後のファイルサイズ:4,540,149
[Parsed_ssim_0 @ 0x559a0c6d6080] SSIM Y:0.975169 (16.050014) U:0.989414 (19.752691) V:0.990995 (20.455217) All:0.980181 (17.029115)
エンコーダーのバージョン
libaom-AV1
[libaom-av1 @ 0x56039b192f40] v2.0.0
rav1e
rav1e 0.3.5
エンコードのパラメータ
libaom-AV1の2passエンコードのコマンド
--------------------------------------------------------------------------------------------------------------------------------
SH=`basename $0`
INPUT=$1
# CRF=51
# All:0.977533
# CRF=50
# All:0.983888
# CRF=40
# All:0.980969
# CRF=45
# All:0.980297
# CRF=46
# All:0.979657
# CRF=47
CRF=46
FTMP0=`date "+%Y%m%d%H%M%S"`
FTMP="${FTMP0}"
cp ${SH} ${SH}${FTMP0}
MKV="${INPUT}.libaom2.C${CRF}.${FTMP0}.mp4"
AUDIO=" -acodec libfdk_aac -profile:a aac_he_v2 "
AUDIO="${AUDIO} -ab 16k -ar 24000 -ac 2 -afterburner 1 "
touch "${MKV}"
# FFM="${FFM} -pix_fmt yuv420p10le"
FFM="${FFM} -pix_fmt yuv420p12le"
# FFM="${FFM} -b:v ${RATE}"
# FFM="${FFM} -s 768x432"
# FFM="${FFM} -vframes 10"
FFM="${FFM} -passlogfile ${FTMP}"
# FFM="${FFM} -loglevel quiet"
# b
# ビットレートターゲットをビット/秒で設定します。デフォルトでは、これは可変ビットレートモードを使用します。場合maxrate そして minrate も同じ値に設定されている場合は、固定ビットレートモードが使用されます。 crf も設定されている場合は、制約付き品質モードが使用されます。
OPT="${OPT} -b:v 0"
# g keyint_min
# キーフレームの配置を設定します。GOPサイズは、キーフレーム間の最大距離を設定します。ゼロの場合、出力ストリームはイントラのみになります。最小距離は、GOPサイズと同じでない限り無視されます。同じ場合、キーフレームは常に一定の間隔で表示されます。デフォルトでは設定されていないため、このオプションがないと、ライブラリはキーフレームを配置する場所を完全に自由に選択できます。
# qmin qmax
# 最小/最大量子化値を設定します。有効な範囲は0〜63です(警告:これは、AV1で実際に使用されるクォンタイザー値と一致しません。4で除算して、実際のクォンタイザー値をこの範囲にマップします)。デフォルトは最小/最大(制約なし)です。
# minrate maxrate bufsize rc_init_occupancy
# レート制御バッファリングパラメータを設定します。設定されていない場合は使用されません-デフォルトは制約のない可変ビットレートです。
# スレッド
# エンコード中に使用するスレッドの数を設定します。これには、 タイル または 行-mt指定された数のスレッドを実際に完全に使用するように設定するオプションもあります。デフォルトは、ホストマシンでサポートされているハードウェアスレッドの数です。
# プロフィール
# エンコーディングプロファイルを設定します。デフォルトでは、入力のビット深度とクロマサブサンプリングに一致するプロファイルを使用します。
# ラッパーには、いくつかの特定のオプションもあります。
# CPU使用済み
# 品質とエンコード速度のトレードオフを設定します。有効な範囲は0〜8で、数値が大きいほど速度が速く、品質が低いことを示します。デフォルト値は1で、低速で高品質になります。
OPT="${OPT} -cpu-used 8"
# auto-alt-ref
# 代替参照フレームの使用を有効にします。デフォルトは、ライブラリの内部デフォルトです。
OPT="${OPT} -auto-alt-ref 1"
# arnr-max-frames(フレーム)
# altrefノイズリダクションの最大フレーム数を設定します。デフォルトは-1です。
OPT="${OPT} -arnr-max-frames 7"
# arnr-strength(strength)
# altrefノイズリダクションフィルターの強度を設定します。範囲は-1〜6です。デフォルトは-1です。
OPT="${OPT} -arnr-strength 6"
# aq-mode(aq-mode)
# 適応量子化モードを設定します。可能な値:
# 'なし(0)'
# 無効。
# '分散(1)'
# 分散ベース。
# '複雑さ(2)'
# 複雑さベース。
# 'サイクリック(3)'
# 周期的な更新。
OPT="${OPT} -aq-mode 2"
# tune(tune)
# エンコーダーが調整される歪みメトリックを設定します。デフォルトはpsnrです。
# 'psnr(0)'
# 'ssim(1)'
# lag-in-frames
# 先読みの目的で、エンコーダが一度に飛行し続けることができるフレームの最大数を設定します。デフォルトは、ライブラリの内部デフォルトです。
OPT="${OPT} -lag-in-frames 5"
# エラー回復力
# エラー回復機能を有効にします。
# デフォルト
# フレーム全体の損失に対する回復力を向上させます。
# デフォルトでは有効になっていません。
# crf
# 一定品質(ビットレートターゲットなし)モードと制約付き品質(最大ビットレートターゲットあり)モードの品質/サイズのトレードオフを設定します。有効な範囲は0〜63で、数値が大きいほど品質が低く、出力サイズが小さいことを示します。設定されている場合にのみ使用されます。デフォルトでは、ビットレートターゲットのみが使用されます。
OPT="${OPT} -crf ${CRF}"
# 静的しきい値
# ブロックに変更しきい値を設定します。このしきい値を下回ると、エンコーダーによってスキップされます。非負の整数として任意の単位で定義され、デフォルトはゼロです(ブロックはスキップされません)。
# ドロップスレッショルド
# レート制御境界に近いときにフレームをドロップするためのしきい値を設定します。ターゲットバッファのパーセンテージとして定義されます-レート制御バッファがこのパーセンテージを下回ると、フレームはしきい値を超えて補充されるまでドロップされます。デフォルトはゼロです(フレームはドロップされません)。
# denoise-noise-level(レベル)
# 粒子合成のために除去されるノイズの量。このオプションが設定されていないか、0に設定されていない場合、粒子合成は無効になります。
OPT="${OPT} -denoise-noise-level 25"
# denoise-block-size(ピクセル)
# 穀物合成のノイズ除去に使用されるブロックサイズ。設定されていない場合、AV1コーデックはデフォルト値の32を使用します。
# アンダーシュート-pct(pct)
# ターゲットビットレートのデータレートアンダーシュート(最小)パーセンテージを設定します。範囲は-1から100です。デフォルトは-1です。
# オーバーシュート-pct(pct)
# ターゲットビットレートのデータレートオーバーシュート(最大)パーセンテージを設定します。範囲は-1〜1000です。デフォルトは-1です。
# minsection-pct(pct)
# ターゲットビットレートからのGOPビットレートの最小パーセンテージ変動。minsection-pctが設定されていない場合、libaomencラッパーは次のように計算します(minrate * 100 / bitrate)。範囲は-1〜100です。デフォルトは-1(未設定)です。
# maxsection-pct(pct)
# ターゲットビットレートからのGOPビットレートの最大変化率。maxsection-pctが設定されていない場合、libaomencラッパーは次のように計算します(maxrate * 100 / bitrate)。範囲は-1〜5000です。デフォルトは-1(未設定)です。
# frame-parallel(ブール値)
# フレーム並列デコード機能を有効にします。デフォルトはtrueです。
OPT="${OPT} -frame-parallel true"
# タイル
# 入力ビデオをエンコードするタイルの数を、列x行として設定します。
# 数値が大きいほど、エンコードとデコードの両方で並列処理が大きくなりますが、コーディング効率が低下する可能性があります。デフォルトでは、入力ビデオのサイズに必要なタイルの最小数になります(これは、4K以下のサイズの場合は1x1(つまり、単一のタイル)です)。
# OPT="${OPT} -tiles 8x8"
# タイル-列タイル-行
# タイルの数を、タイルの行と列の数のlog2として設定します。libvpx / VP9との互換性のために提供されています。
# OPT="${OPT} -tile-columns=8 -tile-rows=8"
# row-mt(libaom> = 1.0.0-759-g90a15f4f2が必要)
# 行ベースのマルチスレッドを有効にします。デフォルトでは無効になっています。
OPT="${OPT} -row-mt 1"
# enable-cdef(ブール値)
# 制約付き方向拡張フィルターを有効にします。libaom-av1エンコーダーは、デフォルトでCDEFを有効にします。
# enable-restoration(ブール値)
# ループ復元フィルターを有効にします。libaom-av1のデフォルトはtrueです。
# enable-global-motion(ブール値)
# ブロック予測にグローバルモーションの使用を有効にします。デフォルトはtrueです。
# enable-intrabc(ブール値)
# ブロック内予測のブロックコピーモードを有効にします。このモードは、画面コンテンツに役立ちます。デフォルトはtrueです。
# enable-rect-partitions(boolean)(libaom> = v2.0.0が必要)
# 長方形のパーティションを有効にします。デフォルトはtrueです。
# enable-1to4-partitions(boolean)(libaom> = v2.0.0が必要)
# 1:4/4:1パーティションを有効にします。デフォルトはtrueです。
# enable-ab-partitions(boolean)(libaom> = v2.0.0が必要)
# ABシェイプパーティションを有効にします。デフォルトはtrueです。
# enable-angle-delta(boolean)(libaom> = v2.0.0が必要)
# 角度デルタイントラ予測を有効にします。デフォルトはtrueです。
# enable-cfl-intra(boolean)(libaom> = v2.0.0が必要)
# 輝度イントラ予測から予測された彩度を有効にします。デフォルトはtrueです。
# enable-filter-intra(boolean)(libaom> = v2.0.0が必要)
# フィルタイントラプレディクタを有効にします。デフォルトはtrueです。
# enable-intra-edge-filter(boolean)(libaom> = v2.0.0が必要)
# イントラエッジフィルターを有効にします。デフォルトはtrueです。
# enable-smooth-intra(boolean)(libaom> = v2.0.0が必要)
# スムーズなイントラ予測モードを有効にします。デフォルトはtrueです。
# enable-paeth-intra(boolean)(libaom> = v2.0.0が必要)
# イントラ予測でpaeth予測子を有効にします。デフォルトはtrueです。
# enable-palette(boolean)(libaom> = v2.0.0が必要)
# パレット予測モードを有効にします。デフォルトはtrueです。
# enable-flip-idtx(boolean)(libaom> = v2.0.0が必要)
# FLIPADST_DCT、DCT_FLIPADST、FLIPADST_FLIPADST、ADST_FLIPADST、FLIPADST_ADST、IDTX、V_DCT、H_DCT、V_ADST、H_ADST、V_FLIPADST、H_FLIPADSTを含む拡張変換タイプを有効にします。デフォルトはtrueです。
# enable-tx64(boolean)(libaom> = v2.0.0が必要)
# 64ポイント変換を有効にします。デフォルトはtrueです。
# reduce -tx-type-set(boolean)(libaom> = v2.0.0が必要)
# 変換タイプの削減されたセットを使用します。デフォルトはfalseです。
# use-intra-dct-only(boolean)(libaom> = v2.0.0が必要)
# DCTはイントラモードにのみ使用してください。デフォルトはfalseです。
# use-inter-dct-only(boolean)(libaom> = v2.0.0が必要)
# DCTはINTERモードにのみ使用してください。デフォルトはfalseです。
# use-intra-default-tx-only(boolean)(libaom> = v2.0.0が必要)
# デフォルト変換は、イントラモードにのみ使用してください。デフォルトはfalseです。
# enable-ref-frame-mvs(boolean)(libaom> = v2.0.0が必要)
# 時間的mv予測を有効にします。デフォルトはtrueです。
# enable-reduced-reference-set(boolean)(libaom> = v2.0.0が必要)
# 単一および複合参照の削減されたセットを使用します。デフォルトはfalseです。
# enable-obmc(boolean)(libaom> = v2.0.0が必要)
# obmcを有効にします。デフォルトはtrueです。
# enable-dual-filter(boolean)(libaom> = v2.0.0が必要)
# デュアルフィルターを有効にします。デフォルトはtrueです。
# enable-diff-wtd-comp(boolean)(libaom> = v2.0.0が必要)
# 差分加重化合物を有効にします。デフォルトはtrueです。
# enable-dist-wtd-comp(boolean)(libaom> = v2.0.0が必要)
# 距離加重コンパウンドを有効にします。デフォルトはtrueです。
# enable-onesided-comp(boolean)(libaom> = v2.0.0が必要)
# 片面コンパウンドを有効にします。デフォルトはtrueです。
# enable-interinter-wedge(boolean)(libaom> = v2.0.0が必要)
# インターインターウェッジコンパウンドを有効にします。デフォルトはtrueです。
# enable-interintra-wedge(boolean)(libaom> = v2.0.0が必要)
# イントラウェッジコンパウンドを有効にします。デフォルトはtrueです。
# enable-masked-comp(boolean)(libaom> = v2.0.0が必要)
# マスクされた化合物を有効にします。デフォルトはtrueです。
# enable-interintra-comp(boolean)(libaom> = v2.0.0が必要)
# 化合物間を有効にします。デフォルトはtrueです。
# enable-smooth-interintra(boolean)(libaom> = v2.0.0が必要)
# スムーズインターイントラモードを有効にします。デフォルトはtrueです。
ffmpeg -y -i "$1" ${FFM} -c:v libaom-av1 -strict experimental \
${OPT} \
-pass 1 -an -f matroska /dev/null \
&& ffmpeg -y -i "$1" ${FFM} -c:v libaom-av1 -strict experimental \
${OPT} ${OPT2} \
-pass 2 \
${AUDIO} \
"${MKV}"
echo "---------------------------------"
echo "ssim"
echo "---------------------------------"
ffmpeg -hide_banner -i "$1" -i "${MKV}" -filter_complex ssim -an -f null -
# ffprobe -hide_banner "${MKV}"
# ls -l "${MKV}"
rm "${FTMP}-0.log"
--------------------------------------------------------------------------------------------------------------------------------
rav1eの2passエンコードのコマンド
--------------------------------------------------------------------------------------------------------------------------------
SH=`basename $0`
INPUT=$1
# All:0.967195
# QP=200
# All:0.990386
# QP=100
# All:0.983431
# QP=150
# All:0.975644
# QP=180
# All:0.981267
# QP=160
# All:0.978363
# QP=170
# All:0.979740
# QP=165
# All:0.979047
# QP=166
# All:0.980181
# QP=163
# All:0.979636
# QP=164
QP=163
FTMP0=`date "+%Y%m%d%H%M%S"`
FTMP="${FTMP0}"
cp ${SH} ${SH}${FTMP0}
MKV="${INPUT}.librav1e.C${QP}.${FTMP0}.mp4"
AUDIO=" -acodec libfdk_aac -profile:a aac_he_v2 "
AUDIO="${AUDIO} -ab 16k -ar 24000 -ac 2 -afterburner 1 "
touch "${MKV}"
# FFM="${FFM} -pix_fmt yuv420p10le"
FFM="${FFM} -pix_fmt yuv420p12le"
FFM="${FFM} -passlogfile ${FTMP}"
# FFM="${FFM} -b:v 0" # NG
FFM="${FFM} -b:v 4000k"
# qmax
# ビットレートモードを使用するときに使用する最大量子化器を設定します。
# qmin
# ビットレートモードを使用するときに使用する最小量子化器を設定します。
# qp
# 量子化モードを使用して、指定された量子化器(0〜255)でエンコードします。
OPT="${OPT} -qp ${QP}"
# speed
# エンコードする速度プリセット(0-10)を選択します。
OPT="${OPT} -speed 10"
# タイル
# エンコードするタイルの数を選択します。
# OPT="${OPT} -tiles 8x8"
# tile-rows
# エンコードするタイルの行数を選択します。
OPT="${OPT} -tile-rows 16"
# tile-columns
# エンコードするタイルの列数を選択します。
OPT="${OPT} -tile-columns 16"
# rav1eへパラメータ設定
# OPT="${OPT} -rav1e-params speed=8:tile-rows=8:tile-cols=8"
OPT="${OPT} -rav1e-params speed=8"
ffmpeg -y -i "$1" ${FFM} -c:v librav1e \
${OPT} \
-pass 1 -an -f matroska /dev/null \
&& ffmpeg -y -i "$1" ${FFM} -c:v librav1e \
${OPT} \
-pass 2 \
${AUDIO} \
"${MKV}"
echo "---------------------------------"
echo "ssim"
echo "---------------------------------"
ffmpeg -hide_banner -i "$1" -i "${MKV}" -filter_complex ssim -an -f null -
# ffprobe -hide_banner "${MKV}"
# ls -l "${MKV}"
rm "${FTMP}-0.log"
--------------------------------------------------------------------------------------------------------------------------------