2026-10-03
mpv はフリーのメディアプレーヤーで、次の特徴がある。
~/.config/mpv/mpv.conf を作成して次の行を追加。
# ビデオ出力ドライバー
# https://mpv.io/manual/stable/#video-output-drivers
vo=gpu-next
# グラフィックスAPI
# https://mpv.io/manual/stable/#options-gpu-api
gpu-api=auto
# ハードウェアビデオデコードを有効にする
# https://mpv.io/manual/stable/#options-hwdec
hwdec=auto
# ハードウェアデコードを行うコーデック
# 「vainfo | grep AV1」を実行して、何も表示されない場合は「av1,」を削除。
# https://mpv.io/manual/stable/#options-hwdec-codecs
hwdec-codecs=h264,vc1,hevc,vp8,vp9,av1,prores,prores_raw,ffv1,dpx
# アップスケーラー
# https://mpv.io/manual/stable/#options-scale
scale=lanczos
# ダウンスケーラー
# https://mpv.io/manual/stable/#options-dscale
dscale=mitchell
# オーディオ出力ドライバー
# https://mpv.io/manual/stable/#audio-output-drivers-ao
ao=pipewire
# 音声のみのファイルでもウィンドウを表示
# https://mpv.io/manual/stable/#options-force-window
force-window=yes
# ウィンドウを最大化
# https://mpv.io/manual/stable/#options-window-maximized
window-maximized=yes
# コンソール出力を簡潔にする
# https://mpv.io/manual/stable/#options-quiet
quiet=yes
# ウィンドウ右下の「残り時間」を「全体時間」に変更
# https://mpv.io/manual/stable/#on-screen-controller-timetotal
script-opts=osc-timetotal=yes
# ウィンドウタイトルに動画タイトルではなくファイル名を表示
# https://mpv.io/manual/stable/#options-title
title=${filename}
# プレイリストに動画タイトルではなくファイル名を表示
# https://mpv.io/manual/stable/#options-osd-playlist-entry
osd-playlist-entry=filename
~/.config/mpv/input.conf を作成して次の行を追加。デフォルトはこちら。
# 右クリックで一時停止しない
MBTN_RIGHT ignore
# マウスホイールで音量を変更しない
WHEEL_UP ignore
WHEEL_DOWN ignore
# チルトホイールで10秒移動しない
WHEEL_LEFT ignore
WHEEL_RIGHT ignore
# PGUP と PGDWN で10分送り/10分戻し
PGUP seek 600
PGDWN seek -600
# : と ; で1フレーム送り/1フレーム戻し
: frame-step
; frame-back-step
# マウスの進むボタンと戻るボタンで次/前のファイルに移動
MBTN_FORWARD playlist-next; show-text ${playlist} 2000
MBTN_BACK playlist-prev; show-text ${playlist} 2000
# . と , で次/前のファイルに移動
. playlist-next; show-text ${playlist} 2000
, playlist-prev; show-text ${playlist} 2000
# \ と / で次/前のチャプターに移動
\ add chapter 1; show-text ${chapter-list} 2000
/ add chapter -1; show-text ${chapter-list} 2000
# i でファイル情報の表示をトグル
# I でファイル情報を一時的に表示
i script-binding stats/display-stats-toggle
I script-binding stats/display-stats
# Ctrl+d で再生中のファイルをゴミ箱に移動
Ctrl+d run gio trash "${path}"; playlist-remove current; show-text "\"${filename}\" をゴミ箱に移動しました" 5000
# Esc で終了
ESC quit
モニターに超解像技術が搭載されている場合はオフにする。アップスケーラーの効果がわかりづらくなるので。
REGZA を使用している場合は次のようにする。
FHDモニターでFHD動画を表示する場合など、1倍以下のサイズで表示する場合は何も変わらない。
アップスケーラーが動作しているかどうかは、mpv
での表示中に「i2」と入力すれば確認できる。
Google の超解像技術から着想を得たアップスケーラー。
https://github.com/bjin/mpv-prescalers
wget https://raw.githubusercontent.com/bjin/mpv-prescalers/refs/heads/master/compute/ravu-lite-ar-r4.hook
wget https://raw.githubusercontent.com/bjin/mpv-prescalers/refs/heads/master/compute/ravu-lite-r4.hook
mkdir -p ~/.config/mpv/shaders
mv ravu-*.hook ~/.config/mpv/shaders/
compute ディレクトリのものが高速。動作しない場合は gather かルートのものを使用する。
1080p アニメのアップスケールに最適化されたアップスケーラー。
https://github.com/bloc97/anime4k
wget https://raw.githubusercontent.com/bloc97/Anime4K/refs/heads/master/glsl/Upscale%2BDenoise/Anime4K_Upscale_Denoise_CNN_x2_S.glsl
wget https://raw.githubusercontent.com/bloc97/Anime4K/refs/heads/master/glsl/Upscale%2BDenoise/Anime4K_Upscale_Denoise_CNN_x2_M.glsl
wget https://raw.githubusercontent.com/bloc97/Anime4K/refs/heads/master/glsl/Upscale%2BDenoise/Anime4K_Upscale_Denoise_CNN_x2_L.glsl
mkdir -p ~/.config/mpv/shaders
mv Anime4K_*.glsl ~/.config/mpv/shaders/
wget https://raw.githubusercontent.com/bloc97/Anime4K/refs/heads/master/glsl/Upscale%2BDenoise/Anime4K_Upscale_Denoise_CNN_x2_UL.glsl
mkdir -p ~/.config/mpv/shaders_high
mv Anime4K_*.glsl ~/.config/mpv/shaders_high/
本来は複数のシェーダーを組み合わせて使用するが、実写画像だと不自然になることがあるので、ここでは「Anime4K_Upscale_Denoise」を単体で使用した。
Anime4KCPP プロジェクトで使用されている深層学習モデルを、GLSL
で実装したもの。
https://github.com/TianZerL/ACNetGLSL
wget https://raw.githubusercontent.com/TianZerL/ACNetGLSL/refs/heads/master/glsl/acnet/acnet_f8b4.glsl
wget https://raw.githubusercontent.com/TianZerL/ACNetGLSL/refs/heads/master/glsl/acnet/acnet_f8b4_box.glsl
wget https://raw.githubusercontent.com/TianZerL/ACNetGLSL/refs/heads/master/glsl/acnet/acnet_f8b4_box_hdn.glsl
wget https://raw.githubusercontent.com/TianZerL/ACNetGLSL/refs/heads/master/glsl/acnet/acnet_f8b4_hdn.glsl
mkdir -p ~/.config/mpv/shaders
mv acnet_f8*.glsl ~/.config/mpv/shaders/
wget https://raw.githubusercontent.com/TianZerL/ACNetGLSL/refs/heads/master/glsl/acnet/acnet_f8b18.glsl
wget https://raw.githubusercontent.com/TianZerL/ACNetGLSL/refs/heads/master/glsl/acnet/acnet_f8b18_box.glsl
wget https://raw.githubusercontent.com/TianZerL/ACNetGLSL/refs/heads/master/glsl/acnet/acnet_f8b18_box_hdn.glsl
wget https://raw.githubusercontent.com/TianZerL/ACNetGLSL/refs/heads/master/glsl/acnet/acnet_f8b18_hdn.glsl
mkdir -p ~/.config/mpv/shaders_high
mv acnet_f8*.glsl ~/.config/mpv/shaders_high/
FSRCNN(高速超解像畳み込みニューラルネットワーク)を使用したアップスケーラー。
https://github.com/igv/FSRCNN-TensorFlow
wget https://github.com/igv/FSRCNN-TensorFlow/releases/download/1.1/FSRCNNX_x2_8-0-4-1.glsl
mkdir -p ~/.config/mpv/shaders
mv FSRCNNX_x2_*.glsl ~/.config/mpv/shaders/
wget https://github.com/igv/FSRCNN-TensorFlow/releases/download/1.1/FSRCNNX_x2_16-0-4-1.glsl
mkdir -p ~/.config/mpv/shaders_high
mv FSRCNNX_x2_*.glsl ~/.config/mpv/shaders_high/
アニメコンテンツを対象としたアップスケーラー。
https://github.com/Artoriuz/ArtCNN
wget https://raw.githubusercontent.com/Artoriuz/ArtCNN/refs/heads/main/GLSL/ArtCNN_C4F16.glsl
wget https://raw.githubusercontent.com/Artoriuz/ArtCNN/refs/heads/main/GLSL/ArtCNN_C4F16_DN.glsl
wget https://raw.githubusercontent.com/Artoriuz/ArtCNN/refs/heads/main/GLSL/ArtCNN_C4F16_DS.glsl
mkdir -p ~/.config/mpv/shaders
mv ArtCNN_C4F*.glsl ~/.config/mpv/shaders/
wget https://raw.githubusercontent.com/Artoriuz/ArtCNN/refs/heads/main/GLSL/ArtCNN_C4F32.glsl
wget https://raw.githubusercontent.com/Artoriuz/ArtCNN/refs/heads/main/GLSL/ArtCNN_C4F32_DN.glsl
wget https://raw.githubusercontent.com/Artoriuz/ArtCNN/refs/heads/main/GLSL/ArtCNN_C4F32_DS.glsl
mkdir -p ~/.config/mpv/shaders_high
mv ArtCNN_C4F*.glsl ~/.config/mpv/shaders_high/

