如何从源代码在 Linux 上安装 FFmpeg

如何从源代码在 Linux 上安装 FFmpeg

大概是在 2006 年,我第一次听说了 FFmpeg,它的功能令我惊叹不已。FFmpeg 是转码和视频处理(从修剪到刻录字幕、添加水印等)的首选解决方案。自 FFmpeg 首次推出以来,它取得了长足的进步,已成为桌面应用程序、网络,尤其是后台多媒体工作量的行业领导者。

在本文中,我们将讨论:为什么需要定制 FFmpeg 以满足您的要求? 以及如何从源代码编译 FFmpeg 以及在不同的 Linux 发行版(从 Ubuntu 到基于 Redhat 的系统)上进行视频处理所需的各种基本库和代码。

问题

直接从 Linux 发行版的默认软件源安装 FFmpeg 似乎不费吹灰之力,但这种方法有很多潜在的缺点。首先,这些软件源可能无法提供最新版本的 FFmpeg 和必要的编解码器或库,可能会让用户面临安全风险,无法使用最新功能。此外,这些默认编译包可能会带有不必要的编解码器和库,而许多用户可能从未使用过这些编解码器和库。

但挑战还不止于此;在当今横跨 ARM 和 x86_64 架构的多样化设备生态系统中,资源库中的 “一刀切 “构建可能无法针对具有特定指令集的特定设备进行优化。对于需要实时处理的多媒体任务来说,这一点尤为重要,因为您希望充分利用现有的硬件。

此外,对于年轻的开发者或 Linux 领域的新手来说,根据自己的要求定制 FFmpeg 版本可能是一种令人生畏的经历。海量的选项、配置和依赖关系可能会让他们不知所措,导致他们选择次优的通用构建,而不是挖掘 FFmpeg 的真正潜力。

为什么要从源代码编译?

从新手到专家,要克服这些问题,就必须有全面的指南和资源来弥补知识差距,让下一代开发人员能够自信地定制自己的多媒体工具。以下是使用源代码作为起点的显著优势。

  • 自定义: 通过从源代码编译,您可以选择自己想要的确切功能和编解码器,从而根据自己的需要构建个性化的 FFmpeg。
  • 占用空间更小: 当您只包含所需的组件时,编译的结果往往更精简,所需的磁盘空间也更小。
  • 获取最新代码: 官方渠道可能并不总是拥有最新版本的 FFmpeg。从源代码编译可确保您使用的是最新的代码库。
  • 性能优化: 从源代码编译可针对您的机器架构和指令集进行某些优化,从而提高性能。
  • 更多学习机会: 从源代码编译软件可加深对软件及其依赖关系的理解。

安装依赖项

在我们开始安装过程之前,必须使用必要的依赖项设置我们的系统。

在Ubuntu上:

sudo apt update sudo apt install -y build - Essential yasm cmake libtool libc6 libc6 -dev unzip wget

在基于 RedHat 的发行版上:

sudo yum groupinstall "Development Tools" sudo yum install -y yasm cmake libtool unzip wget

安装依赖项和代码

建立好构建环境后,下一个关键步骤就是安装 FFmpeg 所依赖的各种编解码器和库,或您希望用于特定多媒体任务的编解码器和库。请记住,从源代码构建的主要好处之一是可以自定义 FFmpeg 安装,确保其精简到符合您的需求,在这里您可以随意选择甚至添加您希望使用的编解码器或库。

在最后的脚本中,我们提供了一份全面的依赖项和库列表,确保你能随心所欲地使用各种多媒体功能。

安装 FFmpeg

您可以从 FFmpeg 官方网站获取最新的源代码或使用git

git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg cd ffmpeg

配置

这一步至关重要。通过 ./configure 脚本,您可以选择要包含的功能和编解码器。对于基本设置,您可以运行:

