Skip to content

Instantly share code, notes, and snippets.

@bootrino
Last active February 12, 2024 10:51
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save bootrino/53c4865f91f2208d2ddd4a1fadd69f58 to your computer and use it in GitHub Desktop.
Save bootrino/53c4865f91f2208d2ddd4a1fadd69f58 to your computer and use it in GitHub Desktop.
Compile ffmpeg with nvenc for Ubuntu 22
#!/bin/bash
#This script will compile and install a static ffmpeg build with support for nvenc un ubuntu.
#See the prefix path and compile options if edits are needed to suit your needs.
# ripped from https://gist.github.com/Brainiarc7/3f7695ac2a0905b05c5b
# updated to my personal needs
# tested on Ubuntu 22
# refer here:
# https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=22.04&target_type=runfile_local
#install required things from apt
installPackages(){
echo "Installing Ubuntu dependencies..."
# everything done on an indivdual line ot prevent problems and show issues
export DEBIAN_FRONTEND=noninteractive
sudo DEBIAN_FRONTEND=noninteractive apt update
sudo DEBIAN_FRONTEND=noninteractive apt install -y autoconf
sudo DEBIAN_FRONTEND=noninteractive apt install -y automake
sudo DEBIAN_FRONTEND=noninteractive apt install -y build-essential
sudo DEBIAN_FRONTEND=noninteractive apt install -y cmake
sudo DEBIAN_FRONTEND=noninteractive apt install -y git
sudo DEBIAN_FRONTEND=noninteractive apt install -y gnutls-bin
sudo DEBIAN_FRONTEND=noninteractive apt install -y libaom-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libass-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libdav1d-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libfdk-aac-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libfreetype6-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libgnutls28-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libgpac-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libmp3lame-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libnuma-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libopus-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libsdl2-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libssh-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libtheora-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libtool
sudo DEBIAN_FRONTEND=noninteractive apt install -y libunistring-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libva-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libvdpau-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libvorbis-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libvpx-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libwebp-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libx264-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libx265-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libxcb-shm0-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libxcb-xfixes0-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libxcb1-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libxvidcore-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y libzimg-dev
sudo DEBIAN_FRONTEND=noninteractive apt install -y meson
sudo DEBIAN_FRONTEND=noninteractive apt install -y nasm
sudo DEBIAN_FRONTEND=noninteractive apt install -y ninja-build
sudo DEBIAN_FRONTEND=noninteractive apt install -y pkg-config
sudo DEBIAN_FRONTEND=noninteractive apt install -y texi2html
sudo DEBIAN_FRONTEND=noninteractive apt install -y texinfo
sudo DEBIAN_FRONTEND=noninteractive apt install -y unzip
sudo DEBIAN_FRONTEND=noninteractive apt install -y virtualenv
sudo DEBIAN_FRONTEND=noninteractive apt install -y wget
sudo DEBIAN_FRONTEND=noninteractive apt install -y yasm
sudo DEBIAN_FRONTEND=noninteractive apt install -y zlib1g-dev
}
HOME_DIR=$HOME/ffmpeg_compile
BUILD_DIR=$HOME_DIR/ffmpeg_build
SOURCE_DIR=$HOME_DIR/ffmpeg_sources
compileAV1(){
# SVTAV1 compiles OK but does not work in ffmpeg!!
# refer: https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/Build-Guide.md
# ffmpeg --help encoder=av1
mkdir -p ~/ffmpeg_build
mkdir -p ~/ffmpeg_sources
cd ~/ffmpeg_sources
sudo rm -rf SVT-AV1
git clone --depth=1 https://gitlab.com/AOMediaCodec/SVT-AV1.git
cd SVT-AV1
cd Build
cmake .. -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=Release
make -j $(nproc)
sudo make install
# ensure the directory containing the lib is in the path
sudo ldconfig /usr/local/lib
}
compileVP9(){
# THIS PROJECT IS BROKEN/DEAD https://github.com/rdp/ffmpeg-windows-build-helpers/issues/560#issuecomment-1485944615
# notice this is run as part of the ffmpeg function because a git patch must be applied
# refer to the function that builds ffmpeg
# refer: https://gitlab.com/AOMediaCodec/SVT-AV1/-/blob/master/Docs/Build-Guide.md
# ffmpeg --help encoder=av1
#mkdir -p ~/ffmpeg_build
mkdir -p $SOURCE_DIR
cd $SOURCE_DIR
sudo rm -rf SVT-VP9
git clone --depth=1 https://github.com/OpenVisualCloud/SVT-VP9.git
cd SVT-VP9/Build
cmake .. -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=Release
make -j $(nproc)
sudo make install
# ensure the directory containing the lib is in the path
sudo ldconfig /usr/local/lib
git apply $SOURCE_DIR/SVT-VP9/ffmpeg_plugin/master-0001-Add-ability-for-ffmpeg-to-run-svt-vp9.patch
}
InstallCUDASDK(){
echo "Installing CUDA and the latest driver repositories from repositories"
cd $SOURCE_DIR
if [ ! -f $SOURCE_DIR/cuda_11.7.1_515.65.01_linux.run ]
then
wget https://developer.download.nvidia.com/compute/cuda/11.7.1/local_installers/cuda_11.7.1_515.65.01_linux.run
fi
sudo sh cuda_11.7.1_515.65.01_linux.run --silent
}
#Install nvidia SDK
installNvidiaSDK(){
echo "Installing the nVidia NVENC SDK."
cd $SOURCE_DIR
if [ ! -d $SOURCE_DIR/nv-codec-headers ]
then
git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
fi
cd nv-codec-headers
make
sudo make install
}
compileFfmpeg(){
echo "Compiling ffmpeg"
cd $SOURCE_DIR
if [ ! -d $SOURCE_DIR/FFmpeg ]
then
git clone https://github.com/FFmpeg/FFmpeg -b master
fi
cd FFmpeg
# this must be done here because the vp9 install process applies a patch to the ffmpeg source
#compileVP9
cd $SOURCE_DIR/FFmpeg
echo "Successfully built vp9..."
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
--prefix="$HOME/ffmpeg_build" \
--pkg-config-flags="--static" \
--extra-cflags="-I$HOME/ffmpeg_build/include" \
--extra-ldflags="-L$HOME/ffmpeg_build/lib" \
--extra-libs="-lpthread -lm" \
--extra-cflags=-I/usr/local/cuda/include \
--extra-ldflags=-L/usr/local/cuda/lib64 \
--ld="g++" \
--bindir="$HOME/bin" \
--enable-gpl \
--enable-gnutls \
--enable-libaom \
--enable-libass \
--enable-libfdk-aac \
--enable-libfreetype \
--enable-libmp3lame \
--enable-libopus \
--enable-libvorbis \
--enable-libvpx \
--enable-libx264 \
--enable-libx265 \
--enable-nvenc \
--enable-libfontconfig \
--enable-libwebp \
--enable-libx264 \
--enable-libx265 \
--enable-nonfree \
--enable-cuda-nvcc \
--enable-libsvtav1 \
--enable-libnpp
# --enable-libsvtvp9 \
# –disable-shared
PATH="$HOME/bin:$PATH" make -j$(nproc)
sudo make -j$(nproc) install
#sudo make -j$(nproc) distclean
hash -r
}
#The process
# process fails if xorg is running
sudo systemctl stop xorg
PATH="/usr/local/cuda/bin:$PATH"
mkdir -p $HOME_DIR
cd $HOME_DIR
mkdir -p $HOME_DIR/ffmpeg_build
mkdir -p $SOURCE_DIR
installPackages
compileAV1
InstallCUDASDK
installNvidiaSDK
compileFfmpeg
echo "Complete!"
echo "You might have to reinstall nvidia drivers and restart xorg"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment