私はこのコマンドを実行しています:
_ffmpeg -init_hw_device qsv=hw -filter_hw_device -f rawvideo -pix_fmt yuv420p -s:v 2560x1440 -i normal-desktop-use-1440p.mkv -c:v h264_qsv - b:v 5M output.mp4
_
次のエラーが発生します。
_Splitting the commandline.
Reading option '-loglevel' ... matched as option 'loglevel' (set logging level) with argument 'debug'.
Reading option '-init_hw_device' ... matched as option 'init_hw_device' (initialise hardware device) with argument 'qsv=hw'.
Reading option '-filter_hw_device' ... matched as option 'filter_hw_device' (set hardware device used when filtering) with argument 'hw'.
Reading option '-f' ... matched as option 'f' (force format) with argument 'rawvideo'.
Reading option '-pix_fmt' ... matched as option 'pix_fmt' (set pixel format) with argument 'yuv420p'.
Reading option '-s:v' ... matched as option 's' (set frame size (WxH or abbreviation)) with argument '2560x1440'.
Reading option '-i' ... matched as input url with argument 'normal-desktop-use-1440p.mkv'.
Reading option '-vf' ... matched as option 'vf' (set video filters) with argument '-c:v'.
Reading option 'h264_qsv' ... matched as output url.
Reading option '-b:v' ... matched as option 'b' (video bitrate (please use -b:v)) with argument '15M'.
Reading option '-framerate' ... matched as AVOption 'framerate' with argument '30'.
Reading option 'output.mp4' ... matched as output url.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option loglevel (set logging level) with argument debug.
Applying option init_hw_device (initialise hardware device) with argument qsv=hw.
[AVHWDeviceContext @ 0x556f744cf5c0] Cannot open X11 display .
[AVHWDeviceContext @ 0x556f744cf5c0] Opened VA display via DRM device /dev/dri/renderD128.
[AVHWDeviceContext @ 0x556f744cf5c0] libva: VA-API version 1.1.0
[AVHWDeviceContext @ 0x556f744cf5c0] libva: va_getDriverName() returns 0
[AVHWDeviceContext @ 0x556f744cf5c0] libva: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
[AVHWDeviceContext @ 0x556f744cf5c0] libva: Found init function __vaDriverInit_1_1
[AVHWDeviceContext @ 0x556f744cf5c0] libva: va_openDriver() returns 0
[AVHWDeviceContext @ 0x556f744cf5c0] Initialised VAAPI connection: version 1.1
[AVHWDeviceContext @ 0x556f744cf5c0] Format 0x32315659 -> yuv420p.
[AVHWDeviceContext @ 0x556f744cf5c0] Format 0x30323449 -> yuv420p.
[AVHWDeviceContext @ 0x556f744cf5c0] Format 0x3231564e -> nv12.
[AVHWDeviceContext @ 0x556f744cf5c0] Format 0x32595559 -> yuyv422.
[AVHWDeviceContext @ 0x556f744cf5c0] Format 0x59565955 -> uyvy422.
[AVHWDeviceContext @ 0x556f744cf5c0] Format 0x48323234 -> yuv422p.
[AVHWDeviceContext @ 0x556f744cf5c0] Format 0x58424752 -> rgb0.
[AVHWDeviceContext @ 0x556f744cf5c0] Format 0x58524742 -> bgr0.
[AVHWDeviceContext @ 0x556f744cf5c0] Format 0x30313050 -> p010le.
[AVHWDeviceContext @ 0x556f744cf5c0] VAAPI driver: Intel i965 driver for Intel(R) Skylake - 2.1.0.
[AVHWDeviceContext @ 0x556f744cf5c0] Driver not found in known nonstandard list, using standard behaviour.
[AVHWDeviceContext @ 0x556f744cf140] Error initializing an MFX session: -3.
Device creation failed: -1313558101.
Failed to set value 'qsv=hw' for option 'init_hw_device': Unknown error occurred
Error parsing global options: Unknown error occurred
_
私はffmpegがIntel QuickSync経由のハードウェアアクセラレータh264エンコーダーを使用してビデオをエンコードすることを期待していました。
私のffmpegビルドに関する有用な情報:
_ffmpeg version N-93636-g6829c3c Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 7 (Ubuntu 7.3.0-27ubuntu1~18.04)
configuration: --prefix=/root/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/root/ffmpeg_build/include --extra-ldflags=-L/root/ffmpeg_build/lib --extra-libs='-lpthread -lm' --bindir=/root/bin --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libmfx --enable-nonfree
_
_--enable-libmfx
_を有効にしています。
このプロセッサの使用:model name : Intel(R) Xeon(R) CPU E3-1578L v5 @ 2.00GHz
_ffmpeg -encoders | grep qsv
_を実行すると、次のようになります。
_ V..... h264_qsv H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (Intel Quick Sync Video acceleration) (codec h264)
V..... hevc_qsv HEVC (Intel Quick Sync Video acceleration) (codec hevc)
V..... mjpeg_qsv MJPEG (Intel Quick Sync Video acceleration) (codec mjpeg)
V..... mpeg2_qsv MPEG-2 video (Intel Quick Sync Video acceleration) (codec mpeg2video)
_
コンソールからの出力に注意してください:
[AVHWDeviceContext @ 0x556f744cf5c0] VAAPI driver: Intel i965 driver for Intel(R) Skylake - 2.1.0.
[AVHWDeviceContext @ 0x556f744cf5c0] Driver not found in known nonstandard list, using standard behaviour.
[AVHWDeviceContext @ 0x556f744cf140] Error initializing an MFX session: -3.
Device creation failed: -1313558101.
Failed to set value 'qsv=hw' for option 'init_hw_device': Unknown error occurred
これは、QuickSyncに間違ったVAAPIドライバーを使用しているために発生します。 VAAPIベースのエンコーダーではなくMedia SDK for QuickSyncを使用しているため、正しいドライバーを intel media driver 、iHD
に設定する必要があります。
必要に応じて追加のコーデックをサポートし、必要な機能(QuickSync)を備えたFFmpegビルドを導出するために必要な手順を、以下の正しいドライバーの使用に関する追加のメモとともに文書化します。
プラットフォームが最新であることを確認します:
私はあなたがUbuntu 18.04 LTSを使用していることに気付いたので、次の手順で実行できます。
Sudo apt update && Sudo apt -y upgrade && Sudo apt -y dist-upgrade
最初にベースラインの依存関係をインストールします:
Sudo apt-get -y install autoconf automake build-essential libass-dev libtool pkg-config texinfo zlib1g-dev libva-dev cmake Mercurial libdrm-dev libvorbis-dev libogg-dev git libx11-dev libperl-dev libpciaccess-dev libpciaccess0 xorg-dev intel-gpu-tools libwayland-dev xutils-dev libssl-dev
次に、libvaの最新の開発ヘッダーをインストールするために必要なOibaf PPAを追加します。
Sudo add-apt-repository ppa:oibaf/graphics-drivers
Sudo apt-get update && Sudo apt-get -y upgrade && Sudo apt-get -y dist-upgrade
Ubuntu 18.04LTSを使用してリンカーの問題に対処するには:
更新:これはもう必要ありませんが、将来の参照用に残っています。
これを参照: https://forum.openframeworks.cc/t/ubuntu-unable-to-compile-missing-glx-mesa/29367/2
次のシンボリックリンクを次のように作成します。
Sudo ln -s /usr/lib/x86_64-linux-gnu/libGLX_mesa.so.0 /usr/lib/x86_64-linux-gnu/libGLX_mesa.so
最新のlibvaとすべてのドライバーをソースからビルドします:
セットアップビルド環境:
作業スペースの初期化:
mkdir -p ~/vaapi
mkdir -p ~/ffmpeg_build
mkdir -p ~/ffmpeg_sources
mkdir -p ~/bin
Libvaから始めます。
1。 Libva:
LibvaはVA-API(Video Acceleration API)の実装です
VA-APIはオープンソースのライブラリおよびAPI仕様であり、ビデオ処理用のグラフィックハードウェアアクセラレーション機能へのアクセスを提供します。これは、サポートされている各ハードウェアベンダーのメインライブラリとドライバー固有のアクセラレーションバックエンドで構成されています。以下のVAAPIドライバーコンポーネントをビルドするための前提条件です。
cd ~/vaapi
git clone https://github.com/01org/libva
cd libva
./autogen.sh --prefix=/usr --libdir=/usr/lib/x86_64-linux-gnu
time make -j$(nproc) VERBOSE=1
Sudo make -j$(nproc) install
Sudo ldconfig -vvvv
2。 Gmmlib:
インテル(R)グラフィックスメモリ管理ライブラリは、OpenCL(TM)用インテル(R)グラフィックスコンピュートランタイムおよびVAAPI用インテル(R)メディアドライバー向けのデバイス固有のバッファー管理を提供します。
このコンポーネントは、以下のインテルメディアドライバーのビルドステップの前提条件です。
これをビルドするには、vaapiサブディレクトリ内にワークスペースディレクトリを作成し、ビルドを実行します。
mkdir -p ~/vaapi/workspace
cd ~/vaapi/workspace
git clone https://github.com/intel/gmmlib
mkdir -p build
cd build
cmake -DCMAKE_BUILD_TYPE= Release ../gmmlib
make -j$(nproc)
次に、パッケージをインストールします。
Sudo make -j$(nproc) install
そして続行します。
VAAPI向けインテル(R)メディアドライバーは、MITライセンス。
cd ~/vaapi/workspace
git clone https://github.com/intel/media-driver
cd media-driver
git submodule init
git pull
mkdir -p ~/vaapi/workspace/build_media
cd ~/vaapi/workspace/build_media
Cmakeを使用してプロジェクトを構成します。
cmake ../media-driver \
-DMEDIA_VERSION="2.0.0" \
-DBS_DIR_GMMLIB=$PWD/../gmmlib/Source/GmmLib/ \
-DBS_DIR_COMMON=$PWD/../gmmlib/Source/Common/ \
-DBS_DIR_INC=$PWD/../gmmlib/Source/inc/ \
-DBS_DIR_MEDIA=$PWD/../media-driver \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_INSTALL_LIBDIR=/usr/lib/x86_64-linux-gnu \
-DINSTALL_DRIVER_SYSCONF=OFF \
-DLIBVA_DRIVERS_PATH=/usr/lib/x86_64-linux-gnu/dri
次に、メディアドライバーをビルドします。
time make -j$(nproc) VERBOSE=1
次に、プロジェクトをインストールします。
Sudo make -j$(nproc) install VERBOSE=1
ビデオグループに自分を追加します。
Sudo usermod -a -G video $USER
注:FFmpegは、起動時に正しいQSVドライバーを取得できるようになりました。通常、iHD
がインストールされており、ldconfig
エントリ。システム全体に/etc/environment
で、またはFFmpegの起動セッションごとに正しいドライバーを設定する必要がなくなりました。
4。 libva-utils:
このパッケージは、プラットフォームのサポートされている機能(VAAPIエントリポイント情報によるコーデックごとのエンコード、デコード、およびpostproc属性)を検証するために必要なvainfo
などのVA-APIのテストのコレクションを提供します。
cd ~/vaapi
git clone https://github.com/intel/libva-utils
cd libva-utils
./autogen.sh --prefix=/usr --libdir=/usr/lib/x86_64-linux-gnu
time make -j$(nproc) VERBOSE=1
Sudo make -j$(nproc) install
この時点で、再起動を発行します。
Sudo systemctl reboot
これは、ユーザーをビデオグループに追加するなど、上記の変更を反映するために必要です。
その後、再開したら、次の手順に進みます。
ビルド インテルのMSDK :
このパッケージは、グラフィックスが統合されたIntel®プラットフォームでハードウェアアクセラレーションビデオのデコード、エンコード、フィルタリングにアクセスするためのAPIを提供します。 intel-media-driverが対象とするプラットフォームでサポートされます。
世代ごとにサポートされる機能については、「 this 」を参照してください。
ビルドステップ:
(a)。ソースを作業ディレクトリ~/vaapi
にフェッチします。
cd ~/vaapi
git clone https://github.com/Intel-Media-SDK/MediaSDK msdk
cd msdk
git submodule init
git pull
(b)。ビルドを構成します。
mkdir -p ~/vaapi/build_msdk
cd ~/vaapi/build_msdk
cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_WAYLAND=ON -DENABLE_X11_DRI3=ON ../msdk
time make -j$(nproc) VERBOSE=1
Sudo make install -j$(nproc) VERBOSE=1
CMakeは、使用しているプラットフォームを自動的に検出し、作業ビルドに必要なプラットフォーム固有のフックを有効にします。
IMSDKのライブラリ構成ファイルを作成します。
Sudo nano /etc/ld.so.conf.d/imsdk.conf
コンテンツ:
/opt/intel/mediasdk/lib
/opt/intel/mediasdk/plugins
次に実行します:
Sudo ldconfig -vvvv
続行します。
iMSDKで使用可能なFFmpegバイナリをビルドします:
必要に応じて追加のコンポーネントを含めます。
(a)。 nasmのビルドとデプロイ:Nasm は、x264およびFFmpegで使用されるx86最適化用のアセンブラーです。強くお勧めします。そうしないと、ビルドが非常に遅くなる可能性があります。
これが現在Yasmからnasmに切り替えられていることに注意してください。これは、x265、x264などが採用している現在のアセンブラーです。
cd ~/ffmpeg_sources
wget https://www.nasm.us/pub/nasm/releasebuilds/2.14.02/nasm-2.14.02.tar.gz
tar xzvf nasm-2.14.02.tar.gz
cd nasm-2.14.02
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
make -j$(nproc)
make -j$(nproc) install
make -j$(nproc) distclean
(b)。 libx264を静的にビルドしてデプロイします:このライブラリは、H.264ビデオエンコーダーを提供します。詳細および使用例については、 H.264エンコーディングガイド を参照してください。これには、ffmpegを--enable-gpl --enable-libx264
で構成する必要があります。
cd ~/ffmpeg_sources
git clone https://code.videolan.org/videolan/x264.git
cd ~/ffmpeg_sources/x264
git pull
PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static --disable-opencl --bit-depth=all --enable-pic
PATH="$HOME/bin:$PATH" make -j$(nproc)
make -j$(nproc) install
make -j$(nproc) distclean
(c)。 libx265:を構築および構成するこのライブラリは、H.265/HEVCビデオエンコーダーを提供します。詳細および使用例については、 H.265エンコーディングガイド を参照してください。
cd ~/ffmpeg_sources
hg clone https://bitbucket.org/multicoreware/x265
cd ~/ffmpeg_sources/x265/build/linux
PATH="$HOME/bin:$PATH" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED:bool=off ../../source
make -j$(nproc) VERBOSE=1
make -j$(nproc) install VERBOSE=1
make -j$(nproc) clean VERBOSE=1
(d)。 libfdk-aacライブラリをビルドしてデプロイします。これにより、AACオーディオエンコーダーが提供されます。詳細および使用例については、 AACオーディオエンコーディングガイド を参照してください。これには、ffmpegを--enable-libfdk-aac
(および--enable-nonfree
も含めた場合は--enable-gpl
)で構成する必要があります。
cd ~/ffmpeg_sources
git clone https://github.com/mstorsjo/fdk-aac
cd fdk-aac
autoreconf -fiv
./configure --prefix="$HOME/ffmpeg_build" --disable-shared
make -j$(nproc)
make -j$(nproc) install
make -j$(nproc) distclean
(e)。 libvpx:を構築して構成する
cd ~/ffmpeg_sources
git clone https://github.com/webmproject/libvpx
cd libvpx
./configure --prefix="$HOME/ffmpeg_build" --enable-runtime-cpu-detect --enable-vp9 --enable-vp8 \
--enable-postproc --enable-vp9-postproc --enable-multi-res-encoding --enable-webm-io --enable-better-hw-compatibility --enable-vp9-highbitdepth --enable-onthefly-bitpacking --enable-realtime-only --cpu=native --as=nasm
time make -j$(nproc)
time make -j$(nproc) install
time make clean -j$(nproc)
time make distclean
(f)。 LibVorbis:をビルドします
cd ~/ffmpeg_sources
wget -c -v http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.6.tar.xz
tar -xvf libvorbis-1.3.6.tar.xz
cd libvorbis-1.3.6
./configure --enable-static --prefix="$HOME/ffmpeg_build"
time make -j$(nproc)
time make -j$(nproc) install
time make clean -j$(nproc)
time make distclean
(g)。 FFmpegをビルドします:
必要なオプションを使用してFFmpegバイナリをビルドします。
cd ~/ffmpeg_sources
git clone https://github.com/FFmpeg/FFmpeg -b master
cd FFmpeg
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig:/opt/intel/mediasdk/lib/pkgconfig" ./configure \
--pkg-config-flags="--static" \
--prefix="$HOME/bin" \
--bindir="$HOME/bin" \
--extra-cflags="-I$HOME/bin/include" \
--extra-ldflags="-L$HOME/bin/lib" \
--extra-cflags="-I/opt/intel/mediasdk/include" \
--extra-ldflags="-L/opt/intel/mediasdk/lib" \
--extra-ldflags="-L/opt/intel/mediasdk/plugins" \
--enable-libmfx \
--enable-vaapi \
--enable-opencl \
--disable-debug \
--enable-libvorbis \
--enable-libvpx \
--enable-libdrm \
--enable-gpl \
--cpu=native \
--enable-libfdk-aac \
--enable-libx264 \
--enable-libx265 \
--enable-openssl \
--enable-pic \
--extra-libs="-lpthread -lm -lz -ldl" \
--enable-nonfree
PATH="$HOME/bin:$PATH" make -j$(nproc)
make -j$(nproc) install
make -j$(nproc) distclean
hash -r
これで、必要な機能を備えた~/bin/ffmpeg
からFFmpegバイナリを起動できます。
QSVエンコーダーでのエンコードに関する注意:
通常、以下の例に示すように、使用中のエンコーダとフィルタリングの両方で使用されるハードウェアデバイスを初期化する必要があります。
ffmpeg -y -loglevel debug -init_hw_device qsv=hw -filter_hw_device hw -hwaccel qsv -hwaccel_output_format qsv \
-i simpsons.mp4 -vf 'format=qsv,hwupload=extra_hw_frames=64' \
-c:v hevc_qsv \
-bf 3 -b:v 3.75M -maxrate:v 3.75M -bufsize:v 0.5M -r:v 30 -c:a copy -f mp4 trolled.mp4
MFXセッションで使用するハードウェアデバイスがどのように初期化(-init_hw_device qsv=hw
)され、hwupload
(-filter_hw_device hw
)などのフィルターで使用できるようにマップされているかを確認します。さらに読むために推奨:FFmpeg wikiの Advanced Video Options セクション。
上記の例は、参照用にいくつかのプライベートオプションが渡されたhevc_qsv
エンコーダーの使用を示しています。
h264_qsv
エンコーダーの使用を示す別の例:
ffmpeg -y -loglevel debug -init_hw_device qsv=hw -filter_hw_device hw -hwaccel qsv -hwaccel_output_format qsv \
-i simpsons.mp4 -vf 'format=qsv,hwupload=extra_hw_frames=64' \
-c:v h264_qsv \
-bf 3 -b:v 15M -maxrate:v 15M -bufsize:v 2M -r:v 30 -c:a copy -f mp4 trolled.mp4
上記の両方の例では、コンソールログに示されているように、MFXで固定ビットレート制御(CBR)メソッドを使用することに注意してください。
[hevc_qsv @ 0x55faf21eedc0] Using the constant bitrate (CBR) ratecontrol method
VAAPI実装 による制御と同様のレート制御は、エンコーダーに渡されるパラメーター-b:v
(ターゲットビデオビットレート)および-maxrate:v
(最大ビデオビットレート)によって制御されます。 。それらが等しい場合、CBR(固定ビットレート制御)が使用されます。 maxrateがターゲットビットレートよりも大きい場合、VBR、および事実上、先読みベースの制御(必要な場合)が有効になります。
format=qsv
フィルターとチェーンされたhwupload
フィルターを呼び出す方法を観察して、MFXランタイムがサポートされているピクセル形式を確実に受け取るようにします。このビデオフィルターチェーンを渡さないと、次のような出力で初期化が失敗します。
[h264_qsv @ 0x560e1bda7280] Selected ratecontrol mode is unsupported
[h264_qsv @ 0x560e1bda7280] Low power mode is unsupported
[h264_qsv @ 0x560e1bda7280] Current frame rate is unsupported
[h264_qsv @ 0x560e1bda7280] Current picture structure is unsupported
[h264_qsv @ 0x560e1bda7280] Current resolution is unsupported
[h264_qsv @ 0x560e1bda7280] Current pixel format is unsupported
[h264_qsv @ 0x560e1bda7280] some encoding parameters are not supported by the QSV runtime. Please double check the input parameters.
Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height
エラーメッセージは最初はあいまいに見えるかもしれませんが、これは主に、サポートされていないピクセル形式など、無効なオプションを基になるMFXライブラリにマッピングすることから生じます。
hwupload
に渡される追加の引数extra_hw_frames=64
は、 割り当てられた固定フレームプールサイズ を必要とするMFXランタイムと関係があります。要件に適した番号を使用してください。一般に、 look-ahead(LA-ICQ) などの機能を使用する場合は、より大きな数(64、またはその前後)が必要になります。