【FFmpeg】Linux系统搭建FFmpeg开发环境

1. 安装依赖库

参考文章 《Ubuntu 20.04LTS FFmpeg 环境配置》,作者Ender_William

安装环境依赖

sudo apt-get update
sudo apt-get install -y \
  autoconf \
  automake \
  build-essential \
  cmake \
  git-core \
  libass-dev \
  libfreetype6-dev \
  libsdl2-dev \
  libtool \
  libva-dev \
  libvdpau-dev \
  libvorbis-dev \
  libxcb1-dev \
  libxcb-shm0-dev \
  libxcb-xfixes0-dev \
  pkg-config \
  texinfo \
  wget \
  zlib1g-dev

安装依赖库

sudo apt-get install -y \
	nasm \
	yasm \
	libx264-dev \
	libx265-dev \
	libnuma-dev \
	libvpx-dev \
	libfdk-aac-dev \
	libopus-dev

安装 fdk-aac (选装)

参考文章 《Linux编译FFmpeg libx264 libx265 libfdk-aac libmp3lame libvpx libopus等》作者:码农小明

fdk-aac是目前评价最高的开源aac编码器,ffmpeg 默认没有集成它,我们可以手动配置,在 ffmpeg 下使用 fdk-aac。
首先获取 fdk-aac 源码:

wget -O fdk-aac-2.0.1.tar.gz https://sourceforge.net/projects/opencore-amr/files/fdk-aac/fdk-aac-2.0.1.tar.gz/download

解压后进入文件夹,执行如下代码,进行编译安装

./configure
make && make install

2. 自定义配置编译 FFmpeg

在 FFmpeg 官网下载源码(红色框,也可以直接下载编译好的(黄色框),直接去设置环境变量即可),并解压
在这里插入图片描述
进入解压后的文件夹,输入

./configure --help

可以查看编译过程的各种配置选项
关于各选项的含义可以参考文章 《FFmpeg - ./configure编译参数全部总结和整理》作者:HW140701

2.1 配置编译选项

可自定义配置,示例:
参考文章 《【秒懂音视频开发】14_编译FFmpeg》,作者:M了个J

./configure --prefix=$HOME/ProgramLibs/ffmpeg-7.1 \
--enable-shared \
--disable-static \
--enable-gpl  \
--enable-nonfree \
--enable-libfdk-aac \
--enable-libx264 \
--enable-libx265
  • --prefix 用以指定编译好的FFmpeg安装到哪个目录(改成自己的)
  • --enable-shared 生成动态库
  • --disable-static 不生成静态库
  • --enable-libfdk-aac 将 fdk-aac 内置到FFmpeg中(需要提前编译安装 fdk-aac)
  • --enable-libx264 将 x264 内置到 FFmpeg 中
  • --enable-libx265 将 x265 内置到 FFmpeg 中
  • --enable-gpl x264、x265 要求开启 GPL License
  • --enable-nonfree fdk-aac 与 GPL 不兼容,需要通过开启 nonfree 进行配置

单行版本:

./configure --prefix=$HOME/ProgramLibs/ffmpeg-7.1 --enable-shared --disable-static --enable-gpl  --enable-nonfree --enable-libfdk-aac --enable-libx264 --enable-libx265

2.2 启动编译并安装

make -j8 && make install

安装完成后,在 --prefix 中设置的安装目录下会多出如下文件夹:
在这里插入图片描述

  • bin 目录存放3个可执行文件,ffmpeg、ffprobe、ffplay
  • include 头文件目录
  • lib 库文件目录,里面除了存放库文件,还有一个 pkgconfig 目录,用于帮助程序在编译和链接阶段找到正确的库文件和头文件

此时进入 bin 文件夹,执行

./ffmpeg --version

会报错:
在这里插入图片描述
提示找不到动态链接库,这是由于我们上面配置了生成动态库,因此需要将库目录导入环境变量,详见第3步

3. 将 FFmpeg 加入环境变量

