#!/bin/bash # This script will compile and install a static ffmpeg build with support for nvenc in Ubuntu. # See the prefix path and compile options if edits are needed to suit your needs. # Directories you might want to change DIR_INSTALL_ROOT="$HOME/demos/" DIR_FFMPEG_BUILD="$DIR_INSTALL_ROOT/ffmpeg-build" DIR_FFMPEG_SOURCES="$DIR_INSTALL_ROOT/ffmpeg-sources" DIR_USR_BIN="$HOME/.local/bin" # Install required things from apt installLibs() { 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 } # # Install CUDA SDK # InstallCUDASDK() { # echo "Installing CUDA and the latest driver repositories from repositories" # cd "$DIR_FFMPEG_SOURCES" || exit 1 # wget -c -v -nc "https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.2.88-1_amd64.deb" # sudo dpkg -i cuda-repo-ubuntu1604_9.2.88-1_amd64.deb # sudo apt-key adv --fetch-keys "http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub" # sudo apt-get -y update # sudo apt-get -y install cuda # sudo add-apt-repository ppa:graphics-drivers/ppa # sudo apt-get update && sudo apt-get -y upgrade # } # Install NVIDIA SDK installSDK() { echo "Installing the NVIDIA NVENC SDK." cd "$DIR_FFMPEG_SOURCES" || exit 1 git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git cd nv-codec-headers || exit 1 make sudo make install } # Compile nasm compileNasm() { echo "Compiling nasm" 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 cd nasm-2.14rc0 || exit 1 ./configure --prefix="$DIR_FFMPEG_BUILD" --bindir="$DIR_USR_BIN" # use nproc - 2 make -j"${NUM_CORES}" make -j"${NUM_CORES}" install make -j"${NUM_CORES}" distclean } # Compile libx264 compileLibX264() { echo "Compiling libx264" cd "$DIR_FFMPEG_SOURCES" || exit 1 # --- older code with broken URL: # wget http://download.videolan.org/pub/x264/snapshots/last_x264.tar.bz2 # tar xjvf last_x264.tar.bz2 # cd x264-snapshot* # --- newer block: wget "https://download.videolan.org/pub/x264/snapshots/x264-snapshot-20191217-2245.tar.bz2" tar xjvf x264-snapshot-20191217-2245.tar.bz2 cd x264-snapshot-20191217-2245 || exit 1 # --- PATH="$DIR_USR_BIN:$PATH" ./configure --prefix="$DIR_FFMPEG_BUILD" --bindir="$DIR_USR_BIN" --enable-static PATH="$DIR_USR_BIN:$PATH" make -j"${NUM_CORES}" make -j"${NUM_CORES}" install make -j"${NUM_CORES}" distclean } # Compile libfdk-acc compileLibfdkcc() { echo "Compiling libfdk-cc" sudo apt-get install unzip cd "$DIR_FFMPEG_SOURCES" || exit 1 wget -O fdk-aac.zip https://github.com/mstorsjo/fdk-aac/zipball/master unzip fdk-aac.zip cd mstorsjo-fdk-aac* || exit 1 autoreconf -fiv ./configure --prefix="$DIR_FFMPEG_BUILD" --disable-shared make -j"${NUM_CORES}" make -j"${NUM_CORES}" install make -j"${NUM_CORES}" distclean } # Compile libmp3lame compileLibMP3Lame() { echo "Compiling libmp3lame" sudo apt-get install nasm cd "$DIR_FFMPEG_SOURCES" || exit 1 wget http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz tar xzvf lame-3.99.5.tar.gz cd lame-3.99.5 || exit 1 ./configure --prefix="$DIR_FFMPEG_BUILD" --enable-nasm --disable-shared make -j"${NUM_CORES}" make -j"${NUM_CORES}" install make -j"${NUM_CORES}" distclean } # Compile libopus compileLibOpus() { echo "Compiling libopus" cd "$DIR_FFMPEG_SOURCES" || exit 1 wget http://downloads.xiph.org/releases/opus/opus-1.2.1.tar.gz tar xzvf opus-1.2.1.tar.gz cd opus-1.2.1 || exit 1 ./configure --prefix="$DIR_FFMPEG_BUILD" --disable-shared make -j"${NUM_CORES}" make -j"${NUM_CORES}" install make -j"${NUM_CORES}" distclean } # Compile libvpx compileLibPvx() { echo "Compiling libvpx" cd "$DIR_FFMPEG_SOURCES" || exit 1 git clone https://chromium.googlesource.com/webm/libvpx cd libvpx || 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 \ --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 compileFfmpeg() { echo "Compiling ffmpeg" cd "$DIR_FFMPEG_SOURCES" || exit 1 git clone https://github.com/FFmpeg/FFmpeg -b master cd FFmpeg || exit 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-cuda-nvcc \ --enable-cuvid \ --enable-libnpp \ --enable-gpl \ --enable-libass \ --enable-libfdk-aac \ --enable-vaapi \ --enable-libfreetype \ --enable-libmp3lame \ --enable-libopus \ --enable-libtheora \ --enable-libvorbis \ --enable-libvpx \ --enable-libx264 \ --enable-nonfree \ --enable-nvenc \ --enable-nvdec \ --disable-doc \ --disable-static \ --disable-bsfs \ --disable-decoders \ --disable-encoders \ --disable-filters \ --disable-demuxers \ --disable-devices \ --disable-muxers \ --disable-parsers \ --disable-postproc \ --disable-protocols \ --enable-decoder=aac \ --enable-decoder=h264 \ --enable-decoder=h264_cuvid \ --enable-demuxer=mov \ --enable-filter=scale \ --enable-protocol=file \ --enable-protocol=https \ --enable-gnutls \ --enable-shared PATH="$DIR_USR_BIN:$PATH" make -j"${NUM_CORES}" make -j"${NUM_CORES}" install make -j"${NUM_CORES}" distclean hash -r } # set number of cores to use num_proc="$(nproc)" NUM_CORES=$((num_proc - 2)) echo "Using $NUM_CORES cores" # create directories cd "$DIR_INSTALL_ROOT" || exit 1 mkdir -p "$DIR_FFMPEG_SOURCES" # main things installLibs installSDK compileNasm compileLibX264 compileLibfdkcc compileLibMP3Lame compileLibOpus compileLibPvx compileFfmpeg echo "Complete!" echo -e " >> Some commands to try:\n" echo "ffprobe -decoders" echo "ffprobe -encoders" echo "ffprobe -filters" echo "ffprobe -protocols" echo "ffprobe -devices" echo "ffmpeg -version | grep -C 20 -i \"nv[a-z]*\"" echo -e "\n" 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"