大概是在 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 举报,一经查实,本站将立刻删除。