Source: “Bustling
Alleyway in Osaka” by Catarina Duarte
License: https://www.pexels.com/ja-JP/license/
街の風景写真でスコアを測定する。画像に文字が入っていると、鮮明さを目視で確認しやすい。
森林のような細かい画像は、どのアップスケーラーを使用してもオリジナルに近づきにくい。顔のアップのような変化が乏しい画像は、どのアップスケーラーを使用しても似たようなスコアになる。
余白が多いと変化する部分が少なくなるので、縦長の画像は 16:9
に加工する。
“Bustling
Alleyway in Osaka” をクリックして右上の「Free
download」をクリック。
ダウンロードした画像を横 1760 ピクセルに縮小して、中央から 1760x990
のサイズで切り取る(FHD モニターでウィンドウ表示できるように、1080p
より少し小さくする)。
cat << 'EOF' > make-reference-images.sh
#!/bin/sh
image_orig=${1}
image_base="${image_orig%.*}"
magick "${image_orig}" -resize 1760x -gravity center -crop 1760x990+0+0 \
+repage "${image_base}_reference.png"
EOF
sh make-reference-images.sh pexels-cateduart-38580804.jpg
できた画像を「画像A」とする。
「画像A」を 50% に縮小。
cat << 'EOF' > make-downscaled-images.sh
#!/bin/sh
image_orig=${1}
image_base="${image_orig%_reference.*}"
magick "${image_orig}" -resize 50% "${image_base}_downscaled.jpg"
EOF
sh make-downscaled-images.sh pexels-cateduart-38580804_reference.png
できた画像を「画像B」とする。
「画像B」は JPEG 形式にする。PNG
形式だと動作しないアップスケーラーがある。
アップスケーラーが動作しているかどうかは、mpv
での表示中に「i2」と入力すれば確認できる。
「画像B」を mpv で 200% に拡大。
以下のコードは「画像を表示→スクリーンショットを撮影→終了→次の画像を表示→」を、アップスケーラーの数だけ自動的に繰り返す。
cat << 'EOF' > make-upscaled-images.sh
#!/bin/sh
image_orig=${1}
image_base="${image_orig%_downscaled.jpg}"
mpv_options="--no-config --load-scripts=no --no-osc --window-scale=2.0 \
--screenshot-format=png --screenshot-dir=${PWD} --pause"
for shader_file in ${HOME}/.config/mpv/shaders/*
do
shader_base=$(basename "${shader_file}")
shader_base=${shader_base%.*}
mpv ${mpv_options} --glsl-shaders="${shader_file}" \
--screenshot-template="${image_base}_upscaled-${shader_base}" \
--input-commands="keypress Ctrl+s,quit" "${image_orig}"
done
mpv ${mpv_options} --glsl-shaders="" \
--screenshot-template="${image_base}_upscaled-lanczos" \
--input-commands="keypress Ctrl+s,quit" "${image_orig}"
EOF
sh make-upscaled-images.sh pexels-cateduart-38580804_downscaled.jpg
できた画像を「画像C」とする。
「画像C」は PNG 形式にする。JPG 形式だとスコアが悪化する。
「画像A」と「画像C」の差を測定。
cat << 'EOF' > compare-upscaled-images.sh
#!/bin/sh
image_orig=${1}
image_base="${image_orig%_reference.png}"
printf "Upscaler | Score\n"
printf "%s\n" "-- | --"
for image_file in ${image_base}_upscaled-*.png
do
score=$(magick compare -metric SSIM "${image_base}_reference.png" \
"${image_file}" null: 2>&1)
shader_name=${image_file#${image_base}_upscaled-}
shader_name=${shader_name%.*}
printf "%s | %s\n" "${shader_name}" "${score}"
done | sort -t '|' -k 2 -g
EOF
sh compare-upscaled-images.sh pexels-cateduart-38580804_reference.png
mkdir -p gpu_low
mv pexels-cateduart-38580804_upscaled-*.png gpu_low/
続いて高負荷なアップスケーラーを測定。
mv ~/.config/mpv/shaders ~/.config/mpv/shaders_low
mv ~/.config/mpv/shaders_high ~/.config/mpv/shaders
sh make-upscaled-images.sh pexels-cateduart-38580804_downscaled.jpg
sh compare-upscaled-images.sh pexels-cateduart-38580804_reference.png
mkdir -p gpu_high
mv pexels-cateduart-38580804_upscaled-*.png gpu_high/
mv ~/.config/mpv/shaders ~/.config/mpv/shaders_high
mv ~/.config/mpv/shaders_low ~/.config/mpv/shaders
スコアが小さいほどオリジナルに近い。
順位は元画像との相性や、縮小画像の作成方法などによって大きく変わる。
mpv のデフォルトは lanczos。それよりスコアが 200
以上小さいものを選ぶと、効果がわかりやすい。
スコアの差が 100 以下だと、目視では効果がわかりにくい。
| Upscaler | Score |
|---|---|
| acnet_f8b4_hdn | 2730.33 (0.0416621) |
| ArtCNN_C4F16_DS | 2822.87 (0.0430742) |
| Anime4K_Upscale_Denoise_CNN_x2_M | 2855.68 (0.0435749) |
| acnet_f8b4_box_hdn | 2867.52 (0.0437555) |
| Anime4K_Upscale_Denoise_CNN_x2_L | 3001.74 (0.0458037) |
| FSRCNNX_x2_8-0-4-1 | 3065.22 (0.0467722) |
| Anime4K_Upscale_Denoise_CNN_x2_S | 3070.23 (0.0468488) |
| acnet_f8b4 | 3120.36 (0.0476137) |
| ArtCNN_C4F16_DN | 3185.57 (0.0486086) |
| acnet_f8b4_box | 3197.69 (0.0487936) |
| ArtCNN_C4F16 | 3232.16 (0.0493196) |
| ravu-lite-ar-r4 | 3750.49 (0.0572288) |
| ravu-lite-r4 | 3971.67 (0.0606039) |
| lanczos | 4313.61 (0.0658214) |
スコアが小さいほどオリジナルに近い。
順位は元画像との相性や、縮小画像の作成方法などによって大きく変わる。
mpv のデフォルトは lanczos。それよりスコアが 200
以上小さいものを選ぶと、効果がわかりやすい。
スコアの差が 100 以下だと、目視では効果がわかりにくい。
| Upscaler | Score |
|---|---|
| acnet_f8b18_hdn | 2498.32 (0.0381219) |
| acnet_f8b18_box_hdn | 2652.7 (0.0404776) |
| ArtCNN_C4F32_DS | 2748.12 (0.0419336) |
| FSRCNNX_x2_16-0-4-1 | 2771.83 (0.0422954) |
| Anime4K_Upscale_Denoise_CNN_x2_UL | 2797.99 (0.0426946) |
| acnet_f8b18 | 2896.81 (0.0442025) |
| acnet_f8b18_box | 3044.49 (0.0464559) |
| ArtCNN_C4F32_DN | 3080.26 (0.0470017) |
| ArtCNN_C4F32 | 3116.61 (0.0475564) |
| lanczos | 4313.61 (0.0658214) |

Source: “千と千尋の神隠し
作品静止画” by STUDIO GHIBLI
License: 画像は常識の範囲でご自由にお使いください。
30番目の画像をクリック。出てきた画像を右クリックして、「名前を付けて画像を保存」を選択。
あとは風景写真のときと同じ方法で測定する。
sh make-reference-images.sh chihiro030.jpg
sh make-downscaled-images.sh chihiro030_reference.png
sh make-upscaled-images.sh chihiro030_downscaled.jpg
sh compare-upscaled-images.sh chihiro030_reference.png
mkdir -p gpu_low
mv chihiro030_upscaled-*.png gpu_low/
続いて高負荷なアップスケーラーを測定。
mv ~/.config/mpv/shaders ~/.config/mpv/shaders_low
mv ~/.config/mpv/shaders_high ~/.config/mpv/shaders
sh make-upscaled-images.sh chihiro030_downscaled.jpg
sh compare-upscaled-images.sh chihiro030_reference.png
mkdir -p gpu_high
mv chihiro030_upscaled-*.png gpu_high/
mv ~/.config/mpv/shaders ~/.config/mpv/shaders_high
mv ~/.config/mpv/shaders_low ~/.config/mpv/shaders
スコアが小さいほどオリジナルに近い。
順位は元画像との相性や、縮小画像の作成方法などによって大きく変わる。
mpv のデフォルトは lanczos。それよりスコアが 200
以上小さいものを選ぶと、効果がわかりやすい。
スコアの差が 100 以下だと、目視では効果がわかりにくい。
| Upscaler | Score |
|---|---|
| acnet_f8b4_hdn | 2674.38 (0.0408084) |
| Anime4K_Upscale_Denoise_CNN_x2_M | 2747.95 (0.041931) |
| acnet_f8b4_box_hdn | 2772.79 (0.04231) |
| Anime4K_Upscale_Denoise_CNN_x2_L | 2821.95 (0.0430602) |
| ArtCNN_C4F16_DS | 2861.4 (0.0436621) |
| Anime4K_Upscale_Denoise_CNN_x2_S | 2921.71 (0.0445825) |
| ArtCNN_C4F16_DN | 3042.65 (0.0464278) |
| acnet_f8b4 | 3305.4 (0.0504371) |
| acnet_f8b4_box | 3307.81 (0.0504739) |
| FSRCNNX_x2_8-0-4-1 | 3395.16 (0.0518068) |
| ArtCNN_C4F16 | 3404.14 (0.0519439) |
| ravu-lite-ar-r4 | 3638.33 (0.0555174) |
| ravu-lite-r4 | 3950.16 (0.0602755) |
| lanczos | 4045.02 (0.061723) |
スコアが小さいほどオリジナルに近い。
順位は元画像との相性や、縮小画像の作成方法などによって大きく変わる。
mpv のデフォルトは lanczos。それよりスコアが 200
以上小さいものを選ぶと、効果がわかりやすい。
スコアの差が 100 以下だと、目視では効果がわかりにくい。
| Upscaler | Score |
|---|---|
| acnet_f8b18_hdn | 2574.67 (0.0392869) |
| acnet_f8b18_box_hdn | 2655.75 (0.0405242) |
| Anime4K_Upscale_Denoise_CNN_x2_UL | 2773.05 (0.042314) |
| ArtCNN_C4F32_DS | 2865.28 (0.0437214) |
| ArtCNN_C4F32_DN | 3001.11 (0.045794) |
| FSRCNNX_x2_16-0-4-1 | 3115.45 (0.0475387) |
| acnet_f8b18 | 3136 (0.0478523) |
| acnet_f8b18_box | 3267.88 (0.0498647) |
| ArtCNN_C4F32 | 3367.79 (0.0513891) |
| lanczos | 4045.02 (0.061723) |
アップスケーラーにショートカットを割り当てて、パラパラ漫画のように切り替える。そうするとアップスケーラーの違いが目に留まりやすくなる。
~/.config/mpv/input.conf に次の行を追加。
# アップスケーラーの切り替え
Ctrl+1 change-list glsl-shaders set "~~/shaders/ravu-lite-ar-r4.hook"
Ctrl+2 change-list glsl-shaders set "~~/shaders/Anime4K_Upscale_Denoise_CNN_x2_S.glsl"
Ctrl+3 change-list glsl-shaders set "~~/shaders/Anime4K_Upscale_Denoise_CNN_x2_M.glsl"
Ctrl+4 change-list glsl-shaders set "~~/shaders/acnet_f8b4.glsl"
Ctrl+5 change-list glsl-shaders set "~~/shaders/acnet_f8b4_hdn.glsl"
Ctrl+6 change-list glsl-shaders set "~~/shaders/ArtCNN_C4F16.glsl"
Ctrl+7 change-list glsl-shaders set "~~/shaders/ArtCNN_C4F16_DS.glsl"
Ctrl+8 change-list glsl-shaders set "~~/shaders/FSRCNNX_x2_8-0-4-1.glsl"
Ctrl+0 change-list glsl-shaders set ""; set scale lanczos
風景写真を表示。
mpv --no-osc --fs --pause https://raw.githubusercontent.com/utuhiro78/linuxplayers/refs/heads/main/images/mpv/pexels-cateduart-38580804_downscaled.jpg
Ctrl キーを押したまま「0101」「0202」「1212」のように入力して、アップスケーラーの違いを確認する。
アニメ画像を表示。
mpv --no-osc --fs --pause https://raw.githubusercontent.com/utuhiro78/linuxplayers/refs/heads/main/images/mpv/chihiro030_downscaled.jpg
同様に入力して違いを確認。
「acnet_f8b4_hdn」をデフォルトにする場合は、~/.config/mpv/mpv.conf
に次の行を追加。
内蔵アップスケーラーのみを使用する場合は何も書かない。
# 外部アップスケーラー
# https://mpv.io/manual/stable/#options-glsl-shaders
glsl-shader="~~/shaders/acnet_f8b4_hdn.glsl"

Source: “Aerial
view of a boat sailing in the sea” by Burak Evlivan
License: https://www.pexels.com/ja-JP/license/
“Aerial
view of a boat sailing in the sea” をクリックして右上の「Free
download」をクリック。
ダウンロードした動画を 480p に縮小。
cat << 'EOF' > make-downscaled-movies.sh
#!/bin/sh
movie_file="${1}"
movie_base="${movie_file%.*}"
ffmpeg -i "${movie_file}" -vf "scale=-2:480:flags=lanczos" -c:v libx264 -crf 23 -c:a copy "${movie_base}_downscaled.mp4"
EOF
sh make-downscaled-movies.sh 12393381_3840_2160_60fps.mp4
できた動画を 200%
に拡大してノーウェイトで再生。終了までの時間を計測する。
mpv_shader_benchmark.py
wget https://raw.githubusercontent.com/utuhiro78/linuxplayers/refs/heads/main/images/mpv/mpv_shader_benchmark.py
wget https://raw.githubusercontent.com/utuhiro78/linuxplayers/refs/heads/main/images/mpv/12393381_3840_2160_60fps_downscaled.mp4
python mpv_shader_benchmark.py 12393381_3840_2160_60fps_downscaled.mp4
GPUによって速度は変わる。
動画の収録時間は25秒なので、25秒以上かかるものはコマ落ちする。
| Upscaler | Time (sec) |
|---|---|
| ravu-lite-r4 | 3.04 |
| ravu-lite-ar-r4 | 3.16 |
| lanczos | 3.2 |
| Anime4K_Upscale_Denoise_CNN_x2_S | 3.79 |
| Anime4K_Upscale_Denoise_CNN_x2_M | 5.77 |
| acnet_f8b4_box_hdn | 8.04 |
| acnet_f8b4_hdn | 8.05 |
| acnet_f8b4_box | 8.06 |
| acnet_f8b4 | 8.06 |
| Anime4K_Upscale_Denoise_CNN_x2_L | 8.37 |
| FSRCNNX_x2_8-0-4-1 | 9.25 |
| ArtCNN_C4F16_DS | 13.96 |
| ArtCNN_C4F16 | 13.99 |
| ArtCNN_C4F16_DN | 14.01 |
使用したシステム:
| CPU | Ryzen 5 5600G |
| GPU | 内蔵GPU |
6分以内のファイルであれば自動的にノーマライズする。元のファイルは一切変更しない。
normalize-short-tracks.lua
wget https://raw.githubusercontent.com/utuhiro78/linuxplayers/refs/heads/main/images/mpv/normalize-short-tracks.lua
mkdir -p ~/.config/mpv/scripts
mv normalize-short-tracks.lua ~/.config/mpv/scripts/
事前にファイルのピーク音量を検出し、そこが 0 dB になるよう volume-gain
を調整してから再生する。
ピーク音量の検出には時間がかかるので、実行するのは6分以内のファイルのみ。6分あればほとんどのシングル曲をカバーできる。
ノーマライズの結果は画面左上に表示される。