WSLでFFmpegのGPUエンコード(nvenc)を有効化する方法

システム

こんにちは。

FFmpegを用いた動画のエンコードで、NVIDIAのGPUアクセラレーションを利用できます。

WSLでも可能なので、インストール手順を記載しておきます。

前提

パッケージ管理システムによってインストールされるFFmpegでGPUエンコードを使えない場合、ソースコードからインストールする必要があります。
その手順を紹介します。

WSLでCUDAを有効にする

基本的に、WSL で NVIDIA CUDA を有効にするCUDA on WSL User Guide の手順に従います。

ドライバをWindowsにインストールする

まず、WindowsにNVIDIA Driverをインストールします。

Download The Official NVIDIA Drivers のページから、自身のバージョンに合った「NVIDIA Studio Driver」のインストーラをダウンロードし、実行してインストールします。

インストールが完了したら、Windowsを再起動します。

正常にインストールされていれば、WSLで以下のコマンドを実行できるはずです。

nvidia-smi

CUDA ToolkitをWSLにインストールする

ここからは、WSLで作業します。

まず、古いGPTキーを削除します。

sudo apt-key del 7fa2af80

次に、関連パッケージを予めインストールしておきます。(後に出てくる手順を先に実行しておきます。いつ実施しても問題ないためです)

sudo apt update
sudo apt install build-essential yasm cmake libtool libc6 libc6-dev unzip wget libnuma1 libnuma-dev nasm pkg-config

その後、CUDA Toolkit 12.6 Update 2 Downloads の手順通りに、CUDA ToolkitをWSLにインストールします。

wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.6.2/local_installers/cuda-repo-wsl-ubuntu-12-6-local_12.6.2-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-12-6-local_12.6.2-1_amd64.deb
sudo cp /var/cuda-repo-wsl-ubuntu-12-6-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt update
sudo apt -y install cuda-toolkit-12-6

上記インストールが完了したら、以下を実行してパスを通します。

echo 'export PATH="/usr/local/cuda/bin:$PATH"' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"'
 >> ~/.bashrc
source ~/.bashrc

これでCUDA Toolkitのインストールは完了です。以下のコマンドが実行できるようになっているはずです。

nvcc -V

FFmpegのインストール

FFmpegを普通にインストールすると nvenc が有効化されないため、NVIDIAのドキュメントに従ってインストールします。

nv-codec-headersとFFmpegのインストール

もし、既にFFmpegがインストールされている場合は、アンインストールしておきます。

sudo apt --purge remove ffmpeg

あとは基本的に Using FFmpeg with NVIDIA GPU Hardware Acceleration の通り、nv-codec-headers と FFmpeg をインストールします。
Linuxの場合と同じ手順です。

以下の ./configure コマンドでどの機能を有効化するか指定しており、ここで --enable-cuda-nvcc を指定しています。

git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
cd nv-codec-headers && sudo make install && cd ..
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg/
cd ffmpeg
./configure --enable-nonfree --enable-cuda-nvcc --enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64 --disable-static --enable-shared
make -j 8
sudo make install

その他機能の追加方法

その他の欲しい機能は ./configure コマンドの引数に追加してください。
例えば、--enable-openssl が欲しい場合、デフォルトでは含まれていないので追加します。
追加する場合、関連パッケージのインストールが必要になるので、それも併せてインストールします。この例の場合は以下が必要です。

sudo apt install openssl libssl-dev

参考までに、apt install ffmpeg でインストールした場合に適用される設定を以下に記載しておきます。

ffmpeg version 6.1.1-3ubuntu5 Copyright (c) 2000-2023 the FFmpeg developers
  built with gcc 13 (Ubuntu 13.2.0-23ubuntu3)
  configuration: --prefix=/usr --extra-version=3ubuntu5 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --disable-omx --enable-gnutls --enable-libaom --enable-libass --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libharfbuzz --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-openal --enable-opencl --enable-opengl --disable-sndio --enable-libvpl --disable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-ladspa --enable-libbluray --enable-libjack --enable-libpulse --enable-librabbitmq --enable-librist --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libx264 --enable-libzmq --enable-libzvbi --enable-lv2 --enable-sdl2 --enable-libplacebo --enable-librav1e --enable-pocketsphinx --enable-librsvg --enable-libjxl --enable-shared
  libavutil      58. 29.100 / 58. 29.100
  libavcodec     60. 31.102 / 60. 31.102
  libavformat    60. 16.100 / 60. 16.100
  libavdevice    60.  3.100 / 60.  3.100
  libavfilter     9. 12.100 /  9. 12.100
  libswscale      7.  5.100 /  7.  5.100
  libswresample   4. 12.100 /  4. 12.100
  libpostproc    57.  3.100 / 57.  3.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