./configure \ --prefix="$USR_LOCAL_PREFIX" \ --disable-static --enable-shared \ --extra-cflags="-I$USR_LOCAL_PREFIX/include $NVIDIA_CFLAGS" \ --extra-ldflags="-L$USR_LOCAL_PREFIX/lib $NVIDIA_LDFLAGS" \ --extra-libs='-lpthread -lm' \ --bindir="$USR_LOCAL_PREFIX/bin" \ --enable-gpl --enable-libaom --enable-libass \ --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame \ --enable-libopus --enable-libvorbis --enable-libvpx \ --enable-libx264 --enable-libx265 --enable-nonfree \ --enable-openssl

不过,要进行更个性化的设置,可以使用 --enable-codec, --disable-codec, --enable-libx264 等标志。查看 ./configure --help 以获取完整的选项列表。

编译安装

配置完成后,在此处编译并安装 FFmpeg:

make -j$(nproc) sudo make install

这将使用所有 CPU 内核进行编译(-j$(nproc)),然后安装软件。

确认

要验证您的 FFmpeg 安装:

ffmpeg -version

总结与神奇脚本:

现在,您应该对如何定制 FFmpeg 有了基本的了解。如果是这样,这就是我们的目标。为了简化这里提到的每一个步骤,您只需运行一个脚本,它就会处理整个过程。

#!/bin/bash
set -e # Exit on any error

if [ "$EUID" -ne 0 ]; then
    echo "This script must be run as root."
    exit 1
fi

USR_LOCAL_PREFIX="/usr/local"
HOME_DIR=$HOME

DOWNLOAD="wget"
SRC_DIR=$HOME_DIR/sources
CPUS=$(nproc)
LOG_FILE="$HOME_DIR/install.log"
LOCAL_TMP=$HOME_DIR/sources/local-tmp
mkdir -p $LOCAL_TMP

if [[ "$1" != "--stdout" ]]; then
    exec >>"$LOG_FILE" 2>&1
fi

OPUS_VER="opus-1.4"
LIBAOM_VER="v3.7.0"
LIBOGG_VER="libogg-1.3.5"
LIBVORBIS_VER="libvorbis-1.3.7"
LIBASS_URL=$(curl -s "https://api.github.com/repos/libass/libass/releases/latest" | awk -F'"' '/browser_download_url.*.tar.gz"/{print $4}')

# Create source directory
mkdir -p $SRC_DIR
pushd $SRC_DIR

# Helper functionS to check installation status
check_installation() {
    if [ -f "$1" ]; then
        echo "Success : $2 Installed"
    else
        echo "Error : $2 Installation Failed"
        echo "Exiting script due to installation failure."
        exit 1
    fi
}

# Helper function to check installation based on exit code
check_exit_code() {
    if [ $1 -eq 0 ]; then
        echo "Success : $2 Installed"
    else
        echo "Error : $2 Installation Failed (Exit Code: $1)"
        echo "Exiting script due to installation failure."
        exit 1
    fi
}
# Utility function to push a wildcard
pushdw() {
    pushd "$(find $HOME_DIR -type d -name "$1" | head -n 1)"
}

install_utils() {
    if [ -n "$(command -v dnf)" ]; then
        package_manager="dnf"
    elif [ -n "$(command -v apt-get)" ]; then
        package_manager="apt-get"
    else
        echo "Neither DNF nor APT package manager found. Exiting."
        exit 1
    fi

    echo "Updating packages..."
    $package_manager -y update

    echo "Installing packages..."
    if [ "$package_manager" = "dnf" ]; then
        $package_manager -y groupinstall "Development Tools"
        $package_manager install -y git autoconf openssl-devel cmake3 htop iotop yasm nasm jq freetype-devel fribidi-devel harfbuzz-devel fontconfig-devel bzip2-devel
    elif [ "$package_manager" = "apt-get" ]; then
        $package_manager install -y git autoconf libtool libssl-dev cmake htop iotop yasm nasm jq libfreetype6-dev libfribidi-dev libharfbuzz-dev libfontconfig1-dev libbz2-dev
    fi

    echo "Success: Updates and packages installed."

    echo "$USR_LOCAL_PREFIX/lib" | sudo tee /etc/ld.so.conf.d/usr-local-lib.conf
    echo "$USR_LOCAL_PREFIX/lib64" | sudo tee -a /etc/ld.so.conf.d/usr-local-lib.conf
    ldconfig
}

