mattintosh note

どこかのエンジニアモドキの備忘録

mpv と youtube-dl を使ってブラウザを使わずに YouTube 動画を高画質で再生する

mpv にはハードウェア再生支援機能が付いている(ビルドによるんだろうけど)。

まずは対応状況確認。これは昨日の段階で Git ソースからビルドしたもの。Ubuntu 版は結構バージョンが古いし、caca が使えなかった。--hwdec= オプションには help がないが、無効な値を指定すると有効な値を表示してくれる。

$ mpv --version
mpv git-4395a4f (C) 2000-2016 mpv/MPlayer/mplayer2 projects
 built on Sat Sep 17 23:59:53 JST 2016
ffmpeg library versions:
   libavutil       54.31.100
   libavcodec      56.60.100
   libavformat     56.40.101
   libswscale      3.1.101
   libavfilter     5.40.101
   libswresample   1.2.101
ffmpeg version: 2.8.6-1ubuntu2

$ mpv --vo=help; mpv --hwdec=help
Available video outputs: opengl : Extended OpenGL Renderer vdpau : VDPAU with X11 wayland : Wayland SHM video output xv : X11/Xv vaapi : VA API with X11 x11 : X11 (slow, old crap) null : Null video output image : Write video frames to image files caca : libcaca drm : Direct Rendering Manager Invalid value for option hwdec: help Valid values are: no auto yes auto-copy vdpau videotoolbox videotoolbox-copy vaapi vaapi-copy dxva2 dxva2-copy d3d11va d3d11va-copy rpi mediacodec cuda cuda-copy Error parsing option hwdec (option could not be parsed) Setting command line option '--hwdec=help' failed. Exiting... (Fatal error)

hwdec の方は --list-options を見た方がいいかもしれない。

$ mpv --list-options | grep hwdec
 --hwdec                          Choices: no auto yes auto-copy vdpau videotoolbox videotoolbox-copy vaapi vaapi-copy dxva2 dxva2-copy d3d11va d3d11va-copy rpi mediacodec cuda cuda-copy (default: no)
 --hwdec-codecs                   String (default: h264,vc1,wmv3,hevc,mpeg2video,vp9)
 --hwdec-preload                  Choices: no auto yes auto-copy vdpau videotoolbox videotoolbox-copy vaapi vaapi-copy dxva2 dxva2-copy d3d11va d3d11va-copy rpi mediacodec cuda cuda-copy (default: no)

vainfo も見ておく。

$ vainfo
libva info: VA-API version 0.39.2 libva info: va_getDriverName() returns 0 libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so libva info: Found init function __vaDriverInit_0_39 libva info: va_openDriver() returns 0 vainfo: VA-API version: 0.39 (libva 1.7.1) vainfo: Driver version: Intel i965 driver for Intel(R) Sandybridge Mobile - 1.7.1 vainfo: Supported profile and entrypoints VAProfileMPEG2Simple : VAEntrypointVLD VAProfileMPEG2Main : VAEntrypointVLD VAProfileH264ConstrainedBaseline: VAEntrypointVLD VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice VAProfileH264Main : VAEntrypointVLD VAProfileH264Main : VAEntrypointEncSlice VAProfileH264High : VAEntrypointVLD VAProfileH264High : VAEntrypointEncSlice VAProfileH264StereoHigh : VAEntrypointVLD VAProfileVC1Simple : VAEntrypointVLD VAProfileVC1Main : VAEntrypointVLD VAProfileVC1Advanced : VAEntrypointVLD VAProfileNone : VAEntrypointVideoProc

さて、いま使っているマシンは Intel CPU なので vaapi-copy が最も良さそう。--vo の方は 60 fps 動画で色々試してみて一番滑らかに再生できるものを探す。

ちょうどこれが 60 fps なので借りてくる。

www.youtube.com

mpv 'https://www.youtube.com/watch?v=OO3UZBwpCLM' --hwdec=vaapi-copy --vo=opengl

ヌルヌル動けばOK。

f:id:mattintosh4:20160919002537p:plain

設定が決まったら ~/.config/mpv/mpv.conf に書いておく。

hwdec=vaapi-copy
vo=opengl

youtube-dl について

youtube-dl は名前の通り、YouTube の動画をそのままダウンロードしてくるソフトウェア。これは YouTube だけに限らず、他にも多くのサイトに対応している(対応リストはここ)。

著作権や日本国内の法律の問題もあるのでここではあまり詳しくは書かない。あくまで mpv のひとつの機能として、ダウンロードではなくストリーミングとしての扱い方に絞る。

再生に関するコントロールは mpv から行えるので最高画質・音質固定や連続(ループ)再生なども容易に指定することができる。また、mpv はプレイリストも扱えるので複数 URL をシャッフルするようなことも可能。

mpv では引数に YouTube のページ URL を与えるだけで再生ができる。(動画そのものの URL ではない)

mpv {YouTube URL}

品質の設定

man mpv によれば、品質は最高画質+最高音質の bestvideo+bestaudio/best となっているが、これはカスタマイズすることができる。

bestvideo+bestaudio(ビデオ・オーディオ分割)と best(単一ファイル)は前者の方が品質が良い。

例)低解像度のビデオに変更したい

PC のスペックが足りない場合や、ネットワークの帯域に余裕が無い場合などに。

mpv --ytdl-format="worst"
mpv --ytdl-format="[height<720]" {YouTube URL}
mpv --ytdl-format="[height<=480]" {YouTube URL}

解像度を下げたいが、画質は維持したい場合(60 fps の場合はこれ)

mpv --ytdl-format="bestvideo[height<=720]+bestaudio" {YouTube URL}

例)低解像度またはビデオなしでオーディオのみ最高品質で再生したい

mpv --ytdl-format="worstvideo+bestaudio" {YouTube URL}
mpv --ytdl-format="[height<=480]+bestaudio" {YouTube URL}
mpv --ytdl-format="bestaudio" {YouTube URL}

例えば、1366x768 のディスプレイで 1920x1080 の動画なんかを拾ってきても無駄が多いので ~/.config/mpv/mpv.conf に以下のように設定しておけばよい。(もし、一時的に ~/.config/mpv/mpv.conf の内容を無効にしたければオプションに --no-config を与えればよい)

ytdl-format=bestvideo[height<=720]+bestaudio/best

Raspberry PiYouTube ジュークボックスに

うちの Raspberry Pi にはスピーカーを接続していないのでメイン PC に PulseAudio を使ってオーディオだけ飛ばしている。mpv が OpenMAX に対応すれば FullHD の再生も滑らかになるのだが、まだ対応していないようだ。(--vo=rpi で X なしでも再生ができるようになってはいる)

export PULSE_SERVER=${SSH_CLIENT%% *}
mpv --hwdec=rpi --vo=rpi --ytdl-format="bestvideo[height<=480]+bestaudio" --shuffle --loop=force youtube_playlist.m3u

おわりに

一日中ずっと高画質で YouTube にアップされている動画を再生し続けたいなら mpv ほどシンプルなものはあまりないと思う。とりあえずローカルなら youtube.m3u みたいなファイル作ってそこに URL を1行ごとに貼って --loop=force --shuffle とでもしておけばいいだろう。ヒーリング・ミュージックを一日中再生するような日がよくあるので mpv のおかげでかなり楽になった。