上記の設定に必要なパッケージは以下の通りです。(apt install ffmpegにより自動的にインストールされるパッケージです)

i965-va-driver intel-media-va-driver libaacs0 libass9 libasyncns0 libavc1394-0 libavcodec60 libavdevice60 libavfilter9 libavformat60 libavutil58 libbdplus0 libblas3 libbluray2 libbs2b0 libcaca0 libcdio-cdda2t64 libcdio-paranoia2t64 libcdio19t64 libchromaprint1 libcjson1 libcodec2-1.2 libdav1d7 libdc1394-25 libdecor-0-0 libdecor-0-plugin-1-gtk libflac12t64 libflite1 libgfortran5 libgme0 libgsm1 libhwy1t64 libiec61883-0 libigdgmm12 libjack-jackd2-0 libjxl0.7 liblapack3 liblilv-0-0 libmbedcrypto7t64 libmp3lame0 libmpg123-0t64 libmysofa1 libnorm1t64 libogg0 libopenal-data libopenal1 libopenmpt0t64 libopus0 libpgm-5.3-0t64 libplacebo338 libpocketsphinx3 libpostproc57 libpulse0 librabbitmq4 librav1e0 libraw1394-11 librist4 librubberband2 libsamplerate0 libsdl2-2.0-0 libserd-0-0 libshine3 libsnappy1v5 libsndfile1 libsndio7.0 libsord-0-0 libsoxr0 libspeex1 libsphinxbase3t64 libsratom-0-0 libsrt1.5-gnutls libssh-gcrypt-4 libsvtav1enc1d1 libswresample4 libswscale7 libtheora0 libtwolame0 libudfread0 libunibreak5 libusb-1.0-0 libva-drm2 libva-x11-2 libva2 libvdpau1 libvidstab1.1 libvorbis0a libvorbisenc2 libvorbisfile3 libvpl2 libvpx9 libx264-164 libx265-199 libxss1 libxvidcore4 libzimg2 libzix-0-0 libzmq5 libzvbi-common libzvbi0t64 mesa-va-drivers mesa-vdpau-drivers ocl-icd-libopencl1 pocketsphinx-en-us va-driver-all vdpau-driver-all

エラー解消等

これでインストールは完了ですが、ffmpeg を実行すると以下のエラーが発生すると思います。

ffmpeg: error while loading shared libraries: libavdevice.so.61: cannot open shared object file: No such file or directory

その場合、Ffmpeg error in linux – Stack Overflow を参考にしたところ、エラーは解消しました。

まず、以下のコマンドでエラー対象のファイルの場所を見つけます。ただし、ファイル名はエラー文中に記載されている名前です。

sudo find / -name libavdevice.so.61

見つかったファイルを ‘/etc/ld.so.conf.d/’ ディレクトリ内にコピーし、そのファイルを読み込みます。

sudo cp /usr/local/lib/libavdevice.so.61 /etc/ld.so.conf.d/
sudo ldconfig

以下のコマンドが実行できれば、すべての工程が完了です。

ffmpeg

codecにnvencを指定する

NVIDIAのGPUエンコーダには、hevc_nvench264_nvencav1_nvenc があります。

詳しくは、以下のコマンドで確認できます。

ffmpeg -codecs | grep nvenc
 DEV.L. av1                  Alliance for Open Media AV1 (decoders: libdav1d libaom-av1 av1 av1_cuvid av1_qsv) (encoders: libaom-av1 librav1e libsvtav1 av1_nvenc av1_qsv av1_vaapi)
 DEV.LS h264                 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_v4l2m2m h264_qsv h264_cuvid) (encoders: libx264 libx264rgb h264_nvenc h264_qsv h264_v4l2m2m h264_vaapi)
 DEV.L. hevc                 H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_qsv hevc_v4l2m2m hevc_cuvid) (encoders: libx265 hevc_nvenc hevc_qsv hevc_v4l2m2m hevc_vaapi)

最後に

WSLでFFmpegのnvencを有効化する手順を紹介しました。

非常に速いので、GPUを使える場合は是非活用してみてください。

それでは、また。

システム技術系

コメント一覧

タイトルとURLをコピーしました