install_ffmpeg_prereqs() {
    # Install LIBAOM (AV1 Codec Library)
    mkdir -p libaom &&
        pushd libaom &&
        git -c advice.detachedHead=false clone --depth 1 --branch $LIBAOM_VER https://aomedia.googlesource.com/aom &&
        cmake \
            -DBUILD_SHARED_LIBS=ON \
            -DENABLE_DOCS=OFF \
            -DCMAKE_INSTALL_LIBDIR=lib \
            -DCMAKE_INSTALL_PREFIX:PATH=$USR_LOCAL_PREFIX ./aom &&
        make -j $CPUS &&
        make install
    popd
    check_installation "$USR_LOCAL_PREFIX/lib/libaom.so" "LIBAOM"

    # Install LIBASS (portable subtitle renderer)
    $DOWNLOAD ${LIBASS_URL} &&
        tar -zxf libass*.tar.gz &&
        pushdw "libass*" &&
        ./configure --prefix="$USR_LOCAL_PREFIX" &&
        make -j $CPUS &&
        make install
    popd
    check_installation "$USR_LOCAL_PREFIX/lib/libass.so" "LIBASS"

    # Install libmp3lame (MP3 Encoder)
    curl -L https://sourceforge.net/projects/lame/files/latest/download -o lame.tar.gz &&
        tar xzvf lame.tar.gz &&
        pushdw "lame*" &&
        ./configure --prefix="$USR_LOCAL_PREFIX" \
            --bindir="/usr/bin" \
            --enable-nasm &&
        make -j $CPUS &&
        make install
    popd
    check_installation "$USR_LOCAL_PREFIX/lib/libmp3lame.so" "libmp3lame"

    # Install opus video codec
    $DOWNLOAD https://ftp.osuosl.org/pub/xiph/releases/opus/$OPUS_VER.tar.gz &&
        tar xzvf $OPUS_VER.tar.gz &&
        pushd $OPUS_VER &&
        ./configure --prefix="$USR_LOCAL_PREFIX" &&
        make -j $CPUS &&
        make install
    popd
    check_installation "$USR_LOCAL_PREFIX/lib/libopus.so" "opus"

    # Install libogg (OGG Container format)
    $DOWNLOAD http://downloads.xiph.org/releases/ogg/$LIBOGG_VER.tar.gz &&
        tar xzvf $LIBOGG_VER.tar.gz &&
        pushd $LIBOGG_VER &&
        ./configure --prefix="$USR_LOCAL_PREFIX" &&
        make -j $CPUS &&
        make install
    popd
    check_installation "$USR_LOCAL_PREFIX/lib/libogg.so" "libogg"
    ldconfig

    # Install libvorbis (vorbis audio codec)
    $DOWNLOAD http://downloads.xiph.org/releases/vorbis/$LIBVORBIS_VER.tar.gz &&
        tar xzvf $LIBVORBIS_VER.tar.gz &&
        pushd $LIBVORBIS_VER &&
        ./configure --prefix="$USR_LOCAL_PREFIX" \
            --with-ogg="$USR_LOCAL_PREFIX" &&
        make -j $CPUS &&
        make install
    popd
    check_installation "$USR_LOCAL_PREFIX/lib/libvorbis.so" "libvorbis"

    # Install FDKAAC (AAC audio codec)
    git clone --depth 1 https://github.com/mstorsjo/fdk-aac &&
        pushd fdk-aac &&
        autoreconf -fiv &&
        ./configure --prefix="$USR_LOCAL_PREFIX" &&
        make -j $CPUS &&
        make install
    popd
    check_installation "$USR_LOCAL_PREFIX/lib/libfdk-aac.so" "FDKAAC"

    # Install WEBM
    git clone --depth 1 https://chromium.googlesource.com/webm/libvpx.git &&
        pushd libvpx &&
        ./configure --prefix="$USR_LOCAL_PREFIX" \
            --disable-static --enable-shared \
            --disable-examples --disable-unit-tests \
            --enable-vp9-highbitdepth --as=yasm &&
        make -j $CPUS &&
        make install
    popd
    check_installation "$USR_LOCAL_PREFIX/lib/libvpx.so" "WEBM"

    # Install X264 (H.264 Codec)
    git clone --depth 1 https://code.videolan.org/videolan/x264.git &&
        pushd x264 &&
        PKG_CONFIG_PATH="$USR_LOCAL_PREFIX/lib/pkgconfig" ./configure \
            --enable-shared --disable-static \
            --prefix="$USR_LOCAL_PREFIX" \
            --bindir="/usr/bin" &&
        make -j $CPUS &&
        make install
    popd
    check_installation "$USR_LOCAL_PREFIX/lib/libx264.so" "X264"

    # Install X265 (H.265 Codec)
    git clone https://bitbucket.org/multicoreware/x265_git.git &&
        pushd x265_git/build/linux &&
        cmake -G "Unix Makefiles" \
            -DCMAKE_INSTALL_PREFIX="$USR_LOCAL_PREFIX" \
            -DBUILD_SHARED_LIBS=ON \
            ../../source &&
        make -j $CPUS &&
        make install
    popd
    check_installation "$USR_LOCAL_PREFIX/lib/libx265.so" "X265"
}