如果没有修改 --prefix 选项的默认配置,那么默认情况下 ffmpeg 已经安装到了 usr/local 下的 bin 目录 和 lib 目录,也就无需手动配置环境变量了,可以直接跳过该步骤。如果手动修改了安装目录,则按如下步骤手动配置 ffmpeg 到环境变量:

这里采用加入用户环境变量的方式,首先打开 用户目录下的隐藏文件 .bashrc

vim ~/.bashrc

在最下面插入(根据自己的安装路径做出相应更改):

export PATH="$HOME/ProgramLibs/ffmpeg-7.1/bin:$PATH"
export LD_LIBRARY_PATH=$HOME/ProgramLibs/ffmpeg-7.1/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=$HOME/ProgramLibs/ffmpeg-7.1/lib/pkgconfig:$PKG_CONFIG_PATH

然后,更新环境变量:

source ~/.bashrc

最后,任意位置下打开终端,测试是否正确加入环境变量:

ffmpeg -version

在这里插入图片描述
查看是否成功内嵌了 fdk-aac:

ffmpeg -codecs | grep aac

在这里插入图片描述

4. 搭建 FFmpeg 项目开发环境

这里建议使用 CMake 来构建开发项目,最简单的模板如下:

cmake_minimum_required(VERSION 3.5)
project(FFmpegStart VERSION 1.0)    # 设置项目名

set(CMAKE_CXX_STANDARD 11)  
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 开启线程支持, 否则 libavcodec.a 等文件会报错,找不到线程库
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")


# 查找外部库, 并获取获取编译和链接信息,在编译时,会自动将 pkg-config 命令的结果,作为编译和链接的参数
# 如果不是使用该命令,在编译时会由于没有完整的该库的链接信息,会报错
# 需要将 ffmpeg 中的 pkgconfig 路径添加到环境变量 PKG_CONFIG_PATH 中,才能被 pkg-config 命令找到
# 找到的库文件后,会将其路径存放在变量中,如${AVCODEC_LIBRARIES},后续在 target_link_libraries 中使用
find_package(PkgConfig REQUIRED)
# 确认是否找到
pkg_check_modules(AVCODEC REQUIRED libavcodec)  
pkg_check_modules(AVDEVICE REQUIRED libavdevice)
pkg_check_modules(AVFILTER REQUIRED libavfilter)
pkg_check_modules(AVFORMAT REQUIRED libavformat)
pkg_check_modules(AVUTIL REQUIRED libavutil)
pkg_check_modules(POSTPROC REQUIRED libpostproc)
pkg_check_modules(SWRESAMPLE REQUIRED libswresample)
pkg_check_modules(SWSCALE REQUIRED libswscale)


# linux 环境的头文件目录和库目录
INCLUDE_DIRECTORIES("/usr/include")
LINK_DIRECTORIES("/usr/lib")

# ffmpeg 的头文件目录和库目录
# 没有修改 --prefix 选项的话,默认在 /usr/local/include 和 /usr/local/lib
INCLUDE_DIRECTORIES("/home/eason/ProgramLibs/ffmpeg-7.1/include")
LINK_DIRECTORIES("/home/eason/ProgramLibs/ffmpeg-7.1/lib")


add_executable(${PROJECT_NAME} main.cpp)

# 链接ffmpeg库文件
target_link_libraries(${PROJECT_NAME} 
                    ${AVCODEC_LIBRARIES} 
                    ${AVDEVICE_LIBRARIES}
                    ${AVFILTER_LIBRARIES}
                    ${AVFORMAT_LIBRARIES} 
                    ${AVUTIL_LIBRARIES}
                    ${POSTPROC_LIBRARIES}
                    ${SWRESAMPLE_LIBRARIES}
                    ${SWSCALE_LIBRARIES}  
)

main.cpp 中测试能否调用 FFmpeg 库函数:

#include <iostream>
extern "C"
{
#include <libavutil/avutil.h>
}

int main(int argc, char const *argv[])
{
    std::cout << av_version_info() << std::endl;
    return 0;
}

运行成功:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值