
HandBrakeアプリ等で動画のプリセットを変えて圧縮エンコードした時など、どの程度の劣化が生じるかチェックしたい時があると思います。 FFmpegのSSIMフィルターを使うことで、元動画と圧縮後の劣化程度(隔たり)をSSIMで数値化できるので、プリセット変更に伴う劣化度合いを客観的に評価することが可能になります。
しかし、SSIM値を表示させるためには、ターミナルを開き、FFmpegのコマンドラインに元動画の解像度、フレームレート等のパラメータを設定して実行する必要があり、面倒で非効率です。 そこで、macOSショートカットを活用し、この作業を自動化することにしました。 具体的には、「動画比較・SSIM劣化度計測ツール」と名付けたmacOSショートカットの作成手順を説明します。
SSIMについて(ワンポイント)
SSIMは、Structural Similarity Index(構造的類似性指標) の略で、動画のSSIMは、通常 「各フレームで計算したSSIMの平均値」 です。 下にSSIM値を表示するFFmpegコマンドラインを示します。 元動画がref.mp4で比較動画がdist.mp4です。 また、比較条件を合わせ込むために元動画のfps(30)と解像度scale(1280:720)を指定して、更に、setpts=PTS-STARTPTSで動画の開始位置を合わせています。
|
1 2 3 4 5 6 |
ffmpeg -i ref.mp4 -i dist.mp4 \ -filter_complex " [0:v]fps=30,scale=1280:720,setpts=PTS-STARTPTS[ref];\ [1:v]fps=30,scale=1280:720,setpts=PTS-STARTPTS[dist];\ [ref][dist]ssim" -f null - -nostats 2>&1 | sed -n '/SSIM/p' |
FFmpegコマンドラインで出力されたSSIM値の具体例を下に示します。 人間の視覚に近い評価を行い0〜1の範囲で数値化します。 ()内の値はdbです。
SSIM値・具体例 SSIM Y:0.978649 (16.705907) U:0.988327 (19.328300) V:0.990132 (20.057927) All:0.982176 (17.490013) -------- Y(Luma):輝度成分(明るさ)。 U(Cb):青系の色差成分(どれだけ青に寄っているか) V(Cr):赤系の色差成分(どれだけ赤に寄っているか) All:総合スコアー(通常はこの指標を使う) -------- SSIM値 劣化の目安 0.99〜1.00 ほぼ完全一致(劣化ほぼなし) 0.95〜0.99 軽微な劣化(ほぼ気づかない) 0.90〜0.95 やや劣化(注意して見ると分かる) 0.90未満 明確に劣化 👉 「0.97以上なら十分高品質」とされることが多いです。
SSIMについて、詳細はここをクリックしてウィキペディアを参照します。
SSIM値を得るには、FFmpegが予めインストールしておく必要があります。 インストール方法は下のスライドボックスを参照してください。
動画比較・SSIM劣化度計測ツール|macOSショートカットの作成手順
macOSショートカット・アプリを起動して「ファイル」>「新規ショートカット」をクリックすると、まっさらなショートカット編集画面が現れます。 ここに必要なアクション①〜⑥を配置して行きます。
アクション配置図
アクションの説明
アクション(1)〜(4)
- の「アラート」アクションが実行されると、「元動画のVideoファイルを選択します。:ファイルA」と表示され次のファイル選択アクションを促します。
- の「ファイルを選択」アクションが実行されるので、Finderが表示されたら、元動画のファイルを選択します。 選択されたファイルがマジック変数として出力されます。
- の「アラート」アクションが実行されると、「比較するVideoファイルを選択します。:ファイルB」と表示され次のファイル選択アクションを促します。
- の「ファイルを選択」アクションが実行されるので、Finderが表示されたら、比較する動画ファイルを選択します。 選択されたファイルがマジック変数として出力されます。
アクション(5):シェルスクリプトを実行アクション
以下のscriptを⑤にペーストします。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556#-----# 元動画:ファイルA、と 比較する動画:ファイルB を比較して# 動画品質のSSIM値を出力する。#-----ref="ファイルA (ファイルパス)" # 最初のファイル(元動画)選択のマジック変数 パス指定dist="ファイルB (ファイルパス)" # 2番目のファイル(比較動画)選択のマジック変数 パス指定# --- 解像度(scale)の自動取得 ---IFS=' ' read -r ref_w ref_h < <(ffprobe -v error -select_streams v:0 \-show_entries stream=width,height \-of csv=p=0 "$ref" | tr ',' ' ')scale="scale=${ref_w}:${ref_h}"# --- fpsの自動取得 ---fps=$(ffprobe -v error -select_streams v:0 \-show_entries stream=avg_frame_rate \-of default=noprint_wrappers=1:nokey=1 "$ref")# 異常値の場合フォールバックif [[ "$fps" == "0/0" || -z "$fps" ]]; thenfps="30"fifps="fps=${fps}"# --- SSIMを取得 ---ssim=$(ffmpeg -i "$ref" -i "$dist" \-filter_complex \"[0:v]"$fps","$scale",setpts=PTS-STARTPTS[ref];\[1:v]"$fps","$scale",setpts=PTS-STARTPTS[dist];\[ref][dist]ssim" -f null - \-nostats 2>&1 | sed -n '/SSIM/p')ref_size="ファイルA (ファイルサイズ)" # 最初のファイル選択のマジック変数 size指定dist_size="ファイルB (ファイルサイズ)" # 2番目のファイル選択のマジック変数 size指定echoecho "ファイルA(ref ):$(basename ${ref}) :${ref_size}"echo "ファイルB(dist):$(basename ${dist}) :${dist_size}"echoecho "** SSIM評価条件 [${fps},${scale}] **"echo "-------------------"echo "ファイルAに対するファイルBの画質劣化指標(SSIM値)は下記です"echo "$ssim"echo "-------------------"echoecho "[SSIM値 劣化の目安]0.99〜1.00 ほぼ完全一致(劣化ほぼなし)0.95〜0.99 軽微な劣化(ほぼ気づかない)0.90〜0.95 やや劣化(注意して見ると分かる)0.90未満 明確に劣化"Script・ポイント
- 6、7行:「ファイルを選択」のマジック変数を受けてファイルパスを取得しています。
- 15行:FFmpegのffprobeを使って元動画からの解像度を取得した結果を、変数scaleに代入しています。
- 27行:FFmpegのffprobeを使って元動画からのフレームレート(fps)を取得した結果を、変数fpsに代入しています。
- 38、39行:「ファイルを選択」のマジック変数を受けてファイルサイズを取得しています。
-------------
マジック変数については、「macOSショートカットアプリ:これで分かったマジック変数の取扱い」を参照してください。
アクション(6):
⑤の「シェルスクリプトを実行」の結果受けて、⑥のクイックルック・アクションで元動画と比較動画のファイル名と夫々のファイルサイズを含めて以下の様にSSIM値が表示されます。
クイックルック ファイルA(ref ):NASA-Imagery-225-135859792.mp4 :74.8 MB ファイルB(dist):NASA-iMovie_高_HB_RF20_5.mp4 :37.7 MB ** SSIM評価条件 [fps=24/1,scale=1920:1080] ** ------------------- ファイルAに対するファイルBの画質劣化指標(SSIM値)は下記です [Parsed_ssim_6 @ 0x7f502dbc0] SSIM Y:0.978388 (16.653021) U:0.988257 (19.302213) V:0.990053 (20.023257) All:0.981977 (17.441722) ------------------- [SSIM値 劣化の目安] 0.99〜1.00 ほぼ完全一致(劣化ほぼなし) 0.95〜0.99 軽微な劣化(ほぼ気づかない) 0.90〜0.95 やや劣化(注意して見ると分かる) 0.90未満 明確に劣化

完成した「動画比較・SSIM劣化度計測ツール」操作DEMO
以上、FFmpegのSSIMを活用した動画間の劣化度を計測するツールの紹介でした。 次の投稿で、HandBrakeのプリセットを変えた時に圧縮動画のSSIMがどのように変化するか?実験してみました。(下のブログ記事を参照ください)
-
-
参 照HandBrakeのRF値で画質と圧縮率はどう変わる?SSIMを使って最適なRF設定を検証してみた
HandBrakeは、iMovieなどで動画編集したファイルを圧縮する時に使用する定番アプリです。 圧縮する時に使用するプリセットは通常 Generalの Fast 1080p30 プリセットを使うの ...

