Ubuntu 下 FFmpeg 编译与调试

写在前面

因为项目需要需要了解 FFmpeg 的编解码细节。一开始是想在 Visual Studio 上进行的。但对 FFmpeg 始终会报 “无法打开源文件” libavutil/avconfig.h” 的错误”,几次尝试,还是没法解决,还是转头在 Linux 环境下进行尝试。毕竟 Windows 下的一些编译环境太麻烦了,不知道是哪里的错误。网络上的参考资料比较多,但也没有很顺利的。所以将自己的过程记录下来,以飨读者。

初始环境

  1. 系统环境:Vmware 15 下的 Mint 18.0(Ubuntu 16.04)

    尝试过使用 Ubuntu 20,会遇到找不到 guint 的问题,于是降级到 ubuntu16. 使用 mint 仅使因为其资源占用低,对虚拟机较为友好。

  2. 换源、更新软件到最新。

  3. 安装 Visual Studio Code 或 Gedit 等文本编辑软件。

源码安装 FFmpeg

  1. FFmpeg 是一个开源工具。因此,可以从源代码手动构建这个程序。一般情况下可以从源安装。仅因需要测试 bug 时,才推荐使用此方法。查看官方的 Ubuntu FFmpeg 编译指南

  2. 编译需要的依赖环境

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    sudo apt-get update -qq && sudo apt-get -y install \
    autoconf \
    automake \
    build-essential \
    cmake \
    git-core \
    libass-dev \
    libfreetype6-dev \
    libgnutls28-dev \
    libsdl2-dev \
    libtool \
    libva-dev \
    libvdpau-dev \
    libvorbis-dev \
    libxcb1-dev \
    libxcb-shm0-dev \
    libxcb-xfixes0-dev \
    meson \
    ninja-build \
    pkg-config \
    texinfo \
    wget \
    yasm \
    zlib1g-dev
  3. 现在,准备一个专用目录来存储源代码和编译后的二进制文件。

    1
    mkdir -pv ~/ffmpeg_source ~/bin
  4. 安装第三方库。FFmpeg 官网提供了源码安装选项,不过由于在本机上进行调试,源安装也够用了。

    1
    2
    3
    4
    5
    sudo apt install -y nasm  //NASM:一些库所依赖的汇编程序
    sudo apt install -y libx264-dev libx265-dev libnuma-dev libvpx-dev //H.264, H.265视频编码器,VP8/VP9 视频编解码器
    sudo apt install -y libfdk-aac-dev libmp3lame-dev libopus-dev //ACC、MP3音频编码器,Opus音频编解码器
    // sudo apt install -y libaom-dev //AV1视频编解码器,不稳定,后面编译不通过,放弃。
    sudo apt install -y libunistring-dev // 可能会遇到使用pkg-config时找不到gnutls的错误。要解决这个问题,系统中必须存在一个特定的包。您可以安装相关的包,并通过命令修复这个错误
  5. 现在可以开始从源代码构建 FFmpeg 了。通过执行以下命令获取源代码:

    1
    2
    3
    cd ~/ffmpeg_source
    wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2
    tar -xvf ffmpeg-snapshot.tar.bz2
  6. 进入目录,更新 PATH 环境变量并运行配置脚本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    cd ffmpeg
    PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
    --prefix="$HOME/ffmpeg_build" \
    --pkg-config-flags="--static" \
    --extra-cflags="-I$HOME/ffmpeg_build/include" \
    --extra-ldflags="-L$HOME/ffmpeg_build/lib" \
    --extra-libs="-lpthread -lm" \
    --bindir="$HOME/bin" \
    --enable-gpl \
    --enable-gnutls \
    //--enable-libaom \
    --enable-libass \
    --enable-libfdk-aac \
    --enable-libfreetype \
    --enable-libmp3lame \
    --enable-libopus \
    --enable-libsvtav1 \
    --enable-libdav1d \
    --enable-libvorbis \
    --enable-libvpx \
    --enable-libx264 \
    --enable-libx265 \
    --enable-nonfree
  7. 编译、安装 FFmpeg

    1
    2
    3
    PATH="$HOME/bin:$PATH" make -j4
    sudo make install
    hash -r
  8. 重新加载环境变量,并查看 FFmpeg,及其所支持的编解码器。至此,FFmpeg 安装成功。

    1
    2
    3
    4
    source ~/.profile
    ffmpeg -version
    ffmpeg -encoders
    ffmpeg -decoders
  9. 但是,安装好的 FFmpeg 可以正常使用,但不支持调试。需要在 FFmpeg 目录下,重新 config

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    cd ffmpeg
    PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
    --prefix="$HOME/ffmpeg_build" \
    --pkg-config-flags="--static" \
    --extra-cflags="-I$HOME/ffmpeg_build/include" \
    --extra-ldflags="-L$HOME/ffmpeg_build/lib" \
    --bindir="$HOME/bin" \
    --enable-gpl \
    --enable-libass \
    --enable-libfdk-aac \
    --enable-libfreetype \
    --enable-libmp3lame \
    --enable-libopus \
    --enable-libtheora \
    --enable-libvorbis \
    --enable-libvpx \
    --enable-libx264 \
    --enable-libx265 \
    --enable-nonfree \
    --enable-pthreads \
    --enable-debug=3 \
    --disable-optimizations \
    --disable-asm \
    --disable-stripping

