■mpv+vaapiで動画再生(ハードウェアアクセラレーションによるデコード)を試してみる。 $ find . \! -type d -cmin +0 -a -cmin -120 -exec mpv --hwdec=vaapi --vo=vaapi {} + ■検索語句として、カクカクは、スタッタリング (screen stuttering) 、 複数フレームの画像が混ざるのは、ティアリング(screen tearing)と言うらしい。 環境はdebian。 $ lsb_release -d Description: Debian GNU/Linux 9.9 (stretch) ■特別なGPUは無い環境なので、Intel第3世代CPUに内蔵されているグラフィックコントローラを使う。 VDPAUはNvidia主導の、VA-APIはIntel主導のAPI。 VDPAUは再生のみ。VA-APIはエンコードもできる。 $ ls -l /dev/dri/ 合計 0 crw-rw----+ 1 root video 226, 0 6月 1 00:53 card0 crw-rw---- 1 root video 226, 64 6月 1 00:53 controlD64 crw-rw----+ 1 root video 226, 128 6月 1 00:53 renderD128 $ lspci | grep Gra 00:02.0 VGA compatible controller: Intel Corporation 3rd Gen Core processor Graphics Controller (rev 09) $ lspci -vvv -s 00:02.0 00:02.0 VGA compatible controller: Intel Corporation 3rd Gen Core processor Graphics Controller (rev 09) (prog-if 00 [VGA controller]) Subsystem: Acer Incorporated [ALI] 3rd Gen Core processor Graphics Controller Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0 Interrupt: pin A routed to IRQ 30 Region 0: Memory at c0000000 (64-bit, non-prefetchable) [size=4M] Region 2: Memory at b0000000 (64-bit, prefetchable) [size=256M] Region 4: I/O ports at 2000 [size=64] [virtual] Expansion ROM at 000c0000 [disabled] [size=128K] Capabilities: <access denied> Kernel driver in use: i915 Kernel modules: i915 ■まずはVA-API動画再生支援の情報を採取してみる。 $ sudo apt-get install -y vainfo $ vainfo libva info: VA-API version 0.39.4 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.3) vainfo: Driver version: Intel i965 driver for Intel(R) Ivybridge Mobile - 1.7.3 vainfo: Supported profile and entrypoints VAProfileMPEG2Simple : VAEntrypointVLD VAProfileMPEG2Simple : VAEntrypointEncSlice VAProfileMPEG2Main : VAEntrypointVLD VAProfileMPEG2Main : VAEntrypointEncSlice VAProfileH264ConstrainedBaseline: VAEntrypointVLD VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice VAProfileH264Main : VAEntrypointVLD VAProfileH264Main : VAEntrypointEncSlice VAProfileH264High : VAEntrypointVLD VAProfileH264High : VAEntrypointEncSlice VAProfileH264StereoHigh : VAEntrypointVLD VAProfileVC1Simple : VAEntrypointVLD VAProfileVC1Main : VAEntrypointVLD VAProfileVC1Advanced : VAEntrypointVLD VAProfileNone : VAEntrypointVideoProc VAProfileJPEGBaseline : VAEntrypointVLD ■VA-API方式の動画再生支援に対応している方式の一覧 $ vainfo 2>&1 | awk '/VAEntrypointVLD/{print $1}' VAProfileMPEG2Simple VAProfileMPEG2Main VAProfileH264ConstrainedBaseline: VAProfileH264Main VAProfileH264High VAProfileH264StereoHigh VAProfileVC1Simple VAProfileVC1Main VAProfileVC1Advanced VAProfileJPEGBaseline ■次にVDPAU方式の動画再生支援の情報を採取してみる。 va_gl に設定する必要があるのは、Intel Graphics と、 AMD Catalyst 結局のとろこ、VDPAUは見つからず、VA-APIの情報の一部を表示している。 $ sudo apt-get install -y vdpauinfo $ vdpauinfo display: :0 screen: 0 Failed to open VDPAU backend libvdpau_i965.so: cannot open shared object file: No such file or directory Error creating VDPAU device: 1 $ env VDPAU_DRIVER=va_gl vdpauinfo display: :0 screen: 0 libva info: VA-API version 0.39.4 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 API version: 1 Information string: OpenGL/VAAPI backend for VDPAU Video surface: name width height types ------------------------------------------- 420 4096 4096 NV12 YV12 UYVY YUYV Y8U8V8A8 V8U8Y8A8 422 4096 4096 NV12 YV12 UYVY YUYV Y8U8V8A8 V8U8Y8A8 444 4096 4096 NV12 YV12 UYVY YUYV Y8U8V8A8 V8U8Y8A8 Decoder capabilities: name level macbs width height ---------------------------------------------------- MPEG1 --- not supported --- MPEG2_SIMPLE --- not supported --- MPEG2_MAIN --- not supported --- H264_BASELINE 51 16384 2048 2048 H264_MAIN 51 16384 2048 2048 H264_HIGH 51 16384 2048 2048 VC1_SIMPLE --- not supported --- VC1_MAIN --- not supported --- VC1_ADVANCED --- not supported --- MPEG4_PART2_SP --- not supported --- MPEG4_PART2_ASP --- not supported --- DIVX4_QMOBILE --- not supported --- DIVX4_MOBILE --- not supported --- DIVX4_HOME_THEATER --- not supported --- DIVX4_HD_1080P --- not supported --- DIVX5_QMOBILE --- not supported --- DIVX5_MOBILE --- not supported --- DIVX5_HOME_THEATER --- not supported --- DIVX5_HD_1080P --- not supported --- H264_CONSTRAINED_BASELINE 51 16384 2048 2048 H264_EXTENDED --- not supported --- H264_PROGRESSIVE_HIGH --- not supported --- H264_CONSTRAINED_HIGH --- not supported --- H264_HIGH_444_PREDICTIVE --- not supported --- HEVC_MAIN --- not supported --- HEVC_MAIN_10 --- not supported --- HEVC_MAIN_STILL --- not supported --- HEVC_MAIN_12 --- not supported --- HEVC_MAIN_444 --- not supported --- Output surface: name width height nat types ---------------------------------------------------- B8G8R8A8 8192 8192 y R8G8B8A8 8192 8192 y R10G10B10A2 8192 8192 y B10G10R10A2 8192 8192 y A8 8192 8192 y Bitmap surface: name width height ------------------------------ B8G8R8A8 8192 8192 R8G8B8A8 8192 8192 R10G10B10A2 8192 8192 B10G10R10A2 8192 8192 A8 8192 8192 Video mixer: feature name sup ------------------------------------ DEINTERLACE_TEMPORAL - DEINTERLACE_TEMPORAL_SPATIAL - INVERSE_TELECINE - NOISE_REDUCTION - SHARPNESS - LUMA_KEY - HIGH QUALITY SCALING - L1 - HIGH QUALITY SCALING - L2 - HIGH QUALITY SCALING - L3 - HIGH QUALITY SCALING - L4 - HIGH QUALITY SCALING - L5 - HIGH QUALITY SCALING - L6 - HIGH QUALITY SCALING - L7 - HIGH QUALITY SCALING - L8 - HIGH QUALITY SCALING - L9 - parameter name sup min max ----------------------------------------------------- VIDEO_SURFACE_WIDTH - VIDEO_SURFACE_HEIGHT - CHROMA_TYPE - LAYERS - attribute name sup min max ----------------------------------------------------- BACKGROUND_COLOR - CSC_MATRIX - NOISE_REDUCTION_LEVEL - SHARPNESS_LEVEL - LUMA_KEY_MIN_LUMA - LUMA_KEY_MAX_LUMA - ■VDPAU方式が対応している一覧 この環境では、OpenGL/VAAPIの情報のみ。 $ env VDPAU_DRIVER=va_gl vdpauinfo 2>&1 | awk 'BEGIN{a=1}{if(/Decoder capabilities:/){a=0}\ else{if(/Output surface:/){a=1}\ else{if((a==0 && $0 !~ /not supported/)||/backend/){print $0}}}}' Information string: OpenGL/VAAPI backend for VDPAU name level macbs width height ---------------------------------------------------- H264_BASELINE 51 16384 2048 2048 H264_MAIN 51 16384 2048 2048 H264_HIGH 51 16384 2048 2048 H264_CONSTRAINED_BASELINE 51 16384 2048 2048 ■mpvのインストール $ sudo apt-get install -y mpv $ mpv --list-options | awk '/vaapi|vdpau/' --hwdec Choices: no auto yes auto-copy vdpau vdpau-copy videotoolbox videotoolbox-copy vaapi vaapi-copy dxva2 dxva2-copy d3d11va d3d11va-copy rpi rpi-copy mediacodec cuda cuda-copy crystalhd (default: no) --hwdec-preload Choices: no auto yes auto-copy vdpau vdpau-copy videotoolbox videotoolbox-copy vaapi vaapi-copy dxva2 dxva2-copy d3d11va d3d11va-copy rpi rpi-copy mediacodec cuda cuda-copy crystalhd (default: no) --vo-vaapi-scaled-osd Flag (default: no) --vo-vaapi-scaling Choices: default fast hq nla (default: default) --vo-vdpau-chroma-deint Flag (default: yes) --vo-vdpau-colorkey Color --vo-vdpau-composite-detect Flag (default: yes) --vo-vdpau-deint Integer (-4 to 4) (default: 0) --vo-vdpau-denoise Float (0 to 1) (default: 0.000000) --vo-vdpau-force-yuv Flag (default: no) --vo-vdpau-fps Float (default: 0.000000) --vo-vdpau-hqscaling Integer (0 to 9) (default: 0) --vo-vdpau-output-surfaces Integer (2 to 15) (default: 3) --vo-vdpau-pullup Flag (default: no) --vo-vdpau-queuetime-fs Integer (default: 50) --vo-vdpau-queuetime-windowed Integer (default: 50) --vo-vdpau-sharpen Float (-1 to 1) (default: 0.000000) ■テスト動画を取得 選択したのは2DのFull HD (1920x1080)/60fps。 339Mもあるが、テストは全部ダウンロードしきらなくても行える。 Download Guide: Big Buck Bunny, Sunflower version http://bbb3d.renderfarming.net/download.html $ wget http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_60fps_normal.mp4 ■デフォルトの動画再生支援なしの場合、yuv420p vaapiが何らかの理由で使えずにfallbackした場合もこれ。 $ mpv bbb_sunflower_1080p_60fps_normal.mp4 Playing: bbb_sunflower_1080p_60fps_normal.mp4 (+) Video --vid=1 (*) (h264) (+) Audio --aid=1 --alang=und (*) (mp3) Audio --aid=2 --alang=und (*) (ac3) File tags: Artist: Blender Foundation 2008, Janus Bager Kristensen 2013 Comment: Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net Composer: Sacha Goedegebure Genre: Animation Title: Big Buck Bunny, Sunflower version AO: [pulse] 48000Hz stereo 2ch s16 VO: [opengl] 1920x1080 yuv420p AV: 00:00:10 / 00:10:34 (1%) A-V: 0.132 Dropped: 59 ■引数なしで「hwdec」オプションを付与すると、vaapi 「Failed to open VDPAU backend libvdpau_i965.so: cannot open shared object file: No such file or directory」の 行があるので、「自動」を選択したようなもの。 $ mpv --hwdec bbb_sunflower_1080p_60fps_normal.mp4 Playing: bbb_sunflower_1080p_60fps_normal.mp4 (+) Video --vid=1 (*) (h264) (+) Audio --aid=1 --alang=und (*) (mp3) Audio --aid=2 --alang=und (*) (ac3) File tags: Artist: Blender Foundation 2008, Janus Bager Kristensen 2013 Comment: Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net Composer: Sacha Goedegebure Genre: Animation Title: Big Buck Bunny, Sunflower version libva info: VA-API version 0.39.4 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 Failed to open VDPAU backend libvdpau_i965.so: cannot open shared object file: No such file or directory AO: [pulse] 48000Hz stereo 2ch s16 Using hardware decoding (vaapi). VO: [opengl] 1920x1080 vaapi AV: 00:00:03 / 00:10:34 (0%) A-V: 0.000 ■VO(Video Output)も、opengl の代わりにvaapi を使う。 $ mpv --vo=help Available video outputs: opengl : Extended OpenGL Renderer vdpau : VDPAU with X11 wayland : Wayland SHM video output xv : X11/Xv sdl : SDL 2.0 Renderer vaapi : VA API with X11 x11 : X11 (slow, old crap) null : Null video output image : Write video frames to image files tct : true-color terminals drm : Direct Rendering Manager $ mpv --hwdec=vaapi --vo=vaapi dlsv/bbb_sunflower_1080p_60fps_normal.mp4 Playing: dlsv/bbb_sunflower_1080p_60fps_normal.mp4 (+) Video --vid=1 (*) (h264) (+) Audio --aid=1 --alang=und (*) (mp3) Audio --aid=2 --alang=und (*) (ac3) File tags: Artist: Blender Foundation 2008, Janus Bager Kristensen 2013 Comment: Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net Composer: Sacha Goedegebure Genre: Animation Title: Big Buck Bunny, Sunflower version libva info: VA-API version 0.39.4 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 AO: [pulse] 48000Hz stereo 2ch s16 Using hardware decoding (vaapi). VO: [vaapi] 1920x1080 vaapi AV: 00:00:02 / 00:10:34 (0%) A-V: 0.000 Exiting... (Quit) ■使えるドライバを探したら、「i965_drv_video.so」が見つかったというイメージ。 $ ls -l /usr/lib/x86_64-linux-gnu/dri/ 合計 115472 -rw-r--r-- 5 root root 7273952 4月 26 2017 i915_dri.so -rw-r--r-- 5 root root 7273952 4月 26 2017 i965_dri.so -rw-r--r-- 1 root root 2113216 11月 11 2016 i965_drv_video.so -rw-r--r-- 8 root root 9969544 4月 26 2017 kms_swrast_dri.so -rw-r--r-- 8 root root 9969544 4月 26 2017 nouveau_dri.so -rw-r--r-- 5 root root 7273952 4月 26 2017 nouveau_vieux_dri.so -rw-r--r-- 5 root root 7273952 4月 26 2017 r200_dri.so -rw-r--r-- 8 root root 9969544 4月 26 2017 r300_dri.so -rw-r--r-- 8 root root 9969544 4月 26 2017 r600_dri.so -rw-r--r-- 5 root root 7273952 4月 26 2017 radeon_dri.so -rw-r--r-- 8 root root 9969544 4月 26 2017 radeonsi_dri.so -rw-r--r-- 8 root root 9969544 4月 26 2017 swrast_dri.so -rw-r--r-- 8 root root 9969544 4月 26 2017 virtio_gpu_dri.so -rw-r--r-- 8 root root 9969544 4月 26 2017 vmwgfx_dri.so ■(「*.crdownload」のためにファイルを探す「-typd f」ではなく)ディレクトリ以外で、 ファイルの最終ステータス変更日時が、「0分以上前かつ120分前」なら、 「mpv --hwdec」に引数としてマッチした複数のファイル名をパラメータで渡す。 「{} \;」だと1ファイル名毎に起動してしまうので、「{} +」を使う点に注意。 $ find . \! -type d -cmin +0 -a -cmin -120 -exec mpv --hwdec=vaapi --vo=vaapi {} +