web-dev-qa-db-ja.com

FFmpegを使用してIntel QuickSyncでビデオをh264にエンコードする

私はこのコマンドを実行しています:

_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)
_
4
Suhail Doshi

コンソールからの出力に注意してください:

[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 driveriHDに設定する必要があります。

必要に応じて追加のコーデックをサポートし、必要な機能(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 

そして続行します。

3。 インテルメディアドライバー:

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、またはその前後)が必要になります。

5
林正浩