安装 JDK

  1. Eclipse 需要 JDK 环境,因此要先安装 JDK。但现在 Ubuntu 一般都自带 OpenJDK,所以这一部分可以先跳过,如果无法使用再安装。

  2. 首先,查看系统位数。然后准备下载对应位数的 JDK。

    1
    getconf LONG_BIT
  3. 访问 JDK 的官方下载页面,选择 “Linux x64 Compressed Archive”,同意协议,下载(获得下载链接)。

  4. 下载到 Home 并创建 Java 目录,解压

    1
    2
    3
    axel -n8 https://download.oracle.com/otn-pub/java/jdk/15.0.2+7/0d1cfde4252546c6931946de8db48ee2/jdk-15.0.2_linux-x64_bin.tar.gz?AuthParam=1612765351_4ae3e59c9574a27f8e8903853c439d1e	  
    mkdir ~/Java
    tar -zxvf jdk-15.0.2_linux-x64_bin.tar.gz -C ~/Java/
  5. 设置环境变量

    1
    sudo gedit /etc/profile
    1
    2
    3
    4
    export JAVA_HOME=/home/luov/Java/jdk-15.0.2/ 
    export JRE_HOME=$JAVA_HOME/jre
    export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
    export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
  6. 使环境变量生效

    1
    source /etc/profile
  7. 查看系统目前的环境

    1
    source /etc/profile
  8. 查看系统中已有的 JDK 版本

    1
    2
    3
    sudo update-alternatives --config java
    sudo update-alternatives --config javac
    sudo update-alternatives --config javaws
  9. 设置系统默认 JDK

    1
    2
    sudo update-alternatives --install /usr/bin/java java /home/xxx/Java/jdk1.8.0_131/bin/java 2000
    sudo update-alternatives --install /usr/bin/javac javac /home/xxx/Java/jdk1.8.0_131/bin/javac 2000
  10. 查看 java 版本,如果查看到与安装的一致,则说明安装成功

    1
    java -version

安装 Eclipse

  1. 下载并安装 Eclipse
    访问 Eclipse 的官方下载页面,选择 “Eclipse IDE for C/C++ Developers”,Linux 版本下载,点击进去,下载(获得下载链接)。


    1
    2
    axel -n 8 https://ftp.yz.yamagata-u.ac.jp/pub/eclipse//technology/epp/downloads/release/2020-12/R/eclipse-cpp-2020-12-R-linux-gtk-x86_64.tar.gz
    tar -zxvf eclipse-cpp-2020-12-R-linux-gtk-x86_64.tar.gz && mv eclipse ~/
  2. Eclipse 解压之后直接使用,开启 Eclipse

    1
    2
    cd ~/eclipse
    ./eclipse
  3. 配置 Eclipse(可跳过)
    因为安装的是 Eclipse for C/C++,所以 CDT 以及 CPP 运行库已经默认安装好了,无需再次配置,这一步可以跳过。
    在 Eclipse 菜单中选择 help → install new software,点击 “Add…” 按钮,添加下面的软件源地址,并命名为 CDT。

    可以在官方网站上获得对应的版本链接

    选好后确定,即可看到要求我们选择要安装的软件。其实安装 CDT Main Features 和 CDT Optional Features 中的 GCC 就可以了,一些选项还依赖于其它可能没有安装好的库,装了也不会起作用。不过在这里浪费时间没必要,都选了就得了~
    然后选择 “Next → Next → Finsh” 就开始安装了,安装结束后,会弹出如下要求重启 Eclipse 提示框。点击 Yes 重启 Eclipse,这样就安装成功了。重启之后可以新建 C++ Project 了。
    另外需要注意的是我们在编译 C++ 的时候要注意配置编译器的路径和 C++ 运行库的路径,具体方法是打开 windows→preference->C/C++→Environment

    1
    2
    C_INCLUDE_PATH=/usr/include
    C_PLUS_INCLUDE_PATH=/usr/include/c++/4.6.3

    其中,/usr/include/c++/4.6.3 为 C++ 编译器的所在路径。

建立 FFMPEG 工程

  1. 建立已有工程
    选择 New-> Makefile project from existing code,在弹出对话框中,选择 FFmpeg 代码目录,设定工程名,FFmpegTest,选择 Liuux GCC 作为编译器,确定即可。

  2. 编译工程,
    右击工程名称,点击 Build project,完成编译过程。

  3. 运行程序。

    为程序添加参数:右击工程名称,Run As →C/C+ Application(双击)→ Debug Configerations 中选择 Arguments 选项卡,选择 ffmpeg,在其中添加 -i 01.mkv 01.mp4,可以实现格式转换。
    将 01.mkv 文件拷贝到到 FFmpeg 目录。
    运行程序,可以实现文件格式转换。

  4. 调试程序
    类似地,为程序添加参数:右击工程名称,Debug As →C/C+ Application(双击)→ Debug Configerations 中选择 Arguments 选项卡,选择 ffmpeg_g,在其中添加 -i 01.mkv 01.mp4
    点击 Debug 按钮,即可成功进行逐步调试。

参考
  1. Install and Use FFmpeg on Ubuntu 20.04
  2. FFmpeg 之 Linux 下编译与调试
  3. FFMPEG(1):Linux 下 FFMPEG 编译与调试(Eclipse 平台)