install_ffmpeg() {
    # Install FFMPEG (AV1 Codec Library)
    $DOWNLOAD https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 &&
        tar -jxf ffmpeg-snapshot.tar.bz2 &&
        pushd ffmpeg &&
        PKG_CONFIG_PATH="$USR_LOCAL_PREFIX/lib/pkgconfig:/usr/lib64/pkgconfig:/usr/share/pkgconfig:/usr/lib/pkgconfig:$USR_LOCAL_PREFIX/lib/pkgconfig" \
            ./configure \
            --prefix="$USR_LOCAL_PREFIX" \
            --disable-static --enable-shared \
            --extra-cflags="-I$USR_LOCAL_PREFIX/include" \
            --extra-ldflags="-L$USR_LOCAL_PREFIX/lib" \
            --extra-libs='-lpthread -lm' \
            --bindir="$USR_LOCAL_PREFIX/bin" \
            --enable-gpl \
            --enable-libaom \
            --enable-libass \
            --enable-libfdk-aac \
            --enable-libfreetype \
            --enable-libmp3lame \
            --enable-libopus \
            --enable-libvorbis \
            --enable-libvpx \
            --enable-libx264 \
            --enable-libx265 \
            --enable-nonfree \
            --enable-openssl &&
        make -j $CPUS &&
        make install
    popd
    check_installation "$USR_LOCAL_PREFIX/bin/ffmpeg" "ffmpeg"
    check_installation "$USR_LOCAL_PREFIX/bin/ffprobe" "ffprobe"
    ldconfig
}

# Execute Functions
install_utils
source $HOME_DIR/.bashrc
install_ffmpeg_prereqs
install_ffmpeg
popd
rm -fr $SRC_DIR

结论

既然我们已经完成了整个过程,我很好奇:您打算在哪里使用您定制的 FFmpeg?您是在做一个创新的多媒体项目,还是在开发一个网络应用程序,或者只是在尝试个人使用的视频处理?从大型视频平台到业余爱好者项目,FFmpeg 的多功能性在众多应用中都有出色表现。请在下面的评论中分享您的计划或当前的 FFmpeg 项目。让我们互相学习,为这个强大的工具发现更多独特的使用案例。请记住,多媒体的世界是广阔的,有了 FFmpeg,就有了无限可能。

作者:Mirza Bilal
原文:https://mirzabilal.com/how-to-install-ffmpeg-on-linux-from-source

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论