さくらインターネット Advent Calendar 2021 2日目の記事です。
前置き
どうも、さくらインターネットクラウド事業本部のやまけんです。
2018年のアドベントカレンダーにNVIDIAのGPUに搭載されているNVEncを使う話を書きましたがその続きになります。
おかげさまで上記記事については一定数のニーズがあるようで、CUDAのバージョンが上がったりNVIDIA VIDEO CODECのバージョンが上がったり、UbuntuのLTS版のバージョンが上がったりするたびにメンテナンスをしておりまして、未だ参考にしていただいてることに感謝いたします。
はてさて、この記事執筆から3年経ちまして、ハードウェアエンコードってどうなのっていうところで、比較検証などを記事にしたいと思います。
検証環境
- Fujitsu TX1310M3
- CPU Celeron G3930
- Mem 16GB
- GPU1 Intel HD 630
- GPU2 NVIDIA T400
- OS Ubuntu 20.04.3 LTS
GPU NVIDIA T400について
NVIDIAから販売しているNVIDIA T400について紹介します。
いわゆるワークステーション向けQuadroラインナップですが、今年からデータセンター向けTeslaやワークステーション向けQuadroからそれぞれのブランド名が消えて NVIDIA なんちゃらという命名規則になりました。
本製品はQuadro P400の後継となり、Turing世代になりました。今のRTX30はAmpere世代ですから1世代古いものになります。
コンシューマ向けでいうところのGTX1650と同じTU117チップを利用していますが、CUDAコアが384個と半分以下に減らされていますので、実質GT1030の後継ぐらいの立ち位置ですかね。
お値段も安く、私がぷらっとオンラインで購入した際は14,390円でした。
現在販売終了してしまったのですが、近々メモリが倍の4GBとなって再販するので暫し待つと良いかと(値段も上がるとはいえ、それほど変わらない感じという噂)
サイズも1UでLowProfile 消費電力30Wと、1Uサーバにも搭載できるサイズです(Fujitsu RX2530M4にて検証済み)
動画のエンコードだけをさせるにはちょうど良いGPUです。
Turing世代ではありますが、TU117はNVEncにおいてはPascalやVolta世代同等6th Genのため残念ながらH.265のBフレーム対応はしていません。
参考 Video Encode and Decode GPU Support Matrix
https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new
GPUカードのため、使用しているサーバによってはBMCチップのVGA機能と衝突してしまい、リモートKVMが使えなくなったりします。(Fujitsu RX2530M4 で確認)
デスクトップでもオンボードGPUとも排他利用となっている場合は、同様ですので、注意が必要です。
検証環境構築
今回はCPUに搭載されてるGPUであるIntel HD 630を使ったIntelQSVと、GPUカードのNVIDIA T400をつかったNVENC、X264によるソフトウェアエンコードの3つの環境で生成したファイルを動画品質評価に使うVMAFスコアを用いて判定します。
環境構築には下記の記事を参考に構築していきます。
Intel media stack componentsとiHDドライバのインストール
Ubuntu19.04以降は公式aptに用意されてるので非常に楽です。
# Intel media stack componentsのインストール
sudo apt-get install libva-dev libmfx-dev intel-media-va-driver-non-free vainfo
export LIBVA_DRIVER_NAME=iHD
インストール完了後、vainfoを実行し、ドライバが見えるか確認しましょう。
test@test:~$ sudo vainfo
error: XDG_RUNTIME_DIR not set in the environment.
error: can't connect to X server!
libva info: VA-API version 1.7.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_7
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.7 (libva 2.6.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 20.1.1 ()
vainfo: Supported profile and entrypoints
VAProfileNone : VAEntrypointVideoProc
VAProfileNone : VAEntrypointStats
VAProfileMPEG2Simple : VAEntrypointVLD
VAProfileMPEG2Simple : VAEntrypointEncSlice
VAProfileMPEG2Main : VAEntrypointVLD
VAProfileMPEG2Main : VAEntrypointEncSlice
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSlice
VAProfileH264Main : VAEntrypointFEI
VAProfileH264Main : VAEntrypointEncSliceLP
VAProfileH264High : VAEntrypointVLD
VAProfileH264High : VAEntrypointEncSlice
VAProfileH264High : VAEntrypointFEI
VAProfileH264High : VAEntrypointEncSliceLP
VAProfileVC1Simple : VAEntrypointVLD
VAProfileVC1Main : VAEntrypointVLD
VAProfileVC1Advanced : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointEncPicture
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
VAProfileH264ConstrainedBaseline: VAEntrypointFEI
VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
VAProfileVP8Version0_3 : VAEntrypointVLD
VAProfileVP8Version0_3 : VAEntrypointEncSlice
VAProfileHEVCMain : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointEncSlice
VAProfileHEVCMain : VAEntrypointFEI
VAProfileHEVCMain10 : VAEntrypointVLD
VAProfileHEVCMain10 : VAEntrypointEncSlice
VAProfileVP9Profile0 : VAEntrypointVLD
VAProfileVP9Profile2 : VAEntrypointVLD
Driver version: Intel iHD driver for Intel(R) Gen Graphics - 20.1.1
とのことで、問題なくiHDが使えます。
しかし、このままでは、エンコードに使う /dev/dri/renderD128 のパーミッションの問題で、一般ユーザーでffmpegを使う場合、HWエンコードができなくなります。
test@test:~$ ls -l /dev/dri/render*
crw-rw---- 1 root render 226, 128 Aug 15 13:53 /dev/dri/renderD128
test@test:~$
そこで、一般ユーザーでもアクセス可能にするための設定ファイルを作成します。
sudo vi /etc/udev/rules.d/99-render.rules
KERNEL=="render*" GROUP="render", MODE="0666"
OS再起動後、デバイスのパーミッションを確認します。
test@test:~$ ls -l /dev/dri/render*
crw-rw-rw- 1 root render 226, 128 Aug 15 13:53 /dev/dri/renderD128
test@test:~$
vainfoも一般ユーザーで実行できるようになるはずです。
test@test:~$ vainfo
error: XDG_RUNTIME_DIR not set in the environment.
error: can't connect to X server!
libva info: VA-API version 1.7.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_7
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.7 (libva 2.6.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 20.1.1 ()
vainfo: Supported profile and entrypoints
VAProfileNone : VAEntrypointVideoProc
VAProfileNone : VAEntrypointStats
VAProfileMPEG2Simple : VAEntrypointVLD
VAProfileMPEG2Simple : VAEntrypointEncSlice
VAProfileMPEG2Main : VAEntrypointVLD
VAProfileMPEG2Main : VAEntrypointEncSlice
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSlice
VAProfileH264Main : VAEntrypointFEI
VAProfileH264Main : VAEntrypointEncSliceLP
VAProfileH264High : VAEntrypointVLD
VAProfileH264High : VAEntrypointEncSlice
VAProfileH264High : VAEntrypointFEI
VAProfileH264High : VAEntrypointEncSliceLP
VAProfileVC1Simple : VAEntrypointVLD
VAProfileVC1Main : VAEntrypointVLD
VAProfileVC1Advanced : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointEncPicture
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
VAProfileH264ConstrainedBaseline: VAEntrypointFEI
VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
VAProfileVP8Version0_3 : VAEntrypointVLD
VAProfileVP8Version0_3 : VAEntrypointEncSlice
VAProfileHEVCMain : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointEncSlice
VAProfileHEVCMain : VAEntrypointFEI
VAProfileHEVCMain10 : VAEntrypointVLD
VAProfileHEVCMain10 : VAEntrypointEncSlice
VAProfileVP9Profile0 : VAEntrypointVLD
VAProfileVP9Profile2 : VAEntrypointVLD
CUDAのインストール
NVIDIA CUDA Installation Guide for Linux に従って入れます
https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html
今回はパッケージで入れたいと思いますので、
2. Pre-installation Actions
3. Package Manager Installation
7. Post-installation Actions
こちらを進めれば良いです。
# Kernel Headerを入れる
sudo apt-get install software-properties-common linux-headers-$(uname -r)
# aptプライオリティpinファイルをDL
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
# aptプライオリティpinファイルをaptのフォルダに移動
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
# GPGキーをインポート
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/3bf863cc.pub
リポジトリを登録
sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ /"
# リポジトリ更新
sudo apt-get update
# CUDAインストール
sudo apt-get -y install cuda
# パスを通す
echo 'export PATH=/usr/local/cuda-11.8/bin${PATH:+:${PATH}}' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}' >> ~/.bashrc
source ~/.bashrc
サーバなどで、GUIを使っておらず、CLI利用の場合、ドライバ類のインストールと共にX関連も入れるので、必要に応じてCLI起動するように設定しましょう。(必須ではありません。Tesla使ってたらそもそも不要)
# 現在の設定を確認
test@test:~$ systemctl get-default
graphical.target
graphical.targetと帰ってくると、GUI起動になってるので、CLI(sysvinitでいうrunlevel3)に設定変更
# multi-user.target へ変更
test@test:~$sudo systemctl set-default multi-user.target
Created symlink /etc/systemd/system/default.target → /lib/systemd/system/multi-user.target.
これで再起動後よりCLIになります。
インストールが完了したら再起動し、 nvidia-smi にてドライバインストールも含め完了しているか確認しましょう。
test@test:~$ nvidia-smi
Wed Nov 17 15:13:37 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 495.29.05 Driver Version: 495.29.05 CUDA Version: 11.5 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA T400 On | 00000000:01:00.0 Off | N/A |
| 38% 47C P8 N/A / 31W | 1MiB / 1876MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
test@test:~$
FFmpegのインストール
Compile FFmpeg for Ubuntu, Debian, or Mint
https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu
こちらをベースにffmpegとnv-codec-headersとlibvmaf以外はパッケージで入れます。
またインストールされるCUDAのバージョン次第で
--extra-cflags="-I/usr/local/cuda-11.5/include"
--extra-ldflags="-L/usr/local/cuda-11.5/lib64"
を正しいCUDAライブラリのパスに直す必要があります。
# FFmpegコンパイルに必要なものを導入
sudo apt-get update -qq && sudo apt-get -y install \
autoconf \
automake \
build-essential \
cmake \
git-core \
libass-dev \
libfreetype6-dev \
libgnutls28-dev \
libunistring-dev \
libmp3lame-dev \
libtool \
libvorbis-dev \
meson \
ninja-build \
pkg-config \
texinfo \
wget \
yasm \
zlib1g-dev
# 作業ディレクトリ作成
mkdir -p ~/ffmpeg_sources ~/bin
# NASM インストール
sudo apt-get -y install nasm
# libx264 インストール
sudo apt-get -y install libx264-dev
# libx265 インストール
sudo apt-get -y install libx265-dev libnuma-dev
# libvpx インストール
sudo apt-get -y install libvpx-dev
# libfdk-aac インストール
sudo apt-get -y install libfdk-aac-dev
# libopus インストール
sudo apt-get -y install libopus-dev
# libaom インストール
sudo apt-get -y install libaom-dev
# libvmaf インストール
cd ~/ffmpeg_sources && \
wget https://github.com/Netflix/vmaf/archive/v2.1.1.tar.gz && \
tar xvf v2.1.1.tar.gz && mkdir -p vmaf-2.1.1/libvmaf/build && \
cd vmaf-2.1.1/libvmaf/build && \
meson setup -Denable_tests=false -Denable_docs=false --buildtype=release --default-library=static .. --prefix "$HOME/ffmpeg_build" --bindir="$HOME/ffmpeg_build/bin" --libdir="$HOME/ffmpeg_build/lib" && \
ninja && \
ninja install
# NVIDIA codec API インストール
cd ~/ffmpeg_sources && \
git -C nv-codec-headers pull 2> /dev/null || git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers && \
cd nv-codec-headers && \
make && \
make install PREFIX="$HOME/ffmpeg_build"
# FFmpeg インストール
cd ~/ffmpeg_sources && \
wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 && \
tar xjvf ffmpeg-snapshot.tar.bz2 && \
cd ffmpeg && \
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
--prefix="$HOME/ffmpeg_build" \
--pkg-config-flags="--static" \
--extra-cflags="-I$HOME/ffmpeg_build/include" \
--extra-ldflags="-L$HOME/ffmpeg_build/lib" \
--enable-cuda-nvcc \
--nvccflags="-gencode arch=compute_75,code=sm_75 -O2" \
--enable-cuvid \
--enable-nvenc \
--enable-libnpp \
--extra-cflags="-I/usr/local/cuda-11.8/include" \
--extra-ldflags="-L/usr/local/cuda-11.8/lib64" \
--extra-libs="-lpthread -lm" \
--ld="g++" \
--bindir="$HOME/bin" \
--enable-gpl \
--enable-gnutls \
--enable-libaom \
--enable-libass \
--enable-libfdk-aac \
--enable-libfreetype \
--enable-libmp3lame \
--enable-libopus \
--enable-libvorbis \
--enable-libvpx \
--enable-libx264 \
--enable-libx265 \
--enable-libvmaf \
--enable-vaapi \
--enable-libmfx \
--enable-nonfree && \
PATH="$HOME/bin:$PATH" make && \
make install && \
hash -r
パスを通したり
source ~/.profile
echo "MANPATH_MAP $HOME/bin $HOME/ffmpeg_build/share/man" >> ~/.manpath
動作確認
実際にインストールが成功したか、下記のコマンドでQSVエンコード関連オプションが使えるか確認します。
for i in buildconf hwaccels decoders filters encoders; do echo $i:; ffmpeg -hide_banner -${i} | egrep -i "qsv|vaapi|libmfx"; done
結果はこのようになると思います。
test@test:~$ for i in buildconf hwaccels decoders filters encoders; do echo $i:; ffmpeg -hide_banner -${i} | egrep -i "qsv|vaapi|libmfx"; done
buildconf:
--enable-vaapi
--enable-libmfx
hwaccels:
vaapi
qsv
decoders:
V....D av1_qsv AV1 video (Intel Quick Sync Video acceleration) (codec av1)
V....D h264_qsv H264 video (Intel Quick Sync Video acceleration) (codec h264)
V....D hevc_qsv HEVC video (Intel Quick Sync Video acceleration) (codec hevc)
V....D mjpeg_qsv MJPEG video (Intel Quick Sync Video acceleration) (codec mjpeg)
V....D mpeg2_qsv MPEG2VIDEO video (Intel Quick Sync Video acceleration) (codec mpeg2video)
V....D vc1_qsv VC1 video (Intel Quick Sync Video acceleration) (codec vc1)
V....D vp8_qsv VP8 video (Intel Quick Sync Video acceleration) (codec vp8)
V....D vp9_qsv VP9 video (Intel Quick Sync Video acceleration) (codec vp9)
filters:
... deinterlace_qsv V->V QuickSync video deinterlacing
... deinterlace_vaapi V->V Deinterlacing of VAAPI surfaces
... denoise_vaapi V->V VAAPI VPP for de-noise
... overlay_qsv VV->V Quick Sync Video overlay.
... procamp_vaapi V->V ProcAmp (color balance) adjustments for hue, saturation, brightness, contrast
... scale_qsv V->V QuickSync video scaling and format conversion
... scale_vaapi V->V Scale to/from VAAPI surfaces.
... sharpness_vaapi V->V VAAPI VPP for sharpness
... tonemap_vaapi V->V VAAPI VPP for tone-mapping
... transpose_vaapi V->V VAAPI VPP for transpose
... vpp_qsv V->V Quick Sync Video VPP.
encoders:
V..... h264_qsv H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (Intel Quick Sync Video acceleration) (codec h264)
V....D h264_vaapi H.264/AVC (VAAPI) (codec h264)
V..... hevc_qsv HEVC (Intel Quick Sync Video acceleration) (codec hevc)
V....D hevc_vaapi H.265/HEVC (VAAPI) (codec hevc)
V..... mjpeg_qsv MJPEG (Intel Quick Sync Video acceleration) (codec mjpeg)
V....D mjpeg_vaapi MJPEG (VAAPI) (codec mjpeg)
V..... mpeg2_qsv MPEG-2 video (Intel Quick Sync Video acceleration) (codec mpeg2video)
V....D mpeg2_vaapi MPEG-2 (VAAPI) (codec mpeg2video)
V....D vp8_vaapi VP8 (VAAPI) (codec vp8)
V....D vp9_vaapi VP9 (VAAPI) (codec vp9)
V..... vp9_qsv VP9 video (Intel Quick Sync Video acceleration) (codec vp9)
test@test:~$
次にNVENCも使えるか確認します。
for i in buildconf hwaccels decoders filters encoders; do echo $i:; ffmpeg -hide_banner -${i} | egrep -i "npp|cuvid|nvenc|cuda|nvdec"; done
結果はこのようになると思います。
test@test:~$ for i in buildconf hwaccels decoders filters encoders; do echo $i:; ffmpeg -hide_banner -${i} | egrep -i "npp|cuvid|nvenc|cuda|nvdec"; done
buildconf:
--enable-cuda-nvcc
--enable-cuvid
--enable-nvenc
--enable-libnpp
--extra-cflags=-I/usr/local/cuda-11.4/include
--extra-ldflags=-L/usr/local/cuda-11.4/lib64
hwaccels:
cuda
decoders:
V..... av1_cuvid Nvidia CUVID AV1 decoder (codec av1)
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)
filters:
... hwupload_cuda V->V Upload a system memory frame to a CUDA device.
... overlay_cuda VV->V Overlay one video on top of another using CUDA
... scale_cuda V->V GPU accelerated video resizer
... scale_npp V->V NVIDIA Performance Primitives video scaling and format conversion
... thumbnail_cuda V->V Select the most representative frame in a given sequence of consecutive frames.
... transpose_npp V->V NVIDIA Performance Primitives video transpose
T.. yadif_cuda V->V Deinterlace CUDA frames
encoders:
V....D h264_nvenc NVIDIA NVENC H.264 encoder (codec h264)
V..... nvenc NVIDIA NVENC H.264 encoder (codec h264)
V..... nvenc_h264 NVIDIA NVENC H.264 encoder (codec h264)
V..... nvenc_hevc NVIDIA NVENC hevc encoder (codec hevc)
V....D hevc_nvenc NVIDIA NVENC hevc encoder (codec hevc)
test@test:~$
比較検証
VMAFについて
VMAF Video Multimethod Assessment Fusion はアメリカ南カリフォルニア大学と、フランスのナント大学デジタル科学研究所IPIラボ、アメリカテキサス大学オースティン校のイメージ&ビデオ工学研究室が協力し、Netflixが開発した動画の品質を評価するツールです。
比較した動画が近ければ近いほど100点になりますし、全く違っていれば0点になります。
詳しい紹介は弊社のさくらのナレッジに紹介記事がありますので、そちらを参考にしていただければ。
今回は上記記事を参考に、H.264の動画をH.265にトランスコードして変換速度や品質という点で評価をしていきたいと思います。
VMAF比較モデルデータの入手
wget https://github.com/Netflix/vmaf/archive/refs/heads/master.zip
unzip master.zip 'vmaf-master/model/*'
sudo cp -r vmaf-master/model /usr/local/share/
比較用動画の入手
今回は Creative Commons Attribution 3.0 で公開されている動画 Big Buck Bunny を使用します。
動画ライセンスについてはこちら https://peach.blender.org/about/
wget http://distribution.bbb3d.renderfarming.net/video/mp4/bbb_sunflower_1080p_30fps_normal.mp4
この動画のビットレートや長さなど詳細情報をffprobeコマンドで確認します。
test@test:~$ ffprobe -i bbb_sunflower_1080p_30fps_normal.mp4
ffprobe version N-104716-g96caa01f13 Copyright (c) 2007-2021 the FFmpeg developers
built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04)
configuration: --prefix=/home/ubuntu/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/ubuntu/ffmpeg_build/include --extra-ldflags=-L/home/ubuntu/ffmpeg_build/lib --enable-cuda-nvcc --nvccflags='-gencode arch=compute_52,code=sm_52 -O2' --enable-cuvid --enable-nvenc --enable-libnpp --extra-cflags=-I/usr/local/cuda-11.5/include --extra-ldflags=-L/usr/local/cuda-11.5/lib64 --extra-libs='-lpthread -lm' --ld=g++ --bindir=/home/ubuntu/bin --enable-gpl --enable-gnutls --enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libvmaf --enable-vaapi --enable-libmfx --enable-nonfree
libavutil 57. 9.101 / 57. 9.101
libavcodec 59. 14.100 / 59. 14.100
libavformat 59. 9.102 / 59. 9.102
libavdevice 59. 0.101 / 59. 0.101
libavfilter 8. 17.100 / 8. 17.100
libswscale 6. 1.101 / 6. 1.101
libswresample 4. 0.100 / 4. 0.100
libpostproc 56. 0.100 / 56. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'bbb_sunflower_1080p_30fps_normal.mp4':
Metadata:
major_brand : isom
minor_version : 1
compatible_brands: isomavc1
creation_time : 2013-12-16T17:44:39.000000Z
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
genre : Animation
composer : Sacha Goedegebure
Duration: 00:10:34.53, start: 0.000000, bitrate: 3481 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2998 kb/s, 30 fps, 30 tbr, 30k tbn (default)
Metadata:
creation_time : 2013-12-16T17:44:39.000000Z
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
Stream #0:1[0x2](und): Audio: mp3 (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 160 kb/s (default)
Metadata:
creation_time : 2013-12-16T17:44:42.000000Z
handler_name : GPAC ISO Audio Handler
vendor_id : [0][0][0][0]
Stream #0:2[0x3](und): Audio: ac3 (ac-3 / 0x332D6361), 48000 Hz, 5.1(side), fltp, 320 kb/s (default)
Metadata:
creation_time : 2013-12-16T17:44:42.000000Z
handler_name : GPAC ISO Audio Handler
vendor_id : [0][0][0][0]
Side data:
audio service type: main
ubuntu@test:~$
Duration: 00:10:34.53, start: 0.000000, bitrate: 3481 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2998 kb/s, 30 fps, 30 tbr, 30k tbn (default)
10分34秒53の長さで平均ビットレート3481 kb/s 1920x1080 30fps のh264のファイルというのが確認できました。
このままでは、動画の尺が長すぎるので、3分の動画に切り取り、音声トラックも不要なのでカットしたものを使用したいと思います。
ffmpeg -ss 15 -t 180 -i bbb_sunflower_1080p_30fps_normal.mp4 -vcodec copy -an -y base.mp4
ubuntu@test:~$ ffmpeg -ss 15 -t 180 -i bbb_sunflower_1080p_30fps_normal.mp4 -vcodec copy -an -y base.mp4
ffmpeg version N-104716-g96caa01f13 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04)
configuration: --prefix=/home/ubuntu/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/ubuntu/ffmpeg_build/include --extra-ldflags=-L/home/ubuntu/ffmpeg_build/lib --enable-cuda-nvcc --nvccflags='-gencode arch=compute_52,code=sm_52 -O2' --enable-cuvid --enable-nvenc --enable-libnpp --extra-cflags=-I/usr/local/cuda-11.5/include --extra-ldflags=-L/usr/local/cuda-11.5/lib64 --extra-libs='-lpthread -lm' --ld=g++ --bindir=/home/ubuntu/bin --enable-gpl --enable-gnutls --enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libvmaf --enable-vaapi --enable-libmfx --enable-nonfree
libavutil 57. 9.101 / 57. 9.101
libavcodec 59. 14.100 / 59. 14.100
libavformat 59. 9.102 / 59. 9.102
libavdevice 59. 0.101 / 59. 0.101
libavfilter 8. 17.100 / 8. 17.100
libswscale 6. 1.101 / 6. 1.101
libswresample 4. 0.100 / 4. 0.100
libpostproc 56. 0.100 / 56. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'bbb_sunflower_1080p_30fps_normal.mp4':
Metadata:
major_brand : isom
minor_version : 1
compatible_brands: isomavc1
creation_time : 2013-12-16T17:44:39.000000Z
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
genre : Animation
composer : Sacha Goedegebure
Duration: 00:10:34.53, start: 0.000000, bitrate: 3481 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2998 kb/s, 30 fps, 30 tbr, 30k tbn (default)
Metadata:
creation_time : 2013-12-16T17:44:39.000000Z
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
Stream #0:1[0x2](und): Audio: mp3 (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 160 kb/s (default)
Metadata:
creation_time : 2013-12-16T17:44:42.000000Z
handler_name : GPAC ISO Audio Handler
vendor_id : [0][0][0][0]
Stream #0:2[0x3](und): Audio: ac3 (ac-3 / 0x332D6361), 48000 Hz, 5.1(side), fltp, 320 kb/s (default)
Metadata:
creation_time : 2013-12-16T17:44:42.000000Z
handler_name : GPAC ISO Audio Handler
vendor_id : [0][0][0][0]
Side data:
audio service type: main
Output #0, mp4, to 'base.mp4':
Metadata:
major_brand : isom
minor_version : 1
compatible_brands: isomavc1
composer : Sacha Goedegebure
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
genre : Animation
encoder : Lavf59.9.102
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 2998 kb/s, 30 fps, 30 tbr, 30k tbn (default)
Metadata:
creation_time : 2013-12-16T17:44:39.000000Z
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
frame= 5600 fps=0.0 q=-1.0 Lsize= 57406kB time=00:02:59.96 bitrate=2613.1kbits/s speed=2.5e+03x
video:57344kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.107650%
ubuntu@test:~$
これで、平均ビットレート 2613.1kbits/s 容量 57406kB な base.mp4という動画ができあがります。
Duration: 00:03:00.07, start: 0.000000, bitrate: 2611 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2608 kb/s, 30 fps, 30 tbr, 30k tbn (default)
動画の長さが ほぼ3分平均ビットレートが 2611 kb/sとなりました。また、音声トラックも無くなっています。
1.デフォルト設定での比較
特にビットレートや品質をいじらず、デフォルト設定で吐き出す動画での比較をまず行います。
X265
エンコード
x265でエンコードします。timeコマンドをつけて時間を測定します。
time ffmpeg -i base.mp4 -c:v libx265 -tag:v hvc1 -y encoded1_x265.mp4
ubuntu@test:~$ time ffmpeg -i base.mp4 -c:v libx265 -tag:v hvc1 -y encoded1_x265.mp4
ffmpeg version N-104716-g96caa01f13 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04)
configuration: --prefix=/home/ubuntu/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/ubuntu/ffmpeg_build/include --extra-ldflags=-L/home/ubuntu/ffmpeg_build/lib --enable-cuda-nvcc --nvccflags='-gencode arch=compute_52,code=sm_52 -O2' --enable-cuvid --enable-nvenc --enable-libnpp --extra-cflags=-I/usr/local/cuda-11.5/include --extra-ldflags=-L/usr/local/cuda-11.5/lib64 --extra-libs='-lpthread -lm' --ld=g++ --bindir=/home/ubuntu/bin --enable-gpl --enable-gnutls --enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libvmaf --enable-vaapi --enable-libmfx --enable-nonfree
libavutil 57. 9.101 / 57. 9.101
libavcodec 59. 14.100 / 59. 14.100
libavformat 59. 9.102 / 59. 9.102
libavdevice 59. 0.101 / 59. 0.101
libavfilter 8. 17.100 / 8. 17.100
libswscale 6. 1.101 / 6. 1.101
libswresample 4. 0.100 / 4. 0.100
libpostproc 56. 0.100 / 56. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'base.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
encoder : Lavf59.9.102
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
genre : Animation
Duration: 00:03:00.07, start: 0.000000, bitrate: 2611 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2608 kb/s, 30 fps, 30 tbr, 30k tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> hevc (libx265))
Press [q] to stop, [?] for help
x265 [info]: HEVC encoder version 3.2.1+1-b5c86a64bbbe
x265 [info]: build info [Linux][GCC 9.3.0][64 bit] 8bit+10bit+12bit
x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2
x265 [info]: Main profile, Level-4 (Main tier)
x265 [info]: Thread pool created using 2 threads
x265 [info]: Slices : 1
x265 [info]: frame threads / pool features : 1 / wpp(17 rows)
x265 [info]: Coding QT: max CU size, min CU size : 64 / 8
x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intra
x265 [info]: ME / range / subpel / merge : hex / 57 / 2 / 3
x265 [info]: Keyframe min / max / scenecut / bias: 25 / 250 / 40 / 5.00
x265 [info]: Lookahead / bframes / badapt : 20 / 4 / 2
x265 [info]: b-pyramid / weightp / weightb : 1 / 1 / 0
x265 [info]: References / ref-limit cu / depth : 3 / off / on
x265 [info]: AQ: mode / str / qg-size / cu-tree : 2 / 1.0 / 32 / 1
x265 [info]: Rate Control / qCompress : CRF-28.0 / 0.60
x265 [info]: tools: rd=3 psy-rd=2.00 early-skip rskip signhide tmvp b-intra
x265 [info]: tools: strong-intra-smoothing lslices=6 deblock sao
Output #0, mp4, to 'encoded1_x265.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
genre : Animation
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
encoder : Lavf59.9.102
Stream #0:0(und): Video: hevc (hvc1 / 0x31637668), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 30 fps, 15360 tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
encoder : Lavc59.14.100 libx265
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
frame= 5402 fps= 11 q=36.0 Lsize= 24645kB time=00:02:59.96 bitrate=1121.8kbits/s speed=0.355x
video:24576kB audio:0kB subtitle:0kB other streams:0kB global headers:2kB muxing overhead: 0.282367%
x265 [info]: frame I: 44, Avg QP:23.79 kb/s: 32273.90
x265 [info]: frame P: 1446, Avg QP:29.02 kb/s: 2387.69
x265 [info]: frame B: 3912, Avg QP:35.24 kb/s: 297.00
x265 [info]: Weighted P-Frames: Y:0.1% UV:0.1%
x265 [info]: consecutive B-frames: 12.1% 5.0% 13.6% 46.9% 22.4%
encoded 5402 frames in 506.12s (10.67 fps), 1117.09 kb/s, Avg QP:33.48
real 8m27.114s
user 16m25.939s
sys 0m0.793s
ubuntu@test:~$
エンコード時間は8分27秒 平均ビットレートは1117.09 kb/s QPの平均は33.48とのこと。
ファイル容量としては24645kBになりました。
VMAF
今度は、動画品質を比較します。3分そのまま比較するには時間がかかるので、冒頭30秒程度で比較します。
ffmpeg -i encoded1_x265.mp4 -i base.mp4 -lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[aa]; \
[1:v]settb=AVTB,setpts=PTS-STARTPTS[bb]; \
[aa][bb]libvmaf=log_fmt=xml:log_path=/dev/stdout: \
model_path=/usr/local/share/model/vmaf_v0.6.1.json: \
n_threads=16:shortest=1:repeatlast=0" -an -f null -t 30 -
VMAF score: 90.875059
平均スコアは90.875059点です
IntelQSV
エンコード
time ffmpeg -hwaccel qsv -hwaccel_output_format qsv -c:v h264_qsv -i base.mp4 -c:v hevc_qsv -tag:v hvc1 -y encoded1_qsv.mp4
ubuntu@test:~$ time ffmpeg -hwaccel qsv -hwaccel_output_format qsv -c:v h264_qsv -i base.mp4 -c:v hevc_qsv -tag:v hvc1 -y encoded1_qsv.mp4
ffmpeg version N-104716-g96caa01f13 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04)
configuration: --prefix=/home/ubuntu/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/ubuntu/ffmpeg_build/include --extra-ldflags=-L/home/ubuntu/ffmpeg_build/lib --enable-cuda-nvcc --nvccflags='-gencode arch=compute_52,code=sm_52 -O2' --enable-cuvid --enable-nvenc --enable-libnpp --extra-cflags=-I/usr/local/cuda-11.5/include --extra-ldflags=-L/usr/local/cuda-11.5/lib64 --extra-libs='-lpthread -lm' --ld=g++ --bindir=/home/ubuntu/bin --enable-gpl --enable-gnutls --enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libvmaf --enable-vaapi --enable-libmfx --enable-nonfree
libavutil 57. 9.101 / 57. 9.101
libavcodec 59. 14.100 / 59. 14.100
libavformat 59. 9.102 / 59. 9.102
libavdevice 59. 0.101 / 59. 0.101
libavfilter 8. 17.100 / 8. 17.100
libswscale 6. 1.101 / 6. 1.101
libswresample 4. 0.100 / 4. 0.100
libpostproc 56. 0.100 / 56. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'base.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
encoder : Lavf59.9.102
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
genre : Animation
Duration: 00:03:00.07, start: 0.000000, bitrate: 2611 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2608 kb/s, 30 fps, 30 tbr, 30k tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (h264 (h264_qsv) -> hevc (hevc_qsv))
Press [q] to stop, [?] for help
Output #0, mp4, to 'encoded1_qsv.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
genre : Animation
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
encoder : Lavf59.9.102
Stream #0:0(und): Video: hevc (hvc1 / 0x31637668), qsv(tv, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 1000 kb/s, 30 fps, 15360 tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
encoder : Lavc59.14.100 hevc_qsv
Side data:
cpb: bitrate max/min/avg: 0/0/1000000 buffer size: 0 vbv_delay: N/A
[h264_qsv @ 0x55b379e9e980] A decode call did not consume any data: expect more data at input (-10)
Last message repeated 2 times
frame= 5403 fps= 68 q=-0.0 Lsize= 18767kB time=00:02:59.93 bitrate= 854.4kbits/s speed=2.25x
video:18696kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.375563%
real 1m20.087s
user 0m11.801s
sys 0m4.269s
ubuntu@test:~$
VMAF
ffmpeg -i encoded1_qsv.mp4 -i base.mp4 -lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[aa]; \
[1:v]settb=AVTB,setpts=PTS-STARTPTS[bb]; \
[aa][bb]libvmaf=log_fmt=xml:log_path=/dev/stdout: \
model_path=/usr/local/share/model/vmaf_v0.6.1.json: \
n_threads=16:shortest=1:repeatlast=0" -an -f null -t 30 -
VMAF score: 61.542799
NVENC
エンコード
time ffmpeg -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -i base.mp4 -c:v hevc_nvenc -tag:v hvc1 -y encoded1_nvenc.mp4
ubuntu@test:~$ time ffmpeg -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -i base.mp4 -c:v hevc_nvenc -tag:v hvc1 -y encoded1_nvenc.mp4
ffmpeg version N-104716-g96caa01f13 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04)
configuration: --prefix=/home/ubuntu/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/ubuntu/ffmpeg_build/include --extra-ldflags=-L/home/ubuntu/ffmpeg_build/lib --enable-cuda-nvcc --nvccflags='-gencode arch=compute_52,code=sm_52 -O2' --enable-cuvid --enable-nvenc --enable-libnpp --extra-cflags=-I/usr/local/cuda-11.5/include --extra-ldflags=-L/usr/local/cuda-11.5/lib64 --extra-libs='-lpthread -lm' --ld=g++ --bindir=/home/ubuntu/bin --enable-gpl --enable-gnutls --enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libvmaf --enable-vaapi --enable-libmfx --enable-nonfree
libavutil 57. 9.101 / 57. 9.101
libavcodec 59. 14.100 / 59. 14.100
libavformat 59. 9.102 / 59. 9.102
libavdevice 59. 0.101 / 59. 0.101
libavfilter 8. 17.100 / 8. 17.100
libswscale 6. 1.101 / 6. 1.101
libswresample 4. 0.100 / 4. 0.100
libpostproc 56. 0.100 / 56. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'base.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
encoder : Lavf59.9.102
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
genre : Animation
Duration: 00:03:00.07, start: 0.000000, bitrate: 2611 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2608 kb/s, 30 fps, 30 tbr, 30k tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (h264 (h264_cuvid) -> hevc (hevc_nvenc))
Press [q] to stop, [?] for help
Output #0, mp4, to 'encoded1_nvenc.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
genre : Animation
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
encoder : Lavf59.9.102
Stream #0:0(und): Video: hevc (Main) (hvc1 / 0x31637668), cuda(tv, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 2000 kb/s, 30 fps, 15360 tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
encoder : Lavc59.14.100 hevc_nvenc
Side data:
cpb: bitrate max/min/avg: 0/0/2000000 buffer size: 4000000 vbv_delay: N/A
frame= 5404 fps=448 q=24.0 Lsize= 46456kB time=00:03:00.10 bitrate=2113.1kbits/s dup=0 drop=196 speed=14.9x
video:46433kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.049782%
real 0m12.366s
user 0m2.908s
sys 0m0.777s
ubuntu@test:~$
VMAF
ffmpeg -i encoded1_nvenc.mp4 -i base.mp4 -lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[aa]; \
[1:v]settb=AVTB,setpts=PTS-STARTPTS[bb]; \
[aa][bb]libvmaf=log_fmt=xml:log_path=/dev/stdout: \
model_path=/usr/local/share/model/vmaf_v0.6.1.json: \
n_threads=16:shortest=1:repeatlast=0" -an -f null -t 30 -
VMAF score: 57.907177
デフォルト設定でのまとめ
元ファイル | X265 | IntelQSV | NVEnc | |
---|---|---|---|---|
容量 | 57406kB | 24645kB | 18767kB | 46456kB |
エンコード時間 | - | 8m27.114s | 1m20.087s | 0m12.366s |
品質 | 100 | 90.875059 | 61.542799 | 57.907177 |
デフォルト設定では、どれも元ファイルからは小さくなりましたが、IntelQSVは品質の劣化が激しすぎました。
NVEncは高速ですが、容量も減らず、画質も低いという結果に。
パラメータ設定を色々いじらなければならないという点と、ソフトウェアエンコードのチューニングの高さを感じました。
2.ビットレート1500kbpsでの比較
今度はビットレートを全部同じにして測ります。
X265
エンコード
time ffmpeg -i base.mp4 -c:v libx265 -vb 1500k -tag:v hvc1 -y encoded2_x265.mp4
ubuntu@test:~$ time ffmpeg -i base.mp4 -c:v libx265 -vb 1500k -tag:v hvc1 -y encoded2_x265.mp4
ffmpeg version N-104716-g96caa01f13 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04)
configuration: --prefix=/home/ubuntu/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/ubuntu/ffmpeg_build/include --extra-ldflags=-L/home/ubuntu/ffmpeg_build/lib --enable-cuda-nvcc --nvccflags='-gencode arch=compute_52,code=sm_52 -O2' --enable-cuvid --enable-nvenc --enable-libnpp --extra-cflags=-I/usr/local/cuda-11.5/include --extra-ldflags=-L/usr/local/cuda-11.5/lib64 --extra-libs='-lpthread -lm' --ld=g++ --bindir=/home/ubuntu/bin --enable-gpl --enable-gnutls --enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libvmaf --enable-vaapi --enable-libmfx --enable-nonfree
libavutil 57. 9.101 / 57. 9.101
libavcodec 59. 14.100 / 59. 14.100
libavformat 59. 9.102 / 59. 9.102
libavdevice 59. 0.101 / 59. 0.101
libavfilter 8. 17.100 / 8. 17.100
libswscale 6. 1.101 / 6. 1.101
libswresample 4. 0.100 / 4. 0.100
libpostproc 56. 0.100 / 56. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'base.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
encoder : Lavf59.9.102
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
genre : Animation
Duration: 00:03:00.07, start: 0.000000, bitrate: 2611 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2608 kb/s, 30 fps, 30 tbr, 30k tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> hevc (libx265))
Press [q] to stop, [?] for help
x265 [info]: HEVC encoder version 3.2.1+1-b5c86a64bbbe
x265 [info]: build info [Linux][GCC 9.3.0][64 bit] 8bit+10bit+12bit
x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2
x265 [info]: Main profile, Level-4 (Main tier)
x265 [info]: Thread pool created using 2 threads
x265 [info]: Slices : 1
x265 [info]: frame threads / pool features : 1 / wpp(17 rows)
x265 [info]: Coding QT: max CU size, min CU size : 64 / 8
x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intra
x265 [info]: ME / range / subpel / merge : hex / 57 / 2 / 3
x265 [info]: Keyframe min / max / scenecut / bias: 25 / 250 / 40 / 5.00
x265 [info]: Lookahead / bframes / badapt : 20 / 4 / 2
x265 [info]: b-pyramid / weightp / weightb : 1 / 1 / 0
x265 [info]: References / ref-limit cu / depth : 3 / off / on
x265 [info]: AQ: mode / str / qg-size / cu-tree : 2 / 1.0 / 32 / 1
x265 [info]: Rate Control / qCompress : ABR-1500 kbps / 0.60
x265 [info]: tools: rd=3 psy-rd=2.00 early-skip rskip signhide tmvp b-intra
x265 [info]: tools: strong-intra-smoothing lslices=6 deblock sao
Output #0, mp4, to 'encoded2_x265.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
genre : Animation
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
encoder : Lavf59.9.102
Stream #0:0(und): Video: hevc (hvc1 / 0x31637668), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 1500 kb/s, 30 fps, 15360 tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
encoder : Lavc59.14.100 libx265
Side data:
cpb: bitrate max/min/avg: 0/0/1500000 buffer size: 0 vbv_delay: N/A
frame= 5402 fps=9.9 q=34.0 Lsize= 33230kB time=00:02:59.96 bitrate=1512.6kbits/s speed=0.331x
video:33161kB audio:0kB subtitle:0kB other streams:0kB global headers:2kB muxing overhead: 0.209701%
x265 [info]: frame I: 44, Avg QP:21.05 kb/s: 42710.20
x265 [info]: frame P: 1446, Avg QP:25.93 kb/s: 3180.38
x265 [info]: frame B: 3912, Avg QP:32.67 kb/s: 425.94
x265 [info]: Weighted P-Frames: Y:0.1% UV:0.1%
x265 [info]: consecutive B-frames: 12.1% 5.0% 13.6% 46.9% 22.4%
encoded 5402 frames in 542.08s (9.97 fps), 1507.66 kb/s, Avg QP:30.77
real 9m3.057s
user 17m34.614s
sys 0m0.845s
ubuntu@test:~$
VMAF
ffmpeg -i encoded2_x265.mp4 -i base.mp4 -lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[aa]; \
[1:v]settb=AVTB,setpts=PTS-STARTPTS[bb]; \
[aa][bb]libvmaf=log_fmt=xml:log_path=/dev/stdout: \
model_path=/usr/local/share/model/vmaf_v0.6.1.json: \
n_threads=16:shortest=1:repeatlast=0" -an -f null -t 30 -
VMAF score: 89.445395
IntelQSV
エンコード
time ffmpeg -hwaccel qsv -hwaccel_output_format qsv -c:v h264_qsv -i base.mp4 -c:v hevc_qsv -vb 1500k -tag:v hvc1 -y encoded2_qsv.mp4
ubuntu@test:~$ time ffmpeg -hwaccel qsv -hwaccel_output_format qsv -c:v h264_qsv -i base.mp4 -c:v hevc_qsv -vb 1500k -tag:v hvc1 -y encoded2_qsv.mp4
ffmpeg version N-104716-g96caa01f13 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04)
configuration: --prefix=/home/ubuntu/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/ubuntu/ffmpeg_build/include --extra-ldflags=-L/home/ubuntu/ffmpeg_build/lib --enable-cuda-nvcc --nvccflags='-gencode arch=compute_52,code=sm_52 -O2' --enable-cuvid --enable-nvenc --enable-libnpp --extra-cflags=-I/usr/local/cuda-11.5/include --extra-ldflags=-L/usr/local/cuda-11.5/lib64 --extra-libs='-lpthread -lm' --ld=g++ --bindir=/home/ubuntu/bin --enable-gpl --enable-gnutls --enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libvmaf --enable-vaapi --enable-libmfx --enable-nonfree
libavutil 57. 9.101 / 57. 9.101
libavcodec 59. 14.100 / 59. 14.100
libavformat 59. 9.102 / 59. 9.102
libavdevice 59. 0.101 / 59. 0.101
libavfilter 8. 17.100 / 8. 17.100
libswscale 6. 1.101 / 6. 1.101
libswresample 4. 0.100 / 4. 0.100
libpostproc 56. 0.100 / 56. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'base.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
encoder : Lavf59.9.102
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
genre : Animation
Duration: 00:03:00.07, start: 0.000000, bitrate: 2611 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2608 kb/s, 30 fps, 30 tbr, 30k tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (h264 (h264_qsv) -> hevc (hevc_qsv))
Press [q] to stop, [?] for help
Output #0, mp4, to 'encoded2_qsv.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
genre : Animation
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
encoder : Lavf59.9.102
Stream #0:0(und): Video: hevc (hvc1 / 0x31637668), qsv(tv, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 1500 kb/s, 30 fps, 15360 tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
encoder : Lavc59.14.100 hevc_qsv
Side data:
cpb: bitrate max/min/avg: 0/0/1500000 buffer size: 0 vbv_delay: N/A
[h264_qsv @ 0x5648a970d9c0] A decode call did not consume any data: expect more data at input (-10)
Last message repeated 2 times
frame= 5403 fps= 67 q=-0.0 Lsize= 29281kB time=00:02:59.93 bitrate=1333.1kbits/s speed=2.23x
video:29210kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.240921%
real 1m20.839s
user 0m11.740s
sys 0m4.166s
VMAF
ffmpeg -i encoded2_qsv.mp4 -i base.mp4 -lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[aa]; \
[1:v]settb=AVTB,setpts=PTS-STARTPTS[bb]; \
[aa][bb]libvmaf=log_fmt=xml:log_path=/dev/stdout: \
model_path=/usr/local/share/model/vmaf_v0.6.1.json: \
n_threads=16:shortest=1:repeatlast=0" -an -f null -t 30 -
VMAF score: 69.507522
NVENC
エンコード
time ffmpeg -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -i base.mp4 -c:v hevc_nvenc -vb 1500k -tag:v hvc1 -y encoded2_nvenc.mp4
ubuntu@test:~$ time ffmpeg -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -i base.mp4 -c:v hevc_nvenc -vb 1500k -tag:v hvc1 -y encoded2_nvenc.mp4
ffmpeg version N-104716-g96caa01f13 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04)
configuration: --prefix=/home/ubuntu/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/ubuntu/ffmpeg_build/include --extra-ldflags=-L/home/ubuntu/ffmpeg_build/lib --enable-cuda-nvcc --nvccflags='-gencode arch=compute_52,code=sm_52 -O2' --enable-cuvid --enable-nvenc --enable-libnpp --extra-cflags=-I/usr/local/cuda-11.5/include --extra-ldflags=-L/usr/local/cuda-11.5/lib64 --extra-libs='-lpthread -lm' --ld=g++ --bindir=/home/ubuntu/bin --enable-gpl --enable-gnutls --enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libvmaf --enable-vaapi --enable-libmfx --enable-nonfree
libavutil 57. 9.101 / 57. 9.101
libavcodec 59. 14.100 / 59. 14.100
libavformat 59. 9.102 / 59. 9.102
libavdevice 59. 0.101 / 59. 0.101
libavfilter 8. 17.100 / 8. 17.100
libswscale 6. 1.101 / 6. 1.101
libswresample 4. 0.100 / 4. 0.100
libpostproc 56. 0.100 / 56. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'base.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
encoder : Lavf59.9.102
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
genre : Animation
Duration: 00:03:00.07, start: 0.000000, bitrate: 2611 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2608 kb/s, 30 fps, 30 tbr, 30k tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (h264 (h264_cuvid) -> hevc (hevc_nvenc))
Press [q] to stop, [?] for help
Output #0, mp4, to 'encoded2_nvenc.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
genre : Animation
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
encoder : Lavf59.9.102
Stream #0:0(und): Video: hevc (Main) (hvc1 / 0x31637668), cuda(tv, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 1500 kb/s, 30 fps, 15360 tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
encoder : Lavc59.14.100 hevc_nvenc
Side data:
cpb: bitrate max/min/avg: 0/0/1500000 buffer size: 3000000 vbv_delay: N/A
frame= 5404 fps=447 q=26.0 Lsize= 35671kB time=00:03:00.10 bitrate=1622.5kbits/s dup=0 drop=196 speed=14.9x
video:35648kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.064404%
real 0m12.364s
user 0m3.036s
sys 0m0.625s
VMAF
ffmpeg -i encoded2_nvenc.mp4 -i base.mp4 -lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[aa]; \
[1:v]settb=AVTB,setpts=PTS-STARTPTS[bb]; \
[aa][bb]libvmaf=log_fmt=xml:log_path=/dev/stdout: \
model_path=/usr/local/share/model/vmaf_v0.6.1.json: \
n_threads=16:shortest=1:repeatlast=0" -an -f null -t 30 -
VMAF score: 56.520844
ビットレート1500kbpsでのまとめ
元ファイル | X265 | IntelQSV | NVEnc | |
---|---|---|---|---|
容量 | 57406kB | 33230kB | 29281kB | 35671kB |
エンコード時間 | - | 9m3.057s | 1m20.839s | 0m12.364s |
品質 | 100 | 89.445395 | 69.507522 | 56.520844 |
QSVは容量としては一番小さいですが、画質がいまひとつな感じ、NVEncは画質の割に容量が大きいと、速さだけが取り柄な感じに
3.ビットレート1000kbpsでの比較
X265
エンコード
time ffmpeg -i base.mp4 -c:v libx265 -vb 1000k -tag:v hvc1 -y encoded3_x265.mp4
ubuntu@test:~$ time ffmpeg -i base.mp4 -c:v libx265 -vb 1000k -tag:v hvc1 -y encoded3_x265.mp4
ffmpeg version N-104716-g96caa01f13 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04)
configuration: --prefix=/home/ubuntu/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/ubuntu/ffmpeg_build/include --extra-ldflags=-L/home/ubuntu/ffmpeg_build/lib --enable-cuda-nvcc --nvccflags='-gencode arch=compute_52,code=sm_52 -O2' --enable-cuvid --enable-nvenc --enable-libnpp --extra-cflags=-I/usr/local/cuda-11.5/include --extra-ldflags=-L/usr/local/cuda-11.5/lib64 --extra-libs='-lpthread -lm' --ld=g++ --bindir=/home/ubuntu/bin --enable-gpl --enable-gnutls --enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libvmaf --enable-vaapi --enable-libmfx --enable-nonfree
libavutil 57. 9.101 / 57. 9.101
libavcodec 59. 14.100 / 59. 14.100
libavformat 59. 9.102 / 59. 9.102
libavdevice 59. 0.101 / 59. 0.101
libavfilter 8. 17.100 / 8. 17.100
libswscale 6. 1.101 / 6. 1.101
libswresample 4. 0.100 / 4. 0.100
libpostproc 56. 0.100 / 56. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'base.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
encoder : Lavf59.9.102
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
genre : Animation
Duration: 00:03:00.07, start: 0.000000, bitrate: 2611 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2608 kb/s, 30 fps, 30 tbr, 30k tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> hevc (libx265))
Press [q] to stop, [?] for help
x265 [info]: HEVC encoder version 3.2.1+1-b5c86a64bbbe
x265 [info]: build info [Linux][GCC 9.3.0][64 bit] 8bit+10bit+12bit
x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2
x265 [info]: Main profile, Level-4 (Main tier)
x265 [info]: Thread pool created using 2 threads
x265 [info]: Slices : 1
x265 [info]: frame threads / pool features : 1 / wpp(17 rows)
x265 [info]: Coding QT: max CU size, min CU size : 64 / 8
x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intra
x265 [info]: ME / range / subpel / merge : hex / 57 / 2 / 3
x265 [info]: Keyframe min / max / scenecut / bias: 25 / 250 / 40 / 5.00
x265 [info]: Lookahead / bframes / badapt : 20 / 4 / 2
x265 [info]: b-pyramid / weightp / weightb : 1 / 1 / 0
x265 [info]: References / ref-limit cu / depth : 3 / off / on
x265 [info]: AQ: mode / str / qg-size / cu-tree : 2 / 1.0 / 32 / 1
x265 [info]: Rate Control / qCompress : ABR-1000 kbps / 0.60
x265 [info]: tools: rd=3 psy-rd=2.00 early-skip rskip signhide tmvp b-intra
x265 [info]: tools: strong-intra-smoothing lslices=6 deblock sao
Output #0, mp4, to 'encoded3_x265.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
genre : Animation
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
encoder : Lavf59.9.102
Stream #0:0(und): Video: hevc (hvc1 / 0x31637668), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 1000 kb/s, 30 fps, 15360 tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
encoder : Lavc59.14.100 libx265
Side data:
cpb: bitrate max/min/avg: 0/0/1000000 buffer size: 0 vbv_delay: N/A
frame= 5402 fps= 11 q=37.0 Lsize= 22257kB time=00:02:59.96 bitrate=1013.1kbits/s speed=0.362x
video:22187kB audio:0kB subtitle:0kB other streams:0kB global headers:2kB muxing overhead: 0.312640%
x265 [info]: frame I: 44, Avg QP:24.26 kb/s: 30861.06
x265 [info]: frame P: 1446, Avg QP:29.50 kb/s: 2045.53
x265 [info]: frame B: 3912, Avg QP:36.03 kb/s: 289.32
x265 [info]: Weighted P-Frames: Y:0.1% UV:0.1%
x265 [info]: consecutive B-frames: 12.1% 5.0% 13.6% 46.9% 22.4%
encoded 5402 frames in 496.52s (10.88 fps), 1008.43 kb/s, Avg QP:34.18
real 8m17.488s
user 16m7.761s
sys 0m0.773s
ubuntu@test:~$
VMAF
ffmpeg -i encoded3_x265.mp4 -i base.mp4 -lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[aa]; \
[1:v]settb=AVTB,setpts=PTS-STARTPTS[bb]; \
[aa][bb]libvmaf=log_fmt=xml:log_path=/dev/stdout: \
model_path=/usr/local/share/model/vmaf_v0.6.1.json: \
n_threads=16:shortest=1:repeatlast=0" -an -f null -t 30 -
VMAF score: 84.688443
IntelQSV
エンコード
time ffmpeg -hwaccel qsv -hwaccel_output_format qsv -c:v h264_qsv -i base.mp4 -c:v hevc_qsv -vb 1000k -tag:v hvc1 -y encoded3_qsv.mp4
ubuntu@test:~$ time ffmpeg -hwaccel qsv -hwaccel_output_format qsv -c:v h264_qsv -i base.mp4 -c:v hevc_qsv -vb 1000k -tag:v hvc1 -y encoded3_qsv.mp4
ffmpeg version N-104716-g96caa01f13 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04)
configuration: --prefix=/home/ubuntu/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/ubuntu/ffmpeg_build/include --extra-ldflags=-L/home/ubuntu/ffmpeg_build/lib --enable-cuda-nvcc --nvccflags='-gencode arch=compute_52,code=sm_52 -O2' --enable-cuvid --enable-nvenc --enable-libnpp --extra-cflags=-I/usr/local/cuda-11.5/include --extra-ldflags=-L/usr/local/cuda-11.5/lib64 --extra-libs='-lpthread -lm' --ld=g++ --bindir=/home/ubuntu/bin --enable-gpl --enable-gnutls --enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libvmaf --enable-vaapi --enable-libmfx --enable-nonfree
libavutil 57. 9.101 / 57. 9.101
libavcodec 59. 14.100 / 59. 14.100
libavformat 59. 9.102 / 59. 9.102
libavdevice 59. 0.101 / 59. 0.101
libavfilter 8. 17.100 / 8. 17.100
libswscale 6. 1.101 / 6. 1.101
libswresample 4. 0.100 / 4. 0.100
libpostproc 56. 0.100 / 56. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'base.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
encoder : Lavf59.9.102
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
genre : Animation
Duration: 00:03:00.07, start: 0.000000, bitrate: 2611 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2608 kb/s, 30 fps, 30 tbr, 30k tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (h264 (h264_qsv) -> hevc (hevc_qsv))
Press [q] to stop, [?] for help
Output #0, mp4, to 'encoded3_qsv.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
genre : Animation
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
encoder : Lavf59.9.102
Stream #0:0(und): Video: hevc (hvc1 / 0x31637668), qsv(tv, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 1000 kb/s, 30 fps, 15360 tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
encoder : Lavc59.14.100 hevc_qsv
Side data:
cpb: bitrate max/min/avg: 0/0/1000000 buffer size: 0 vbv_delay: N/A
[h264_qsv @ 0x564179dc39c0] A decode call did not consume any data: expect more data at input (-10)
Last message repeated 2 times
frame= 5403 fps= 68 q=-0.0 Lsize= 18767kB time=00:02:59.93 bitrate= 854.4kbits/s speed=2.26x
video:18696kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.375563%
real 1m19.657s
user 0m11.701s
sys 0m4.231s
ubuntu@test:~$
VMAF
ffmpeg -i encoded3_qsv.mp4 -i base.mp4 -lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[aa]; \
[1:v]settb=AVTB,setpts=PTS-STARTPTS[bb]; \
[aa][bb]libvmaf=log_fmt=xml:log_path=/dev/stdout: \
model_path=/usr/local/share/model/vmaf_v0.6.1.json: \
n_threads=16:shortest=1:repeatlast=0" -an -f null -t 30 -
VMAF score: 61.542799
NVENC
エンコード
time ffmpeg -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -i base.mp4 -c:v hevc_nvenc -vb 1000k -tag:v hvc1 -y encoded3_nvenc.mp4
ubuntu@test:~$ time ffmpeg -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -i base.mp4 -c:v hevc_nvenc -vb 1000k -tag:v hvc1 -y encoded3_nvenc.mp4
ffmpeg version N-104716-g96caa01f13 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04)
configuration: --prefix=/home/ubuntu/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/ubuntu/ffmpeg_build/include --extra-ldflags=-L/home/ubuntu/ffmpeg_build/lib --enable-cuda-nvcc --nvccflags='-gencode arch=compute_52,code=sm_52 -O2' --enable-cuvid --enable-nvenc --enable-libnpp --extra-cflags=-I/usr/local/cuda-11.5/include --extra-ldflags=-L/usr/local/cuda-11.5/lib64 --extra-libs='-lpthread -lm' --ld=g++ --bindir=/home/ubuntu/bin --enable-gpl --enable-gnutls --enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libvmaf --enable-vaapi --enable-libmfx --enable-nonfree
libavutil 57. 9.101 / 57. 9.101
libavcodec 59. 14.100 / 59. 14.100
libavformat 59. 9.102 / 59. 9.102
libavdevice 59. 0.101 / 59. 0.101
libavfilter 8. 17.100 / 8. 17.100
libswscale 6. 1.101 / 6. 1.101
libswresample 4. 0.100 / 4. 0.100
libpostproc 56. 0.100 / 56. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'base.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
encoder : Lavf59.9.102
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
genre : Animation
Duration: 00:03:00.07, start: 0.000000, bitrate: 2611 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2608 kb/s, 30 fps, 30 tbr, 30k tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (h264 (h264_cuvid) -> hevc (hevc_nvenc))
Press [q] to stop, [?] for help
Output #0, mp4, to 'encoded3_nvenc.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
genre : Animation
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
encoder : Lavf59.9.102
Stream #0:0(und): Video: hevc (Main) (hvc1 / 0x31637668), cuda(tv, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 1000 kb/s, 30 fps, 15360 tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
encoder : Lavc59.14.100 hevc_nvenc
Side data:
cpb: bitrate max/min/avg: 0/0/1000000 buffer size: 2000000 vbv_delay: N/A
frame= 5404 fps=445 q=29.0 Lsize= 24597kB time=00:03:00.10 bitrate=1118.8kbits/s dup=0 drop=196 speed=14.8x
video:24574kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.092730%
real 0m12.409s
user 0m2.938s
sys 0m0.640s
ubuntu@test:~$
VMAF
ffmpeg -i encoded3_nvenc.mp4 -i base.mp4 -lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[aa]; \
[1:v]settb=AVTB,setpts=PTS-STARTPTS[bb]; \
[aa][bb]libvmaf=log_fmt=xml:log_path=/dev/stdout: \
model_path=/usr/local/share/model/vmaf_v0.6.1.json: \
n_threads=16:shortest=1:repeatlast=0" -an -f null -t 30 -
VMAF score: 53.518960
ビットレート1000kbpsでのまとめ
元ファイル | X265 | IntelQSV | NVEnc | |
---|---|---|---|---|
容量 | 57406kB | 22257kB | 18767kB | 24597kB |
エンコード時間 | - | 8m17.488s | 1m19.657s | 0m12.409s |
品質 | 100 | 84.688443 | 61.542799 | 53.518960 |
ここでも容量が少なかったのはQSVですが、やはり、品質もそれなりという記録に。
NVEncは早いけど品質がという点はやはり変わらず。
4.qP20での比較
qPはH264やH265で行われてる離散コサイン変換の量子化におけるパラメータの一つで、数字が少なければ少ないほど画質が向上し0の場合量子化を行わないため可逆圧縮となる。
X265
エンコード
time ffmpeg -i base.mp4 -c:v libx265 -crf 20 -tag:v hvc1 -y encoded4_x265.mp4
ubuntu@test:~$ time ffmpeg -i base.mp4 -c:v libx265 -crf 20 -tag:v hvc1 -y encoded4_x265.mp4
ffmpeg version N-104716-g96caa01f13 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04)
configuration: --prefix=/home/ubuntu/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/ubuntu/ffmpeg_build/include --extra-ldflags=-L/home/ubuntu/ffmpeg_build/lib --enable-cuda-nvcc --nvccflags='-gencode arch=compute_52,code=sm_52 -O2' --enable-cuvid --enable-nvenc --enable-libnpp --extra-cflags=-I/usr/local/cuda-11.5/include --extra-ldflags=-L/usr/local/cuda-11.5/lib64 --extra-libs='-lpthread -lm' --ld=g++ --bindir=/home/ubuntu/bin --enable-gpl --enable-gnutls --enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libvmaf --enable-vaapi --enable-libmfx --enable-nonfree
libavutil 57. 9.101 / 57. 9.101
libavcodec 59. 14.100 / 59. 14.100
libavformat 59. 9.102 / 59. 9.102
libavdevice 59. 0.101 / 59. 0.101
libavfilter 8. 17.100 / 8. 17.100
libswscale 6. 1.101 / 6. 1.101
libswresample 4. 0.100 / 4. 0.100
libpostproc 56. 0.100 / 56. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'base.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
encoder : Lavf59.9.102
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
genre : Animation
Duration: 00:03:00.07, start: 0.000000, bitrate: 2611 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2608 kb/s, 30 fps, 30 tbr, 30k tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> hevc (libx265))
Press [q] to stop, [?] for help
x265 [info]: HEVC encoder version 3.2.1+1-b5c86a64bbbe
x265 [info]: build info [Linux][GCC 9.3.0][64 bit] 8bit+10bit+12bit
x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2
x265 [info]: Main profile, Level-4 (Main tier)
x265 [info]: Thread pool created using 2 threads
x265 [info]: Slices : 1
x265 [info]: frame threads / pool features : 1 / wpp(17 rows)
x265 [info]: Coding QT: max CU size, min CU size : 64 / 8
x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intra
x265 [info]: ME / range / subpel / merge : hex / 57 / 2 / 3
x265 [info]: Keyframe min / max / scenecut / bias: 25 / 250 / 40 / 5.00
x265 [info]: Lookahead / bframes / badapt : 20 / 4 / 2
x265 [info]: b-pyramid / weightp / weightb : 1 / 1 / 0
x265 [info]: References / ref-limit cu / depth : 3 / off / on
x265 [info]: AQ: mode / str / qg-size / cu-tree : 2 / 1.0 / 32 / 1
x265 [info]: Rate Control / qCompress : CRF-20.0 / 0.60
x265 [info]: tools: rd=3 psy-rd=2.00 early-skip rskip signhide tmvp b-intra
x265 [info]: tools: strong-intra-smoothing lslices=6 deblock sao
Output #0, mp4, to 'encoded4_x265.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
genre : Animation
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
encoder : Lavf59.9.102
Stream #0:0(und): Video: hevc (hvc1 / 0x31637668), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 30 fps, 15360 tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
encoder : Lavc59.14.100 libx265
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
frame= 5402 fps=8.5 q=28.0 Lsize= 67010kB time=00:02:59.96 bitrate=3050.3kbits/s speed=0.282x
video:66940kB audio:0kB subtitle:0kB other streams:0kB global headers:2kB muxing overhead: 0.104675%
x265 [info]: frame I: 44, Avg QP:15.80 kb/s: 68891.00
x265 [info]: frame P: 1446, Avg QP:20.51 kb/s: 7221.56
x265 [info]: frame B: 3912, Avg QP:27.02 kb/s: 759.82
x265 [info]: Weighted P-Frames: Y:0.1% UV:0.1%
x265 [info]: consecutive B-frames: 12.1% 5.0% 13.6% 46.9% 22.4%
encoded 5402 frames in 636.93s (8.48 fps), 3044.43 kb/s, Avg QP:25.19
real 10m37.926s
user 20m34.709s
sys 0m0.929s
ubuntu@test:~$
VMAF
ffmpeg -i encoded4_x265.mp4 -i base.mp4 -lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[aa]; \
[1:v]settb=AVTB,setpts=PTS-STARTPTS[bb]; \
[aa][bb]libvmaf=log_fmt=xml:log_path=/dev/stdout: \
model_path=/usr/local/share/model/vmaf_v0.6.1.json: \
n_threads=16:shortest=1:repeatlast=0" -an -f null -t 30 -
VMAF score: 96.116558
IntelQSV
エンコード
time ffmpeg -hwaccel qsv -hwaccel_output_format qsv -c:v h264_qsv -i base.mp4 -c:v hevc_qsv -q 20 -tag:v hvc1 -y encoded4_qsv.mp4
ubuntu@test:~$ time ffmpeg -hwaccel qsv -hwaccel_output_format qsv -c:v h264_qsv -i base.mp4 -c:v hevc_qsv -q 20 -tag:v hvc1 -y encoded4_qsv.mp4
ffmpeg version N-104716-g96caa01f13 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04)
configuration: --prefix=/home/ubuntu/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/ubuntu/ffmpeg_build/include --extra-ldflags=-L/home/ubuntu/ffmpeg_build/lib --enable-cuda-nvcc --nvccflags='-gencode arch=compute_52,code=sm_52 -O2' --enable-cuvid --enable-nvenc --enable-libnpp --extra-cflags=-I/usr/local/cuda-11.5/include --extra-ldflags=-L/usr/local/cuda-11.5/lib64 --extra-libs='-lpthread -lm' --ld=g++ --bindir=/home/ubuntu/bin --enable-gpl --enable-gnutls --enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libvmaf --enable-vaapi --enable-libmfx --enable-nonfree
libavutil 57. 9.101 / 57. 9.101
libavcodec 59. 14.100 / 59. 14.100
libavformat 59. 9.102 / 59. 9.102
libavdevice 59. 0.101 / 59. 0.101
libavfilter 8. 17.100 / 8. 17.100
libswscale 6. 1.101 / 6. 1.101
libswresample 4. 0.100 / 4. 0.100
libpostproc 56. 0.100 / 56. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'base.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
encoder : Lavf59.9.102
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
genre : Animation
Duration: 00:03:00.07, start: 0.000000, bitrate: 2611 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2608 kb/s, 30 fps, 30 tbr, 30k tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (h264 (h264_qsv) -> hevc (hevc_qsv))
Press [q] to stop, [?] for help
Output #0, mp4, to 'encoded4_qsv.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
genre : Animation
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
encoder : Lavf59.9.102
Stream #0:0(und): Video: hevc (hvc1 / 0x31637668), qsv(tv, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 1000 kb/s, 30 fps, 15360 tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
encoder : Lavc59.14.100 hevc_qsv
Side data:
cpb: bitrate max/min/avg: 0/0/1000000 buffer size: 0 vbv_delay: N/A
[h264_qsv @ 0x55c4959db240] A decode call did not consume any data: expect more data at input (-10)
Last message repeated 2 times
frame= 5403 fps= 71 q=-0.0 Lsize= 63605kB time=00:02:59.93 bitrate=2895.8kbits/s speed=2.35x
video:63540kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.103299%
real 1m16.614s
user 0m10.170s
sys 0m4.166s
ubuntu@test:~$
VMAF
ffmpeg -i encoded4_qsv.mp4 -i base.mp4 -lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[aa]; \
[1:v]settb=AVTB,setpts=PTS-STARTPTS[bb]; \
[aa][bb]libvmaf=log_fmt=xml:log_path=/dev/stdout: \
model_path=/usr/local/share/model/vmaf_v0.6.1.json: \
n_threads=16:shortest=1:repeatlast=0" -an -f null -t 30 -
VMAF score: 76.933815
NVENC
エンコード
time ffmpeg -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -i base.mp4 -c:v hevc_nvenc -cq 20 -tag:v hvc1 -y encoded4_nvenc.mp4
ubuntu@test:~$ time ffmpeg -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -i base.mp4 -c:v hevc_nvenc -cq 20 -tag:v hvc1 -y encoded4_nvenc.mp4
ffmpeg version N-104716-g96caa01f13 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04)
configuration: --prefix=/home/ubuntu/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/ubuntu/ffmpeg_build/include --extra-ldflags=-L/home/ubuntu/ffmpeg_build/lib --enable-cuda-nvcc --nvccflags='-gencode arch=compute_52,code=sm_52 -O2' --enable-cuvid --enable-nvenc --enable-libnpp --extra-cflags=-I/usr/local/cuda-11.5/include --extra-ldflags=-L/usr/local/cuda-11.5/lib64 --extra-libs='-lpthread -lm' --ld=g++ --bindir=/home/ubuntu/bin --enable-gpl --enable-gnutls --enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libvmaf --enable-vaapi --enable-libmfx --enable-nonfree
libavutil 57. 9.101 / 57. 9.101
libavcodec 59. 14.100 / 59. 14.100
libavformat 59. 9.102 / 59. 9.102
libavdevice 59. 0.101 / 59. 0.101
libavfilter 8. 17.100 / 8. 17.100
libswscale 6. 1.101 / 6. 1.101
libswresample 4. 0.100 / 4. 0.100
libpostproc 56. 0.100 / 56. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'base.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
encoder : Lavf59.9.102
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
genre : Animation
Duration: 00:03:00.07, start: 0.000000, bitrate: 2611 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2608 kb/s, 30 fps, 30 tbr, 30k tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (h264 (h264_cuvid) -> hevc (hevc_nvenc))
Press [q] to stop, [?] for help
Output #0, mp4, to 'encoded4_nvenc.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
genre : Animation
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
encoder : Lavf59.9.102
Stream #0:0(und): Video: hevc (Main) (hvc1 / 0x31637668), cuda(tv, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 30 fps, 15360 tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
encoder : Lavc59.14.100 hevc_nvenc
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 4000000 vbv_delay: N/A
frame= 5404 fps=421 q=12.0 Lsize= 181398kB time=00:03:00.10 bitrate=8251.0kbits/s dup=0 drop=196 speed= 14x
video:181373kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.013716%
real 0m13.124s
user 0m3.218s
sys 0m0.996s
ubuntu@test:~$
VMAF
ffmpeg -i encoded4_nvenc.mp4 -i base.mp4 -lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[aa]; \
[1:v]settb=AVTB,setpts=PTS-STARTPTS[bb]; \
[aa][bb]libvmaf=log_fmt=xml:log_path=/dev/stdout: \
model_path=/usr/local/share/model/vmaf_v0.6.1.json: \
n_threads=16:shortest=1:repeatlast=0" -an -f null -t 30 -
VMAF score: 61.453680
qP20でのでのまとめ
元ファイル | X265 | IntelQSV | NVEnc | |
---|---|---|---|---|
容量 | 57406kB | 67010kB | 63605kB | 181398kB |
エンコード時間 | - | 10m37.926s | 1m16.614s | 0m13.124s |
品質 | 100 | 96.116558 | 76.933815 | 61.453680 |
QP指定しての圧縮だと、QSVもなかなか良い値に持ってくる。
NVEncは使用してるカードがBフレーム圧縮非対応なので、それが原因なのか非常に大きいファイルが出来上がってしまった。
その割に品質が劣っているのでどうしようもない。
5.qP35での比較
X265
エンコード
time ffmpeg -i base.mp4 -c:v libx265 -crf 35 -tag:v hvc1 -y encoded5_x265.mp4
ubuntu@test:~$ time ffmpeg -i base.mp4 -c:v libx265 -crf 35 -tag:v hvc1 -y encoded5_x265.mp4
ffmpeg version N-104716-g96caa01f13 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04)
configuration: --prefix=/home/ubuntu/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/ubuntu/ffmpeg_build/include --extra-ldflags=-L/home/ubuntu/ffmpeg_build/lib --enable-cuda-nvcc --nvccflags='-gencode arch=compute_52,code=sm_52 -O2' --enable-cuvid --enable-nvenc --enable-libnpp --extra-cflags=-I/usr/local/cuda-11.5/include --extra-ldflags=-L/usr/local/cuda-11.5/lib64 --extra-libs='-lpthread -lm' --ld=g++ --bindir=/home/ubuntu/bin --enable-gpl --enable-gnutls --enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libvmaf --enable-vaapi --enable-libmfx --enable-nonfree
libavutil 57. 9.101 / 57. 9.101
libavcodec 59. 14.100 / 59. 14.100
libavformat 59. 9.102 / 59. 9.102
libavdevice 59. 0.101 / 59. 0.101
libavfilter 8. 17.100 / 8. 17.100
libswscale 6. 1.101 / 6. 1.101
libswresample 4. 0.100 / 4. 0.100
libpostproc 56. 0.100 / 56. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'base.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
encoder : Lavf59.9.102
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
genre : Animation
Duration: 00:03:00.07, start: 0.000000, bitrate: 2611 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2608 kb/s, 30 fps, 30 tbr, 30k tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> hevc (libx265))
Press [q] to stop, [?] for help
x265 [info]: HEVC encoder version 3.2.1+1-b5c86a64bbbe
x265 [info]: build info [Linux][GCC 9.3.0][64 bit] 8bit+10bit+12bit
x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2
x265 [info]: Main profile, Level-4 (Main tier)
x265 [info]: Thread pool created using 2 threads
x265 [info]: Slices : 1
x265 [info]: frame threads / pool features : 1 / wpp(17 rows)
x265 [info]: Coding QT: max CU size, min CU size : 64 / 8
x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intra
x265 [info]: ME / range / subpel / merge : hex / 57 / 2 / 3
x265 [info]: Keyframe min / max / scenecut / bias: 25 / 250 / 40 / 5.00
x265 [info]: Lookahead / bframes / badapt : 20 / 4 / 2
x265 [info]: b-pyramid / weightp / weightb : 1 / 1 / 0
x265 [info]: References / ref-limit cu / depth : 3 / off / on
x265 [info]: AQ: mode / str / qg-size / cu-tree : 2 / 1.0 / 32 / 1
x265 [info]: Rate Control / qCompress : CRF-35.0 / 0.60
x265 [info]: tools: rd=3 psy-rd=2.00 early-skip rskip signhide tmvp b-intra
x265 [info]: tools: strong-intra-smoothing lslices=6 deblock sao
Output #0, mp4, to 'encoded5_x265.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
genre : Animation
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
encoder : Lavf59.9.102
Stream #0:0(und): Video: hevc (hvc1 / 0x31637668), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 30 fps, 15360 tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
encoder : Lavc59.14.100 libx265
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
frame= 5402 fps= 13 q=43.0 Lsize= 10350kB time=00:02:59.96 bitrate= 471.1kbits/s speed=0.42x
video:10281kB audio:0kB subtitle:0kB other streams:0kB global headers:2kB muxing overhead: 0.672828%
x265 [info]: frame I: 44, Avg QP:30.80 kb/s: 14992.60
x265 [info]: frame P: 1446, Avg QP:36.75 kb/s: 907.22
x265 [info]: frame B: 3912, Avg QP:42.40 kb/s: 140.59
x265 [info]: Weighted P-Frames: Y:0.1% UV:0.1%
x265 [info]: consecutive B-frames: 12.1% 5.0% 13.6% 46.9% 22.4%
encoded 5402 frames in 427.98s (12.62 fps), 466.78 kb/s, Avg QP:40.79
real 7m8.962s
user 13m55.681s
sys 0m0.793s
ubuntu@test:~$
VMAF
ffmpeg -i encoded5_x265.mp4 -i base.mp4 -lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[aa]; \
[1:v]settb=AVTB,setpts=PTS-STARTPTS[bb]; \
[aa][bb]libvmaf=log_fmt=xml:log_path=/dev/stdout: \
model_path=/usr/local/share/model/vmaf_v0.6.1.json: \
n_threads=16:shortest=1:repeatlast=0" -an -f null -t 30 -
VMAF score: 78.392523
IntelQSV
エンコード
time ffmpeg -hwaccel qsv -hwaccel_output_format qsv -c:v h264_qsv -i base.mp4 -c:v hevc_qsv -q 35 -tag:v hvc1 -y encoded5_qsv.mp4
ubuntu@test:~$ time ffmpeg -hwaccel qsv -hwaccel_output_format qsv -c:v h264_qsv -i base.mp4 -c:v hevc_qsv -q 35 -tag:v hvc1 -y encoded5_qsv.mp4
ffmpeg version N-104716-g96caa01f13 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04)
configuration: --prefix=/home/ubuntu/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/ubuntu/ffmpeg_build/include --extra-ldflags=-L/home/ubuntu/ffmpeg_build/lib --enable-cuda-nvcc --nvccflags='-gencode arch=compute_52,code=sm_52 -O2' --enable-cuvid --enable-nvenc --enable-libnpp --extra-cflags=-I/usr/local/cuda-11.5/include --extra-ldflags=-L/usr/local/cuda-11.5/lib64 --extra-libs='-lpthread -lm' --ld=g++ --bindir=/home/ubuntu/bin --enable-gpl --enable-gnutls --enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libvmaf --enable-vaapi --enable-libmfx --enable-nonfree
libavutil 57. 9.101 / 57. 9.101
libavcodec 59. 14.100 / 59. 14.100
libavformat 59. 9.102 / 59. 9.102
libavdevice 59. 0.101 / 59. 0.101
libavfilter 8. 17.100 / 8. 17.100
libswscale 6. 1.101 / 6. 1.101
libswresample 4. 0.100 / 4. 0.100
libpostproc 56. 0.100 / 56. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'base.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
encoder : Lavf59.9.102
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
genre : Animation
Duration: 00:03:00.07, start: 0.000000, bitrate: 2611 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2608 kb/s, 30 fps, 30 tbr, 30k tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (h264 (h264_qsv) -> hevc (hevc_qsv))
Press [q] to stop, [?] for help
Output #0, mp4, to 'encoded5_qsv.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
genre : Animation
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
encoder : Lavf59.9.102
Stream #0:0(und): Video: hevc (hvc1 / 0x31637668), qsv(tv, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 1000 kb/s, 30 fps, 15360 tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
encoder : Lavc59.14.100 hevc_qsv
Side data:
cpb: bitrate max/min/avg: 0/0/1000000 buffer size: 0 vbv_delay: N/A
[h264_qsv @ 0x555e6b934240] A decode call did not consume any data: expect more data at input (-10)
Last message repeated 2 times
frame= 5403 fps= 74 q=-0.0 Lsize= 10471kB time=00:02:59.93 bitrate= 476.7kbits/s speed=2.47x
video:10407kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.622844%
real 1m12.999s
user 0m10.296s
sys 0m3.795s
ubuntu@test:~$
VMAF
ffmpeg -i encoded5_qsv.mp4 -i base.mp4 -lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[aa]; \
[1:v]settb=AVTB,setpts=PTS-STARTPTS[bb]; \
[aa][bb]libvmaf=log_fmt=xml:log_path=/dev/stdout: \
model_path=/usr/local/share/model/vmaf_v0.6.1.json: \
n_threads=16:shortest=1:repeatlast=0" -an -f null -t 30 -
VMAF score: 65.246589
NVENC
エンコード
time ffmpeg -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -i base.mp4 -c:v hevc_nvenc -cq 35 -tag:v hvc1 -y encoded5_nvenc.mp4
ubuntu@test:~$ time ffmpeg -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -i base.mp4 -c:v hevc_nvenc -cq 35 -tag:v hvc1 -y encoded5_nvenc.mp4
ffmpeg version N-104716-g96caa01f13 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04)
configuration: --prefix=/home/ubuntu/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/ubuntu/ffmpeg_build/include --extra-ldflags=-L/home/ubuntu/ffmpeg_build/lib --enable-cuda-nvcc --nvccflags='-gencode arch=compute_52,code=sm_52 -O2' --enable-cuvid --enable-nvenc --enable-libnpp --extra-cflags=-I/usr/local/cuda-11.5/include --extra-ldflags=-L/usr/local/cuda-11.5/lib64 --extra-libs='-lpthread -lm' --ld=g++ --bindir=/home/ubuntu/bin --enable-gpl --enable-gnutls --enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libvmaf --enable-vaapi --enable-libmfx --enable-nonfree
libavutil 57. 9.101 / 57. 9.101
libavcodec 59. 14.100 / 59. 14.100
libavformat 59. 9.102 / 59. 9.102
libavdevice 59. 0.101 / 59. 0.101
libavfilter 8. 17.100 / 8. 17.100
libswscale 6. 1.101 / 6. 1.101
libswresample 4. 0.100 / 4. 0.100
libpostproc 56. 0.100 / 56. 0.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'base.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
encoder : Lavf59.9.102
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
genre : Animation
Duration: 00:03:00.07, start: 0.000000, bitrate: 2611 kb/s
Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 2608 kb/s, 30 fps, 30 tbr, 30k tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (h264 (h264_cuvid) -> hevc (hevc_nvenc))
Press [q] to stop, [?] for help
Output #0, mp4, to 'encoded5_nvenc.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : Big Buck Bunny, Sunflower version
artist : Blender Foundation 2008, Janus Bager Kristensen 2013
composer : Sacha Goedegebure
genre : Animation
comment : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
encoder : Lavf59.9.102
Stream #0:0(und): Video: hevc (Main) (hvc1 / 0x31637668), cuda(tv, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 30 fps, 15360 tbn (default)
Metadata:
handler_name : GPAC ISO Video Handler
vendor_id : [0][0][0][0]
encoder : Lavc59.14.100 hevc_nvenc
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 4000000 vbv_delay: N/A
frame= 5404 fps=447 q=27.0 Lsize= 33893kB time=00:03:00.10 bitrate=1541.6kbits/s dup=0 drop=196 speed=14.9x
video:33870kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.067662%
real 0m12.360s
user 0m2.978s
sys 0m0.632s
ubuntu@test:~$
VMAF
ffmpeg -i encoded5_nvenc.mp4 -i base.mp4 -lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[aa]; \
[1:v]settb=AVTB,setpts=PTS-STARTPTS[bb]; \
[aa][bb]libvmaf=log_fmt=xml:log_path=/dev/stdout: \
model_path=/usr/local/share/model/vmaf_v0.6.1.json: \
n_threads=16:shortest=1:repeatlast=0" -an -f null -t 30 -
VMAF score: 57.821041
qP35でのでのまとめ
元ファイル | X265 | IntelQSV | NVEnc | |
---|---|---|---|---|
容量 | 57406kB | 10350kB | 10471kB | 33893kB |
エンコード時間 | - | 7m8.962s | 1m12.999s | 0m12.360s |
VMAF品質 | 100 | 78.392523 | 65.246589 | 57.821041 |
X265とQSVは容量がほぼ近いが、画質で比較すると
まとめ
改めてx265とQSV、NVEncを比較しましたが、単純にビットレートやqP指定でのエンコードの場合、HWエンコーダの特性を考えて最適な値にしないと、ただ早くて画質は悪いという状況になるため、パラメータの調整が必須というのがよくわかったのと、
VMAFにて客観的な比較ができるため、VMAFの値を参考にチューニングをする必要がある。
今回NVEncが散々な値になっているのは、一つにTU117がH265のBフレーム圧縮に対応していないため、容量が大きくなりやすいという傾向があると考えられる。
この辺は Tesla T4など Bフレーム圧縮対応の環境で追加比較を行いたい。
また、今回は圧縮時間の劇的な差を見るためにH265にした経緯があるが、H264のトランスコードという状況でも追加検証を行なってみたい。
今回はこの辺で時間切れのため、後日追加検証の上、記事をあげたいと思う。