Advertisement
PhysixCat

tweak to strider's script for FFMPEG+OBS compiling w/NVENC

Sep 25th, 2019
322
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 12.14 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. # This script will compile and install a static ffmpeg build with support for
  4. # nvenc on ubuntu. See the prefix path and compile options if edits are needed
  5. # to suit your needs.
  6.  
  7. #Authors:
  8. #   Linux GameCast ( http://linuxgamecast.com/ )
  9. #   Mathieu Comandon <strider@strycore.com>
  10.  
  11. set -e
  12.  
  13. ShowUsage() {
  14.     echo "Usage: ./build.sh [--dest /path/to/ffmpeg] [--obs] [--help]"
  15.     echo "Options:"
  16.     echo "  -d/--dest: Where to build ffmpeg (Optional, defaults to ./ffmpeg-nvenc)"
  17.     echo "  -o/--obs:  Build OBS Studio"
  18.     echo "  -h/--help: This help screen"
  19.     exit 0
  20. }
  21.  
  22. root_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  23.  
  24. params=$(getopt -n $0 -o d:oh --long dest:,obs,help -- "$@")
  25. eval set -- $params
  26. while true ; do
  27.    case "$1" in
  28.        -h|--help) ShowUsage ;;
  29.        -o|--obs) build_obs=1; shift ;;
  30.        -d|--dest) build_dir=$2; shift 2;;
  31.        *) shift; break ;;
  32.    esac
  33. done
  34.  
  35. cpus=$(getconf _NPROCESSORS_ONLN)
  36. source_dir="${root_dir}/source"
  37. mkdir -p $source_dir
  38. build_dir="${build_dir:-"${root_dir}/ffmpeg-nvenc"}"
  39. mkdir -p $build_dir
  40. bin_dir="${build_dir}/bin"
  41. mkdir -p $bin_dir
  42. inc_dir="${build_dir}/include"
  43. mkdir -p $inc_dir
  44.  
  45. echo "root dir is   : $root_dir"
  46. echo "source dir is : $source_dir"
  47. echo "build dir is  : $build_dir"
  48. echo "bin dir is    : $bin_dir"
  49. echo "inc dir is    : $inc_dir"
  50.  
  51. echo "Building FFmpeg in ${build_dir}"
  52.  
  53. export PATH=$bin_dir:$PATH
  54.  
  55. InstallDependencies() {
  56.     echo "Installing dependencies"
  57.     sudo apt-get -y install git autoconf automake build-essential libass-dev \
  58.         libfreetype6-dev libgpac-dev libsdl1.2-dev libtheora-dev libtool libva-dev \
  59.         libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev \
  60.         libqt5x11extras5-dev libxcb-xinerama0-dev libvlc-dev libv4l-dev   \
  61.         pkg-config texi2html zlib1g-dev cmake libcurl4-openssl-dev \
  62.         libjack-jackd2-dev libxcomposite-dev x11proto-composite-dev \
  63.         libx264-dev libgl1-mesa-dev libglu1-mesa-dev libasound2-dev \
  64.         libpulse-dev libx11-dev libxext-dev libxfixes-dev \
  65.         libxi-dev qt5-default qttools5-dev qt5-qmake qtbase5-dev
  66. }
  67.  
  68. # TODO Detect running system
  69. InstallDependenciesOpenSUSE() {
  70.    echo "Installing dependencies"
  71.    sudo zypper in -y git autoconf automake libass-devel libfreetype6 libgpac-devel \
  72.        libSDL-devel libtheora-devel libtool libva-devel libvdpau-devel libvorbis-devel \
  73.        libxcb-devel pkg-config libxcb-shm0 libvlc5 vlc-devel xcb-util-devel \
  74.        libv4l-devel v4l-utils-devel-tools texi2html zlib-devel cmake \
  75.        libcurl-devel libfdk-aac1
  76. }
  77.  
  78. InstallNvidiaSDK() {
  79.     echo "Installing the NVidia Video SDK"
  80.     sdk_version="9.1.23"
  81.     sdk_basename="Video_Codec_SDK_${sdk_version}"
  82.     cd "$source_dir"
  83.     if [ ! -f "${sdk_basename}.zip" ]; then
  84.         echo "Please download ${sdk_basename} from the NVidia website and place it the source folder"
  85.     fi
  86.     unzip "${sdk_basename}.zip"
  87.     cd $sdk_basename
  88.     cp -a Samples/NvCodec/NvEncoder/* "$inc_dir"
  89. }
  90.  
  91. InstallNvCodecIncludes() {
  92.     echo "Installing Nv codec headers from https://github.com/FFmpeg/nv-codec-headers"
  93.     cd "$source_dir"
  94.     git clone https://github.com/FFmpeg/nv-codec-headers
  95.     cd nv-codec-headers
  96.     cp -a include/ffnvcodec "$inc_dir"
  97.     mkdir -p "${build_dir}/lib/pkgconfig"
  98.     cp ffnvcodec.pc.in "${build_dir}/lib/pkgconfig/ffnvcodec.pc"
  99. }
  100.  
  101. BuildNasm() {
  102.     echo "Compiling nasm"
  103.     cd $source_dir
  104.     nasm_version="2.14.02"
  105.     nasm_basename="nasm-${nasm_version}"
  106.     wget -4 http://www.nasm.us/pub/nasm/releasebuilds/${nasm_version}/nasm-${nasm_version}.tar.gz
  107.     tar xzf "${nasm_basename}.tar.gz"
  108.     cd $nasm_basename
  109.     ./configure --prefix="${build_dir}" --bindir="${bin_dir}"
  110.     make -j${cpus}
  111.     make install
  112. }
  113.  
  114. BuildYasm() {
  115.     echo "Compiling yasm"
  116.     cd $source_dir
  117.     yasm_version="1.3.0"
  118.     yasm_basename="yasm-${yasm_version}"
  119.     wget -4 http://www.tortall.net/projects/yasm/releases/${yasm_basename}.tar.gz
  120.     tar xzf "${yasm_basename}.tar.gz"
  121.     cd $yasm_basename
  122.     ./configure --prefix="${build_dir}" --bindir="${bin_dir}"
  123.     make -j${cpus}
  124.     make install
  125. }
  126.  
  127. BuildX264() {
  128.     echo "Compiling libx264"
  129.     cd $source_dir
  130.     wget -4 http://download.videolan.org/pub/x264/snapshots/last_x264.tar.bz2
  131.     tar xjf last_x264.tar.bz2
  132.     cd x264-snapshot*
  133.     ./configure --prefix="$build_dir" --bindir="$bin_dir" --enable-pic --enable-shared
  134.     make -j${cpus}
  135.     make install
  136. }
  137.  
  138. BuildFdkAac() {
  139.     echo "Compiling libfdk-aac"
  140.     cd $source_dir
  141.     wget -4 -O fdk-aac.zip https://github.com/mstorsjo/fdk-aac/zipball/master
  142.     unzip fdk-aac.zip
  143.     cd mstorsjo-fdk-aac*
  144.     autoreconf -fiv
  145.     ./configure --prefix="$build_dir" # --disable-shared
  146.     make -j${cpus}
  147.     make install
  148. }
  149.  
  150. BuildLame() {
  151.     echo "Compiling libmp3lame"
  152.     cd $source_dir
  153.     lame_version="3.99.5"
  154.     lame_basename="lame-${lame_version}"
  155.     wget -4 "http://downloads.sourceforge.net/project/lame/lame/3.99/${lame_basename}.tar.gz"
  156.     tar xzf "${lame_basename}.tar.gz"
  157.     cd $lame_basename
  158.     ./configure --prefix="$build_dir" --enable-nasm # --disable-shared
  159.     make -j${cpus}
  160.     make install
  161. }
  162.  
  163. BuildOpus() {
  164.     echo "Compiling libopus"
  165.     cd $source_dir
  166.     opus_version="1.1"
  167.     opus_basename="opus-${opus_version}"
  168.     wget -4 "http://downloads.xiph.org/releases/opus/${opus_basename}.tar.gz"
  169.     tar xzf "${opus_basename}.tar.gz"
  170.     cd $opus_basename
  171.     ./configure --prefix="$build_dir" # --disable-shared
  172.     make -j${cpus}
  173.     make install
  174. }
  175.  
  176. BuildVpx() {
  177.     echo "Compiling libvpx"
  178.     cd $source_dir
  179.     vpx_version="1.5.0"
  180.     vpx_basename="libvpx-${vpx_version}"
  181.     vpx_url="http://storage.googleapis.com/downloads.webmproject.org/releases/webm/${vpx_basename}.tar.bz2"
  182.     wget -4 $vpx_url
  183.     tar xjf "${vpx_basename}.tar.bz2"
  184.     cd $vpx_basename
  185.     ./configure --prefix="$build_dir" --disable-examples --enable-shared --disable-static
  186.     make -j${cpus}
  187.     make install
  188. }
  189.  
  190. BuildFFmpeg() {
  191.     echo "Compiling ffmpeg"
  192.     cd $source_dir
  193.     ffmpeg_version="4.2"
  194.     if [ ! -f  ffmpeg-${ffmpeg_version}.tar.bz2 ]; then
  195.         wget -4 http://ffmpeg.org/releases/ffmpeg-${ffmpeg_version}.tar.bz2
  196.     fi
  197.     tar xjf ffmpeg-${ffmpeg_version}.tar.bz2
  198.     cd ffmpeg-${ffmpeg_version}
  199.     PKG_CONFIG_PATH="${build_dir}/lib/pkgconfig" ./configure \
  200.         --prefix="$build_dir" \
  201.         --extra-cflags="-fPIC -m64 -I${inc_dir}" \
  202.         --extra-ldflags="-L${build_dir}/lib" \
  203.         --bindir="$bin_dir" \
  204.         --incdir="$inc_dir" \
  205.         --enable-gpl \
  206.         --enable-libass \
  207.         --enable-libfdk-aac \
  208.         --enable-libfreetype \
  209.         --enable-libmp3lame \
  210.         --enable-libopus \
  211.         --enable-libtheora \
  212.         --enable-libvorbis \
  213.         --enable-libvpx \
  214.         --enable-libx264 \
  215.         --enable-nonfree \
  216.         --enable-nvenc \
  217.         --enable-pic \
  218.         --enable-libxcb \
  219.         --extra-ldexeflags=-pie \
  220.         --enable-shared
  221.     make -j${cpus}
  222.     make install
  223.  
  224.     # Below is the configuration of ffmpeg as provided in Ubuntu 18.10
  225.  
  226.     # ffmpeg version 4.0.2-2 Copyright (c) 2000-2018 the FFmpeg developers
  227.     #   built with gcc 8 (Ubuntu 8.2.0-7ubuntu1)
  228.     #   configuration: --prefix=/usr
  229.     #                  --extra-version=2
  230.     #                  --toolchain=hardened
  231.     #                  --libdir=/usr/lib/x86_64-linux-gnu
  232.     #                  --incdir=/usr/include/x86_64-linux-gnu
  233.     #                  --arch=amd64
  234.     #                  --enable-gpl
  235.     #                  --disable-stripping
  236.     #                  --enable-avresample
  237.     #                  --disable-filter=resample
  238.     #                  --enable-avisynth
  239.     #                  --enable-gnutls
  240.     #                  --enable-ladspa
  241.     #                  --enable-libaom
  242.     #                  --enable-libass
  243.     #                  --enable-libbluray
  244.     #                  --enable-libbs2b
  245.     #                  --enable-libcaca
  246.     #                  --enable-libcdio
  247.     #                  --enable-libcodec2
  248.     #                  --enable-libflite
  249.     #                  --enable-libfontconfig
  250.     #                  --enable-libfreetype
  251.     #                  --enable-libfribidi
  252.     #                  --enable-libgme
  253.     #                  --enable-libgsm
  254.     #                  --enable-libjack
  255.     #                  --enable-libmp3lame
  256.     #                  --enable-libmysofa
  257.     #                  --enable-libopenjpeg
  258.     #                  --enable-libopenmpt
  259.     #                  --enable-libopus
  260.     #                  --enable-libpulse
  261.     #                  --enable-librsvg
  262.     #                  --enable-librubberband
  263.     #                  --enable-libshine
  264.     #                  --enable-libsnappy
  265.     #                  --enable-libsoxr
  266.     #                  --enable-libspeex
  267.     #                  --enable-libssh
  268.     #                  --enable-libtheora
  269.     #                  --enable-libtwolame
  270.     #                  --enable-libvorbis
  271.     #                  --enable-libvpx
  272.     #                  --enable-libwavpack
  273.     #                  --enable-libwebp
  274.     #                  --enable-libx265
  275.     #                  --enable-libxml2
  276.     #                  --enable-libxvid
  277.     #                  --enable-libzmq
  278.     #                  --enable-libzvbi
  279.     #                  --enable-lv2
  280.     #                  --enable-omx
  281.     #                  --enable-openal
  282.     #                  --enable-opengl
  283.     #                  --enable-sdl2
  284.     #                  --enable-libdc1394
  285.     #                  --enable-libdrm
  286.     #                  --enable-libiec61883
  287.     #                  --enable-chromaprint
  288.     #                  --enable-frei0r
  289.     #                  --enable-libopencv
  290.     #                  --enable-libx264
  291.     #                  --enable-shared
  292.     #   libavutil      56. 14.100 / 56. 14.100
  293.     #   libavcodec     58. 18.100 / 58. 18.100
  294.     #   libavformat    58. 12.100 / 58. 12.100
  295.     #   libavdevice    58.  3.100 / 58.  3.100
  296.     #   libavfilter     7. 16.100 /  7. 16.100
  297.     #   libavresample   4.  0.  0 /  4.  0.  0
  298.     #   libswscale      5.  1.100 /  5.  1.100
  299.     #   libswresample   3.  1.100 /  3.  1.100
  300.     #   libpostproc    55.  1.100 / 55.  1.100
  301. }
  302.  
  303. BuildOBS() {
  304.     cd $source_dir
  305.     if [ -f $build_dir/bin/ffmpeg ]; then
  306.         export FFmpegPath="${build_dir}/bin/ffmpeg"
  307.     else
  308.         echo "FFmpegPath not set, using default FFmpeg"
  309.     fi
  310.  
  311.     if [ -d obs-studio ]; then
  312.         cd obs-studio
  313.         git pull
  314.     else
  315.         git clone https://github.com/obsproject/obs-studio
  316.         cd obs-studio
  317.     fi
  318.     mkdir -p build
  319.     cd build
  320.     cmake -DUNIX_STRUCTURE=1 -DCMAKE_INSTALL_PREFIX=$build_dir ..
  321.     make -j${cpus}
  322.     make install
  323. }
  324.  
  325. CleanAll() {
  326.     rm -rf $source_dir
  327. }
  328.  
  329. MakeScripts() {
  330.     cd $build_dir
  331.     mkdir -p scripts
  332.     cd scripts
  333.     echo "Creating launcher script for FFmpeg"
  334.     cat <<EOF > ffmpeg.sh
  335. #!/bin/bash
  336. export LD_LIBRARY_PATH="${build_dir}/lib":\$LD_LIBRARY_PATH
  337. cd "${build_dir}/bin"
  338. ./ffmpeg "\$@"
  339. EOF
  340.     chmod +x ffmpeg.sh
  341.  
  342.     if [ "$build_obs" ]; then
  343.         echo "Creating launcher script for OBS"
  344.         cat <<EOF > obs.sh
  345. #!/bin/bash
  346. export LD_LIBRARY_PATH="${build_dir}/lib":\$LD_LIBRARY_PATH
  347. cd "${build_dir}/bin"
  348. ./obs "\$@"
  349. EOF
  350.         chmod +x obs.sh
  351.     fi
  352. }
  353.  
  354. MakeLauncherOBS() {
  355.     cat <<EOF > ~/.local/share/applications/obs.desktop
  356. [Desktop Entry]
  357. Version=1.0
  358. Name=OBS Studio
  359. Comment=OBS Studio (NVenc enabled)
  360. Categories=Video;
  361. Exec=${build_dir}/scripts/obs.sh %U
  362. Icon=obs
  363. Terminal=false
  364. Type=Application
  365. EOF
  366.     mkdir -p ~/.icons
  367.     cp ${root_dir}/media/obs.png ~/.icons
  368.     gtk-update-icon-cache -t ~/.icons
  369. }
  370.  
  371. if [ $1 ]; then
  372.     $1
  373. else
  374.     InstallDependencies
  375.     InstallNvidiaSDK
  376.     InstallNvCodecIncludes
  377.     BuildNasm
  378.     BuildYasm
  379.     BuildX264
  380.     BuildFdkAac
  381.     BuildLame
  382.     BuildOpus
  383.     BuildVpx
  384.     BuildFFmpeg
  385.     if [ "$build_obs" ]; then
  386.         BuildOBS
  387.         MakeLauncherOBS
  388.     fi
  389.  
  390.     MakeScripts
  391. fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement