mpv settings

Fedora 35 にしてから Celluloid がどうにも調子が悪い。
ブツブツとブラックアウトが入る、筆者自作の奴はもっと調子が悪いけど。

原因が解らない、mpv ライブラリが原因かな?
と思い確認のため素の mpv を入れてみた、dnf で普通に入れられる。
コチラはなんともない、てか mpv ってこんな感じだったっけ?
いや以前試しに使ってみたことはあるんだけど、もう何年も前だし。

今の筆者はコレで充分なんだけど、ということで乗り換えすることにした。
で、カスタムする方法を検索していたんですけど。

mpv – ArchWiki

日本語ページでは上記以外は情報が古過ぎで役に立たないな。
とにかく Linux でもハードウエア・アクセラレーションが使えると今頃知った。
あれ?と思ったけど筆者のその手の知識が古すぎるんだな。
それはそうと、Fedora では別途2つのライブラリを追加する必要がある。

Hardware decoding on Linux ? mpv-player/mpv Wiki ? GitHub

# Fedora dnf command
sudo dnf install libva-intel-driver
sudo dnf install libva-intel-hybrid-driver

Intel HD graphics の場合です。
AMD のグラフィックって元 ATI だし Linux への対応なんてお察しで。

準備はこれだけ、後は好みでカスタムしていくんですが拘りが二つ。
Esc はフルスクリーン解除、フルスクリーンでなければウインドウを閉じる。
ようするに Eye of GNOME の動作に合わせたい、筆者自作の奴もそうしていますし。
それとやはりディレクトリ内巡回機能が、プレイリスト化するのメンドイもん。
Ctrl+Down Ctrl+UP が標準では空いているのでココに割り付けしたい。

mpv.io

Lua や Javascript でなんとかなるっぽい。
こいつの js で ls する方法が解らないので Lua を久々に。
Lua の正規表現ってショボいな。
Javascript の /\.(mp4|m4v|mov)$/i を同様に定義できないんだが。
とりあえず *.mp4 だけでやってみた関数群。

ファイル名は何でもいい、場所は一行目に。
2022.01.12 複数の拡張子対応に書き換え、extstr 変数で指定

-- ~/.config/mpv/scripts/mpv_func.lua

extstr = 'mp4,m4v,mov'

-- Esc 時にフルスクリーンなら解除、でなければ終了
function on_escape()
    if mp.get_property_bool('fullscreen') then
        mp.set_property('fullscreen', 'no')
    else
        mp.command('quit')
    end
end
mp.add_key_binding('Esc', 'esc_func', on_escape)

-- Ctrl+DOWN でディレクトリ内の次ファイルを再生
function on_nextfile()
    local ex = false
    local fn = mp.get_property('filename')
    local directory = mp.get_property('path'):match('.*/')
    local pfile = io.popen('ls  "'..directory..'"')
    for filename in pfile:lines() do
        ext = filename:match('.*%.(.*)'):lower()
        if not(extstr:match(ext) == nil) then
            if ex then
                mp.command('loadfile "file://'..directory..filename..'"')
                break
            end
            ex = filename == fn
        end
    end
    pfile:close()
end
mp.add_key_binding('Ctrl+DOWN', 'nextfile_func', on_nextfile)

-- Ctrl+UP でディレクトリ内の手前ファイルを再生
function on_prevfile()
    local prevfn = ''
    local fn = mp.get_property('filename')
    local directory = mp.get_property('path'):match('.*/')
    local pfile = io.popen('ls  "'..directory..'"')
    for filename in pfile:lines() do
        ext = filename:match('.*%.(.*)'):lower()
        if not(extstr:match(ext) == nil) then
            if filename == fn then
                if not(prevfn == '') then
                    mp.command('loadfile "file://'..directory..prevfn..'"')
                end
                break
            end
            prevfn = filename
        end
    end
    pfile:close()
end
mp.add_key_binding('Ctrl+UP', 'prevfile_func', on_prevfile)

ハードウエア・アクセラレーション

# ~/.config/mpv/mpv.conf

# ハードウエア・アクセラレーション
profile=gpu-hq
hwdec=vaapi
tscale=oversample
correct-pts=yes

# 下記を指定すると筆者の環境 (i5-6500) ではコマ落ちする。
#scale=ewa_lanczossharp
#cscale=ewa_lanczossharp
#video-sync=display-resample

# 再生終了で本体を終了しない
keep-open=yes

ショートカット、とにかく EoG に合わせる

# ~/.config/mpv/input.conf

# GtkApplication ではないので Ctrl+Q で全体終了はできないけど
Ctrl+q quit
Ctrl+w quit

# GNOME アプリのフルスクリーンは F11 です
F11 cycle fullscreen

# 小さい動画は Ctrl+1 で FullHD にリサイズ
Ctrl+1 set autofit 1920x1080

# 回転、マイナスにはできないようなので
Ctrl+r add video-rotate 90
Ctrl+Shift+r add video-rotate -90
Ctrl+e add video-rotate 270
Ctrl+Shift+e add video-rotate -270

オンスクリーンコントローラを小さく

# ~/.config/mpv/script-opts/osc.conf

# 動画に合わせた OSC リサイズを無効に
vidscale=no

# OSC のサイズを少し小さくしてシークバー領域を増やす
scalewindowed=0.75
scalefullscreen=0.75

で。

vaapi

vaapi が適用され動作も筆者の好みな環境ができあがりました。
もう筆者はプレイヤーを自作しなくていいな、そろそろ公開終了するか。
これからはスクリプトで拡張の時代ですよ。

いや、LUMIX らしく動画もやろうかなとも思ったんだけど。
手持ちじゃユラユラしちゃって、コレこそ三脚無しじゃ不可能でした。