mpv の使いかた

2024-03-14

mpv の特徴

mpv は自由に使えるメディアプレーヤーで、次の特徴がある。

高品質設定で再生

ArchWikiの高品質設定を参考にして次のように設定する。

mkdir -p ~/.config/mpv
printf 'vo=gpu-next
  hwdec=auto-safe
  profile=high-quality

ao=pipewire

# 音声のみのファイルでもウィンドウを表示する
force-window=yes

# 常にウィンドウを最大化
window-maximized=yes

# コンソールへのメッセージ出力を減らす
quiet=yes' > ~/.config/mpv/mpv.conf

high-quality プロファイルの内容は次の通り。

mpv --show-profile=high-quality

# Profile high-quality: 
#  scale=ewa_lanczossharp
#  hdr-peak-percentile=99.995
#  hdr-contrast-recovery=0.30
#  deband=yes

ハードウェアデコーディングを使用できているか確認

mpv --vo=gpu-next --hwdec=auto-safe --ao=pipewire https://www.youtube.com/watch?v=sDyDHvZKl8g

Q を押して再生を止めたあと、ターミナルに次の表示があればOK。

# Using hardware decoding (vaapi).

外部のアップスケーラーを利用

外部のアップスケーラーを使用すると、低解像度の動画を高品質にアップスケールできる。
FHDの動画をFHDモニターで表示する場合は、等倍表示なのでほとんど効果がない。

インストール

# RAVU: RAISR(高速で正確な画像超解像技術)からインスピレーションを得たアップスケーラー
# https://github.com/bjin/mpv-prescalers
rm -rf ~/tmp_arch/RAVU
mkdir -p ~/tmp_arch/RAVU
cd ~/tmp_arch/RAVU/
wget https://github.com/bjin/mpv-prescalers/archive/refs/heads/master.zip
unzip -q master.zip
mkdir -p ~/.config/mpv/shaders
mv mpv-prescalers-master/gather/{ravu-lite-r*.hook,ravu-r*.hook} ~/.config/mpv/shaders/

# NVScaler: NVIDIA Image Scaling (Radeonでも使用できる)
# https://gist.github.com/agyild
rm -rf ~/tmp_arch/NVScaler
mkdir -p ~/tmp_arch/NVScaler
cd ~/tmp_arch/NVScaler
wget https://gist.github.com/agyild/7e8951915b2bf24526a9343d951db214/raw/05f00864228871ffd157daa9beb2db8fa7412cfa/NVScaler.glsl
mkdir -p ~/.config/mpv/shaders
mv NVScaler.glsl ~/.config/mpv/shaders/

# FSR: AMD FidelityFX Super Resolution
# https://gist.github.com/agyild
rm -rf ~/tmp_arch/FSR
mkdir -p ~/tmp_arch/FSR
cd ~/tmp_arch/FSR
wget https://gist.github.com/agyild/82219c545228d70c5604f865ce0b0ce5/raw/2623d743b9c23f500ba086f05b385dcb1557e15d/FSR.glsl
mkdir -p ~/.config/mpv/shaders
mv FSR.glsl ~/.config/mpv/shaders/

