2026-10-09
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 の場合は次のように設定する。
| レゾリューションプラス | オフ |
| 質感リアライザー | オート (オフだと全体が白っぽくなる) |
| 低遅延モード | オン (オフだと黒背景時の赤文字が滲む) |
2倍以上に拡大する場合でないと効果が分かりづらい。FHDモニターを使用している場合は、効果を感じる場面が少ないかもしれない。
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/
写真に文字が入っていると、アップスケーラーごとの差が出やすい。
森林のように細かすぎる画像や、顔のアップのように変化が乏しい画像は、アップスケーラーごとの差が出にくいので避ける。
余白の部分はアップスケーラーごとの差が出ないので、縦長の画像は 16:9
に加工する。

Source: “Bustling
Alleyway in Osaka” by Catarina Duarte
License: https://www.pexels.com/ja-JP/license/
“Bustling Alleyway in Osaka” をクリックして、右上の「Free download」をクリック。
☘️ ソース画像を作成。
ダウンロードした画像を、FHDモニターでウィンドウ表示できるサイズに加工する。
横幅を 1760 ピクセルに縮小した後、中心部分を縦 990
ピクセルで切り取る。
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
☘️ ソース画像を 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
縮小画像は jpg にする。png
だと動作しないアップスケーラーがある。
mpv
で拡大表示しているときに「i2」と入力すると、動作しているアップスケーラーを確認できる。
☘️ 縮小画像をアップスケーラーでソースのサイズに戻す。
以下のコードは「縮小画像をアップスケーラーで拡大表示→スクリーンショットを撮影→終了→次のアップスケーラーで拡大表示→」を、アップスケーラーの数だけ自動的に繰り返す。
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
拡大画像は png で保存する。jpg だと劣化してスコアが悪くなる。
☘️ ソースと拡大画像の差を測定。
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
以上小さいものを選ぶと、効果がわかりやすい。
| 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
以上小さいものを選ぶと、効果がわかりやすい。
| 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
以上小さいものを選ぶと、効果がわかりやすい。
| 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
以上小さいものを選ぶと、効果がわかりやすい。
| 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分あればほとんどのシングル曲をカバーできる。
ノーマライズの結果は画面左上に表示される。