2024-03-14
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