# Anime4K: アニメの4K化に特化したアップスケーラー
# https://github.com/bloc97/Anime4K/blob/master/md/GLSL_Instructions_Linux.md
rm -rf ~/tmp_arch/Anime4K/Low-end
mkdir -p ~/tmp_arch/Anime4K/Low-end
cd ~/tmp_arch/Anime4K/Low-end
wget https://github.com/Tama47/Anime4K/releases/download/v4.0.1/GLSL_Mac_Linux_Low-end.zip
unzip -q GLSL_Mac_Linux_Low-end.zip
mkdir -p ~/.config/mpv/shaders
mv shaders/*.glsl ~/.config/mpv/shaders/

# adaptive-sharpen
# https://gist.github.com/igv
rm -rf ~/tmp_arch/adaptive-sharpen
mkdir -p ~/tmp_arch/adaptive-sharpen
cd ~/tmp_arch/adaptive-sharpen
wget https://gist.github.com/igv/8a77e4eb8276753b54bb94c1c50c317e/raw/572f59099cd0e3eb5e321a6da0a3d90a7382e2dc/adaptive-sharpen.glsl
mkdir -p ~/.config/mpv/shaders
mv adaptive-sharpen.glsl ~/.config/mpv/shaders/

# SSimSuperRes
# https://gist.github.com/igv
rm -rf ~/tmp_arch/SSimSuperRes
mkdir -p ~/tmp_arch/SSimSuperRes
cd ~/tmp_arch/SSimSuperRes
wget https://gist.github.com/igv/2364ffa6e81540f29cb7ab4c9bc05b6b/raw/15d93440d0a24fc4b8770070be6a9fa2af6f200b/SSimSuperRes.glsl
mkdir -p ~/.config/mpv/shaders
mv SSimSuperRes.glsl ~/.config/mpv/shaders/

# FSRCNNX: 高速超解像畳み込みニューラルネットワーク によるアップスケーラー
# https://github.com/igv/FSRCNN-TensorFlow/releases
rm -rf ~/tmp_arch/FSRCNN
mkdir -p ~/tmp_arch/FSRCNN
cd ~/tmp_arch/FSRCNN/
wget https://github.com/igv/FSRCNN-TensorFlow/releases/download/1.1/FSRCNNX_x2_16-0-4-1.glsl
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/

# ArtCNN: 超解像畳み込みニューラルネットワークによるアップスケーラー
# https://github.com/Artoriuz/ArtCNN
rm -rf ~/tmp_arch/ArtCNN
mkdir -p ~/tmp_arch/ArtCNN
cd ~/tmp_arch/ArtCNN/
wget https://github.com/Artoriuz/ArtCNN/archive/refs/heads/main.zip
unzip -q main.zip
mkdir -p ~/.config/mpv/shaders
mv ArtCNN-main/ArtCNN_C4F{16,32}.glsl ~/.config/mpv/shaders/

アップスケーラーにショートカットキーを割り当てる

次の行を ~/.config/mpv/input.conf に追加する。

# シェーダー変更
CTRL+1 no-osd change-list glsl-shaders set "~~/shaders/ravu-lite-r2.hook"; show-text "ravu-lite-r2"

CTRL+2 no-osd change-list glsl-shaders set "~~/shaders/ravu-r4.hook"; show-text "ravu-r4"

CTRL+3 no-osd change-list glsl-shaders set "~~/shaders/NVScaler.glsl"; show-text "NVScaler"

CTRL+4 no-osd change-list glsl-shaders set "~~/shaders/FSR.glsl"; show-text "FSR"

CTRL+5 no-osd change-list glsl-shaders set "~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Upscale_Denoise_CNN_x2_M.glsl:~~/shaders/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_S.glsl"; show-text "Anime4K: Mode C (Fast)"

CTRL+6 no-osd change-list glsl-shaders set "~~/shaders/adaptive-sharpen.glsl"; show-text "adaptive-sharpen"

CTRL+7 no-osd change-list glsl-shaders set "~~/shaders/SSimSuperRes.glsl"; show-text "SSimSuperRes"

CTRL+8 no-osd change-list glsl-shaders set "~~/shaders/FSRCNNX_x2_8-0-4-1.glsl"; show-text "FSRCNNX_x2_8-0-4-1"

CTRL+9 no-osd change-list glsl-shaders set "~~/shaders/FSRCNNX_x2_16-0-4-1.glsl"; show-text "FSRCNNX_x2_16-0-4-1"

CTRL+w no-osd change-list glsl-shaders set "~~/shaders/ArtCNN_C4F16.glsl"; show-text "ArtCNN_C4F16"

CTRL+0 no-osd change-list glsl-shaders clr ""; show-text "GLSL shaders cleared"

アップスケーラーの品質を比較

モニター解像度の縦横半分程度の画像をフルスクリーンで表示する。

mpv https://c4.wallpaperflare.com/wallpaper/300/319/704/5bd32e94974f2-wallpaper-preview.jpg --fs --pause

Ctrl+0, 1, 2.. と順に押していき、画像を比較する。


“ewa_lanczossharp” と “NVScaler” の違い。

アニメーションは、スクリーンショットから次のコマンドで作成した。

yay -S --needed imagemagick
for file in *.png; do convert "$file" -crop 620x480+600+300 "${file%.png}_cropped.png"; done
convert -delay 70 -loop 0 *_cropped.png shadertest.webp

コマ落ちしないか確認

yay -S --needed yt-dlp

# HD動画をFHDにアップスケール
mpv --ytdl-format=247+251 --vo=gpu-next --hwdec=auto-safe --ao=pipewire https://www.youtube.com/watch?v=Gs_OobgaMrw --geometry=1920x1080 --fs

# HD動画を4Kにアップスケール
mpv --ytdl-format=247+251 --vo=gpu-next --hwdec=auto-safe --ao=pipewire https://www.youtube.com/watch?v=Gs_OobgaMrw --geometry=3840x2160 --fs

Shift+I を押して情報画面を表示。F を押してウィンドウ表示にする。
Ctrl+0, 1, 2.. と順に押していき、“Dropped Frames” の値が増えないか確認。
Ryzen 5 5600G 内蔵GPU (Vega 7) の場合、HD動画を4Kにアップスケールしてコマ落ちせず再生できるのは次のシェーダー: RADV, NVScaler, FSR, Anime4K Mode C (Fast).

デフォルトのアップスケーラーを変更

例として ravu-lite-r2 に変更する。

mkdir -p ~/.config/mpv
printf 'vo=gpu-next
  hwdec=auto-safe
  profile=high-quality
  glsl-shaders="~~/shaders/ravu-lite-r2.hook"

ao=pipewire

# 音声のみのファイルでもウィンドウを表示する
force-window=yes

# 常にウィンドウを最大化
window-maximized=yes

# コンソールへのメッセージ出力を減らす
quiet=yes' > ~/.config/mpv/mpv.conf

参考: アップスケーラーの品質を数値で比較

こちらで比較されている。“Upsampling Results” の上位にあるシェーダーが、数値上では高品質。

キー割り当てを変更

次の行を ~/.config/mpv/input.conf に追加する。

# 右クリックによる一時停止を無効にする
MBTN_RIGHT ignore

# マウスホイールによる音量操作を無効にする
WHEEL_UP ignore
WHEEL_DOWN ignore
WHEEL_LEFT ignore
WHEEL_RIGHT ignore

# PageUp/PageDown で10分移動
PGUP seek 600
PGDWN seek -600

# Shift + PageUp/PageDown でチャプタ移動
Shift+PGUP add chapter 1
Shift+PGDWN add chapter -1

# Enter/Esc で終了
ENTER quit
ESC quit

右下の時間表示を「残り時間」から「全体の時間」に変更

画面右下の時間表示を「残り時間」から「全体の時間」に変更する。

mkdir -p ~/.config/mpv/script-opts

printf 'timetotal=yes
' > ~/.config/mpv/script-opts/osc.conf

音量を自動的に調整

動画の60秒目から120秒目までの最大音量を測定し、それを基に適切な音量を設定する。

次のコードを “mpv-adjustvol” という名前で保存。

#! /usr/bin/env ruby
# coding: utf-8

require "open3"
require "shellwords"
require "benchmark"

# ==============================================================================
# mpv-adjustvol
# ==============================================================================

f = ARGV

if f == []
    puts "Usage: mpv-adjustvol file"
    exit
end

maxvol = ""

benchtime = Benchmark.realtime do
    maxvol = Open3.capture3("ffmpeg -ss 90 -to 120 -i #{f[0].shellescape} -vn -af volumedetect -f null -")
end

maxvol = maxvol[1].scrub.split("max_volume: ")[1]
maxvol = maxvol.split(" dB")[0].to_f

# Limit max volume for safe
if maxvol > 10.0
    adjvol = -10.0
elsif maxvol < -10.0
    adjvol = 10.0
else
    adjvol = 0 - maxvol
end

adjvol = adjvol.to_s
maxvol = maxvol.to_s

puts "Orignal volume  = " + maxvol + " dB"
puts "Adjusted volume = " + adjvol + " dB"
puts "Calculation time = " + benchtime.to_s[0..4] + " seconds"

Open3.capture3("mpv -af volume=" + adjvol + "dB " + f[0].shellescape)

mpv-adjustvol でファイルを再生。

chmod a+x mpv-adjustvol
sudo cp mpv-adjustvol /usr/bin/
yay -S --needed ruby

mpv-adjustvol file

# Orignal volume  = -3.0 dB
# Adjusted volume = 3.0 dB
# Calculation time = 0.198 seconds

HOME