mpv で V4L に対応のキャプチャデバイスを使う備忘録です.
いつもの通り結論から書くと,
mpv av://v4l2:/dev/video2 –audio-file=av://pulse:alsa_output.pci-0000_00_1f.3.analog-stereo.monitor –demuxer-lavf-o=video_size=1366×768,framerate=30,input_format=mjpeg
で良さそうですが,なぜか elementary os7 環境だと映像がものすごくフレーム落ちします.映像のみだとそんなことにはならないですし,さらに,
mpv av://v4l2:/dev/video0 –demuxer-lavf-o=video_size=1366×768,input_format=mjpeg –profile=low-latency –untimed
のようにすると劇的に遅延が少ないです.この場合,音声は qpwgraph などを使って直接ルーティングすれば問題なく聞くことができます.
mpv ってなに?
mplayer と mplayer2 が源流の動画再生ソフトです.公式サイトは,
で,mplayer との違いは,
にまとめられていますが,このドキュメント自体が古いので注意するようにって記述があります.mplayer が源流なので使い方も同じような感じのようで,相当に違います.
しかし,mplayer よりかなり遅延を抑えることができるので,ノートPCのモニタなどを USB HDMI キャプチャカードを使って外付けディスプレイ代わりに使うのに向いていると思います.体感ですが,mplayer だと取り込んだ画面でのキーボード入力が明らかに遅延していることが分かるのに比べ,mpv だとリモートデスクトップ接続と同等くらいです.
mpv を Video4Linux2 で使う基本
方法はかなり探しにくいのですが,公式ドキュメント
に書かれています.
まず,基本の形は,
$ mpv av://v4l2:/dev/video0 --profile=low-latency
のようですが,このままだとフレームレート等自動選択されてしまいます.これらを指定したい場合は,
$ mpv av://v4l2:/dev/video0 --demuxer-lavf-o=video_size=1366x768,framerate=30,input_format=mjpeg --profile=low-latency
のようにします.キャプチャデバイスとして指定できる値等を調べる方法は,mplayer について記した前記事
と全く同じです.
ただし,音声の取込みオプションは全く異なり,
mpv av://v4l2:/dev/video0 --audio-file=av://pulse:alsa_input.usb-MACROSILICON_USB_Video-02.analog-stereo --demuxer-lavf-o=video_size=1366x768,input_format=mjpeg --demuxer-lavf-probe-info=auto
のような感じになります.見ての通り,mplayer は alsa から直接取り込めたのですが,mpv は pulseaudio 経由にしか対応していない(少なくとも私が調べた限りで)ようです.したがって,–audio-file=av://pulse: 以下で指定する値は,
$ LANG=C pactl list sources|grep Name Name: alsa_output.pci-0000_00_1f.3.analog-stereo.monitor Name: alsa_input.pci-0000_00_1f.3.analog-stereo
のようにして調べることになります.また,映像と音声をともに mpv で取り込む場合は,–profile=low-latency や –untimed などのオプションを付けると少なくとも私の環境の場合は全くダメで,このオプションを付けていない場合も盛大にフレーム落ちしてしまい,全く実用的ではありませんでした.アレコレ試しましたが,いまのところ改善はせず,この用途の場合は mplayer をいまのところ使っています.
mpv を Video4Linux2 で低遅延に使う
上で紹介した元サイトのドキュメント
の冒頭でも記されていますが,mpv で Video4Linux2 経由の取込みを行う場合は,
- –profile=low-latency
- –untimed
の2つのオプションを使うことで限界まで遅延を抑えることができるようです.実際の例は,
$ mpv av://v4l2:/dev/video0 --demuxer-lavf-o=video_size=1366x768,framerate=60,input_format=mjpeg --profile=low-latency --untimed
のような感じです.ただしこの場合音声がこのままだと出力されません.前回記事でも記しましたが,これは,USB HDMI キャプチャ・デバイスもそうですし,一般的なウェブカメラなどもそうだと思いますが,Linux の場合,音声の取込みデバイスは映像とは別に alsa デバイスとして認識されるのが原因です.したがって,この場合は,USB HDMI キャプチャカードの音声入力に対応する alsa デバイスの入力を直接 PC の音声出力デバイスにルーティングすることでPCから音声を出力させることができます.
音声のルーティングをコマンドでやるのは面倒なので,GUI 対応のアプリ qpwgraph などを使って,
のようにすれば良いです.なお,Ubuntu なら qpwgraph は,
$ sudo apt install qpwgraph
とするだけで導入できます.
最後に遅延の程度ですが,下の写真のような MJPEG 取込み対応の非常に低価格な USB3.0 対応のキャプチャデバイスと第8世代の Core i5 を搭載したPCを用いた場合,ほんのかすかに遅延しているかな……と感じる程度です.
実際に自宅にある Handycam の映像と音声を HDMI 経由で入力すると,本体の映像と音声にほぼ完全に重なるように PC から映像と音声が出力されます(mplayer の場合だと映像・音声ともにかなりずれていることが明確に分かります).恐らく,ゲームもあまりシビアなものでない限り大丈夫なんじゃないかなと思います.まぁ私はいまのところほとんどゲームすることないんですけどね.
以上!