こんにちは。
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_nvenc
や h264_nvenc
、av1_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を使える場合は是非活用してみてください。
それでは、また。
コメント一覧