Skip to content

Instantly share code, notes, and snippets.

@denji
Forked from lucaspar/nvenc-install.sh
Last active August 24, 2025 10:53
Show Gist options
  • Save denji/fc963b79498328a2145944fc5029cddc to your computer and use it in GitHub Desktop.
Save denji/fc963b79498328a2145944fc5029cddc to your computer and use it in GitHub Desktop.
Installation script of CUDA-accelerated `ffmpeg` with NVIDIA Encoder ( docker NVIDIA Encoder https://github.com/markus-perl/ffmpeg-build-script )
#!/bin/bash
# ==================================================================
# This script will compile and install a static ffmpeg build with
# support for NVENC in Ubuntu. Developed in Ubuntu 22.04 LTS,
# with NVIDIA Drivers v510.73 and CUDA v11.6
# It assumes NVIDA drivers are installed and that you have a
# CUDA-compatible GPU. You can check installed drivers with:
# $ apt list *nvidia-driver-* | grep installed
# $ nvidia-smi
# ==================================================================
set -e
# Directories you might want to change
DIR_INSTALL_ROOT="${XDG_STATE_HOME:-$HOME/.local/state}" # where to install ffmpeg
DIR_FFMPEG_BUILD="$DIR_INSTALL_ROOT/ffmpeg-build" # where to build ffmpeg
DIR_FFMPEG_SOURCES="$DIR_INSTALL_ROOT/ffmpeg-sources" # ffmpeg source code
DIR_USR_BIN="$HOME/.local/bin" # user-writable binaries
# Install required things from apt
install_libs() {
echo "Installing prerequisites"
sudo apt-get update
sudo apt-get -y --force-yes install autoconf automake build-essential \
libass-dev libfreetype6-dev libgpac-dev libsdl1.2-dev libtheora-dev \
libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev \
libxcb-xfixes0-dev pkg-config texi2html zlib1g-dev libopus-dev libunistring-dev \
libavdevice-dev libfdk-aac-dev libmp3lame-dev libx264-dev libavcodec-dev \
libgnutls28-dev
}
# Install NVENC SDK
install_nvenc_sdk() {
echo "Installing the NVIDIA NVENC SDK."
cd "$DIR_FFMPEG_SOURCES" || exit 1
dir_nvcodec="$DIR_FFMPEG_SOURCES/nv-codec-headers"
if [ ! -d "$dir_nvcodec" ]; then
git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git "$dir_nvcodec"
fi
cd "$dir_nvcodec" || exit 1
make
sudo make install
}
# Compile nasm
compile_nasm() {
echo "Compiling nasm"
# dir_nasm="$DIR_FFMPEG_SOURCES/nasm-2.14rc0"
dir_nasm="$DIR_FFMPEG_SOURCES/nasm-2.15"
if [ ! -d "$dir_nasm" ]; then
cd "$DIR_FFMPEG_SOURCES" || exit 1
# wget "http://www.nasm.us/pub/nasm/releasebuilds/2.14rc0/nasm-2.14rc0.tar.gz"
# tar xzvf nasm-2.14rc0.tar.gz
wget "https://www.nasm.us/pub/nasm/releasebuilds/2.15/nasm-2.15.tar.gz"
tar xzvf nasm-2.15.tar.gz
fi
cd "$dir_nasm" || exit 1
./configure --prefix="$DIR_FFMPEG_BUILD" --bindir="$DIR_USR_BIN"
make -j"${NUM_CORES}" || true # too many false positives, ignoring errors
make -j"${NUM_CORES}" install || true # too many false positives, ignoring errors
make -j"${NUM_CORES}" distclean
}
# Compile libvpx
compile_libvpx() {
echo "Compiling libvpx"
dir_vpx="$DIR_FFMPEG_SOURCES/libvpx"
if [ ! -d "$dir_vpx" ]; then
cd "$DIR_FFMPEG_SOURCES" || exit 1
git clone https://chromium.googlesource.com/webm/libvpx "$dir_vpx"
fi
cd "$dir_vpx" || exit 1
PATH="$DIR_USR_BIN:$PATH" ./configure --prefix="$DIR_FFMPEG_BUILD" --disable-examples \
--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 --enable-pic \
--cpu=native --as=nasm
PATH="$DIR_USR_BIN:$PATH" make -j"${NUM_CORES}"
make -j"${NUM_CORES}" install
make -j"${NUM_CORES}" clean
}
# Compile ffmpeg
compile_ffmpeg() {
echo "Compiling ffmpeg"
dir_ffmpeg="$DIR_FFMPEG_SOURCES/ffmpeg-repo"
if [ ! -d "$dir_ffmpeg" ]; then
cd "$DIR_FFMPEG_SOURCES" || exit 1
git clone https://github.com/FFmpeg/FFmpeg.git -b master "$dir_ffmpeg"
fi
cd "$dir_ffmpeg" || exit 1
# switch to version 5.1 (most recent version at the time of writing)
# check versions at https://github.com/FFmpeg/FFmpeg/branches/active
# check changelog at https://github.com/FFmpeg/FFmpeg/blob/master/Changelog
git fetch --tags
git switch release/5.1
ccap=37
PATH="$DIR_USR_BIN:$PATH" PKG_CONFIG_PATH="$DIR_FFMPEG_BUILD/lib/pkgconfig" ./configure \
--pkg-config-flags="--static" \
--prefix="$DIR_FFMPEG_BUILD" \
--extra-cflags="-I$DIR_FFMPEG_BUILD/include" \
--extra-ldflags="-L$DIR_FFMPEG_BUILD/lib" \
--extra-cflags="-I/usr/local/cuda/include/" \
--extra-ldflags=-L/usr/local/cuda/lib64/ \
--nvccflags="-gencode arch=compute_${ccap},code=sm_${ccap} -O2" \
--bindir="$DIR_USR_BIN" \
--enable-static \
--enable-cuda-nvcc \
--enable-cuvid \
--enable-decoder=aac \
--enable-decoder=h264 \
--enable-decoder=h264_cuvid \
--enable-demuxer=mov \
--enable-filter=scale \
--enable-gnutls \
--enable-gpl \
--enable-libass \
--enable-libfdk-aac \
--enable-libfreetype \
--enable-libmp3lame \
--enable-libnpp \
--enable-libopus \
--enable-libtheora \
--enable-libvorbis \
--enable-libvpx \
--enable-libx264 \
--enable-nonfree \
--enable-nvdec \
--enable-nvenc \
--enable-pic \
--enable-protocol=file \
--enable-protocol=https \
--enable-shared \
--enable-vaapi
PATH="$DIR_USR_BIN:$PATH" make -j"${NUM_CORES}"
make -j"${NUM_CORES}" install
make -j"${NUM_CORES}" distclean
hash -r
}
# check if nvidia-smi succeeds
check_nvidia_smi() {
if ! nvidia-smi &>/dev/null; then
echo -e "\tnvidia-smi not found or failed to run."
echo -e "\tMake sure NVIDIA drivers are installed e.g.:"
echo -e "\t\tsudo apt install nvidia-driver-515"
exit 1
fi
}
check_nvidia_smi
# set number of cores to use
num_proc="$(nproc)"
NUM_CORES=$((num_proc - 2))
echo "Using up to $NUM_CORES cores"
# create directories
mkdir -p "$DIR_INSTALL_ROOT"
cd "$DIR_INSTALL_ROOT" || exit 1
mkdir -p "$DIR_FFMPEG_SOURCES"
# main things
install_libs
install_nvenc_sdk
compile_nasm
compile_libvpx
compile_ffmpeg
echo " >> Complete!"
echo -e " >> Some commands to try:\n"
echo "ffmpeg 2>/dev/null -version | grep -i 'nv[a-z]*|nvidia|cuda|nvenc'"
echo "ffprobe 2>/dev/null -decoders | grep -i 'nvidia|cuda|nvenc'"
echo "ffprobe 2>/dev/null -encoders | grep -i 'nvidia|cuda|nvenc'"
echo "ffprobe 2>/dev/null -filters | grep -i 'nvidia|cuda|nvenc'"
echo -e "\n\n"
echo -e " >> Example of nvenc usage:\n"
echo -e "wget https://filesamples.com/samples/video/mp4/sample_1280x720_surfing_with_audio.mp4 -O input.mp4"
echo -e "time ffmpeg -hwaccel cuda -hwaccel_output_format cuda -extra_hw_frames 4 -i input.mp4 -c:v h264_nvenc output.mp4"
echo -e "time ffmpeg -y -i input.mp4 -c:v h264 output.mp4"
echo -e "\n\tWall times for tested run:\t15.695s (CPU, 24 cores) vs. (CUDA, RTX 3080) 4.952s"
echo -e "\n\n\t >>> Add this line to your ~/.bashrc or equivalent: <<<"
echo -e "export LD_LIBRARY_PATH=\"\$LD_LIBRARY_PATH:$DIR_FFMPEG_BUILD/lib\"\n\n"
@whittinghamj
Copy link

this errors out

Using up to 158 cores
Installing prerequisites
Get:1 http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 InRelease [1,581 B]
Hit:2 http://us.archive.ubuntu.com/ubuntu jammy InRelease
Get:3 http://us.archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
Get:4 http://us.archive.ubuntu.com/ubuntu jammy-backports InRelease [109 kB]
Err:1 http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 InRelease
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY A4B469963BF863CC
Get:5 http://us.archive.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Hit:6 https://ppa.launchpadcontent.net/graphics-drivers/ppa/ubuntu jammy InRelease
Ign:7 https://ppa.launchpadcontent.net/nilarimogard/webupd8/ubuntu jammy InRelease
Err:8 https://ppa.launchpadcontent.net/nilarimogard/webupd8/ubuntu jammy Release
404 Not Found [IP: 185.125.190.52 443]
Reading package lists... Done
W: GPG error: http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY A4B469963BF863CC
E: The repository 'http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
E: The repository 'https://ppa.launchpadcontent.net/nilarimogard/webupd8/ubuntu jammy Release' does not have a Release file.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.

also I had to add the following to auto create your staging folders

Create folders

mkdir -p $DIR_USR_BIN
mkdir -p $DIR_INSTALL_ROOT
mkdir -p $DIR_FFMPEG_BUILD
mkdir -p $DIR_FFMPEG_SOURCES

@DOCIS-007
Copy link

Update

# set number of cores to use
num_proc="$(nproc)"
NUM_CORES=$((num_proc <= 2 ? num_proc : num_proc - 1))
echo "Using up to $NUM_CORES cores"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment