Ubuntu 18.04 LTSのセットアップ6 - ffmpeg

インストール後のメモその6です。

ffmpegをビルドする。

ohac.hatenablog.com

この頃はハードウェアでのエンコーディングを知らなかったが、 その後、VAAPIを使うとCPUパワーをほとんど使わずにH.264エンコーディングできるということを知った。

ということで以下からgit cloneする。

Download FFmpeg

ビルドに必要なパッケージは以下である程度揃うはず。

sudo apt build-dep ffmpeg

./configure を実行。hwaccelsがEnabledになっていることを確認。

Enabled hwaccels:
h263_vaapi         mpeg1_xvmc             vc1_vaapi
h264_vaapi         mpeg2_vaapi            vc1_vdpau
h264_vdpau         mpeg2_vdpau            vp8_vaapi
hevc_vaapi         mpeg2_xvmc             vp9_vaapi
hevc_vdpau         mpeg4_vaapi            wmv3_vaapi
mjpeg_vaapi        mpeg4_vdpau            wmv3_vdpau
mpeg1_vdpau

makeを実行。マルチコアなら-j8とか付けてもいい。

終わったら sudo make install し、/usr/local/binにインストール。

最後に動作確認。

$ which ffmpeg
/usr/local/bin/ffmpeg
$ ffmpeg -version|head -1
ffmpeg version 3.4.2-2 Copyright (c) 2000-2018 the FFmpeg developers
$ ffmpeg -hwaccels 2>/dev/null
Hardware acceleration methods:
vdpau
vaapi
cuvid

$ ffmpeg -encoders 2>/dev/null | grep vaapi
 V..... h264_vaapi           H.264/AVC (VAAPI) (codec h264)
 V..... hevc_vaapi           H.265/HEVC (VAAPI) (codec hevc)
 V..... mjpeg_vaapi          MJPEG (VAAPI) (codec mjpeg)
 V..... mpeg2_vaapi          MPEG-2 (VAAPI) (codec mpeg2video)
 V..... vp8_vaapi            VP8 (VAAPI) (codec vp8)
 V..... vp9_vaapi            VP9 (VAAPI) (codec vp9)
$ ffmpeg -decoders 2>/dev/null | grep cuvid
 V..... h264_cuvid           Nvidia CUVID H264 decoder (codec h264)
 V..... hevc_cuvid           Nvidia CUVID HEVC decoder (codec hevc)
 V..... mjpeg_cuvid          Nvidia CUVID MJPEG decoder (codec mjpeg)
 V..... mpeg1_cuvid          Nvidia CUVID MPEG1VIDEO decoder (codec mpeg1video)
 V..... mpeg2_cuvid          Nvidia CUVID MPEG2VIDEO decoder (codec mpeg2video)
 V..... mpeg4_cuvid          Nvidia CUVID MPEG4 decoder (codec mpeg4)
 V..... vc1_cuvid            Nvidia CUVID VC1 decoder (codec vc1)
 V..... vp8_cuvid            Nvidia CUVID VP8 decoder (codec vp8)
 V..... vp9_cuvid            Nvidia CUVID VP9 decoder (codec vp9)
$ ffmpeg -decoders 2>/dev/null | grep vdpau
 V....D h264_vdpau           H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (VDPAU acceleration) (codec h264)
 V....D mpeg1video_vdpau     MPEG-1 video (VDPAU acceleration) (codec mpeg1video)
 V....D mpegvideo_vdpau      MPEG-1/2 video (VDPAU acceleration) (codec mpeg2video)
 V....D mpeg4_vdpau          MPEG-4 part 2 (VDPAU) (codec mpeg4)
 V....D vc1_vdpau            SMPTE VC-1 VDPAU (codec vc1)
 V....D wmv3_vdpau           Windows Media Video 9 VDPAU (codec wmv3)

webcamのキャプチャ確認。

$ man ffmpeg 2>/dev/null | grep video4
               ffmpeg -f oss -i /dev/dsp -f video4linux2 -i /dev/video0 /tmp/out.mpg
               ffmpeg -f alsa -ac 1 -i hw:1 -f video4linux2 -i /dev/video0 /tmp/out.mpg
$ ffmpeg -f video4linux2 -i /dev/video0 /tmp/out.mpg

再生。vlcが最もCPU負荷が軽いようだ。

$ ffplay /tmp/out.mpg
$ ffmpeg -re -i /tmp/out.mpg -f xv display
$ vlc /tmp/out.mpg

ハードウェアアクセラレータを使ったエンコードを確認。

$ ffmpeg -vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -f video4linux2 -i /dev/video0 -vf 'format=nv12|vaapi,hwupload' -c:v h264_vaapi -y /tmp/out.mkv

画面のキャプチャ例。

$ ffmpeg -vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -f x11grab -i :0.0+100,100 -video_size vga -framerate 30 -vf 'format=nv12|vaapi,hwupload' -c:v h264_vaapi -y /tmp/out.mkv

VDPAUを有効にして再生したが、効果はいまいち。vlcが一番よさそう。

sudo apt install vdpauinfo libvdpau-va-gl1 vdpau-va-driver
VDPAU_DRIVER=va_gl vdpauinfo
VDPAU_DRIVER=va_gl ffmpeg -hwaccel vdpau -re -i /tmp/out.mkv -pix_fmt yuv420p -f xv display