美文网首页
ubuntu编译安装ffmpeg

ubuntu编译安装ffmpeg

作者: 知成 | 来源:发表于2023-01-11 20:25 被阅读0次

当前所有的步骤都将先在docker 中进行,在docker中成功后会迁移到,主机环境。目的是为了保证主机环境的干净;


(编译脚本参考的git链接)[https://github.com/rq973017553/MyFFmpeg]


docker 拉取ubuntu20.04 镜像

docker pull ubuntu:20.04

启动ubuntu20.04 的容器

docker run -itd --name eif --network host ubuntu:20.04
# -i 以交互模式运行容器,通常与 -t 同时使用;
# -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
# -d 显示容器id号
# --name 自己命名的容器名称
# --network host 使容器与宿主机公用同一个网络
# 容器引用的是ubuntu:20.04的镜像
#docker start eif 如果没有-it,在run后就会退出显示Exist(0)

进入容器

docker exec -it idxx bash

说明

  • 正式开始编译之前,想先从总体上描述以下ffmpeg 的编译流程。ffmpeg 的功能模块很多,有些我们需要,有些不需要。根据自己的需求对功能模块进行筛选。ffmpeg中有一个编译配置脚本configure文件,此脚本中对配置选项作了描述。此处特别声明,有些功能模块即便打开也不一定可以编译成功,因为被打开的模块可能依赖一些外部的库。比如"—enable-libx264"模块依赖"libx264","—enable-speex"依赖"libspeex"库。也就是说在开启—enable-libx264或—enable-speex之前,需要先提前安装libx264,libspeex库(此处特别说明是因为,很多博主安装时只讲方法或流程,并不说明为什么,也许是觉得太简单了。但是我觉得对ffmpeg没有任何编译经验的同学来说,不理解为什么,很难举一反三)。
  • 安装ffmpeg 依赖库的方式粗略的分有两种,一种直接安装例如用apt-get,apt aptitude,都可以安装,也可以进行编译安装(下载源码自己编译)
  • ffmpeg 编译为动态库时,所依赖的库需要是开启-fpic的

与原始的脚本不同之处

  • 对x264,x265拷贝的深度做了限制,减少代码的拷贝量,减少拷贝时间
  • 多添加了speex,gsm两个模块的编译脚本

容器初始环境配置

sudo apt-get update
sudo apt-get upgrade

sudo apt-get install git
sudo apt-get install vim
sudo apt-get install make
sudo apt-get install cmake
# sudo apt-get install autoconf //automake libtool 生成configure的工具

# 解决ffplay播放视频报错:Could not initialize SDL - No available video device问题
sudo apt-get install libx11-dev
sudo apt-get install xorg-dev
#
# 解决ffplay播放音频报错:Could not initialize SDL - Audio target 'pulse' not available,以及No such audio device问题
sudo apt-get install libpulse-dev
# 以下这两个我只安装了libasound2也是可以的,如果不行就两个都安装
sudo apt-get install libasound2
脚本的参考链接


脚本说明

整体脚本比较完整,我只做简单的说明

## 文件依赖结构
|-config.sh
|-tools.sh
|-build.sh
| |-build_pkg_config.sh
| |-build_libfdk_aac.sh
| |-build_libmp3lame.sh
| |-build_libopus.sh
| |-build_sdl2.sh
| |-build_yasm.sh
| |-build_libvpx.sh
| |-build_libx264.sh
| |-build_libx265.sh
| |-build_ffmpeg.sh

config.sh

#! /bin/bash

# enableShared=[treu/false]
enableShared=true # 是否开启动态库(全局配置)

此脚本是为了设置全局变量,是否要编译成动态库

tools.sh

#! /bin/bash

SYSTEM=`uname` # 用于显示操作系统名称
MY_DIR=`pwd` # 获取当前目录的绝对路径
PREFIX=${MY_DIR}/output # 输出目录,用于存放生成好的二进制文件
cpu_num=`cat /proc/stat | grep cpu[0-9] -c` # 用于获取当前系统的cpu数量
CLONE_GIT_COMMAND="git clone " # git clone

build.sh

#########################################################################
# sudo apt-get update // 从服务器获取软件列表,并在本地保存为文件
# sudo apt-get upgrade // 本地安装软件与本地软件列表对比,如本地安装版本低,会提示更新
#
# sudo apt-get install git // 下载源码
# sudo apt-get install vim // 编辑器
# sudo apt-get install make // 编译工具
# sudo apt-get install cmake // x265所需要的编译工具
# apt-get install autoconf automake libtool //生成configure的工具
#
# 解决ffplay播放视频报错:Could not initialize SDL - No available video device问题
# sudo apt-get install libx11-dev
# sudo apt-get install xorg-dev
#
# 解决ffplay播放音频报错:Could not initialize SDL - Audio target 'pulse' not available,以及No such audio device问题
# sudo apt-get install libpulse-dev
# 以下这两个我只安装了libasound2也是可以的,如果不行就两个都安装
# sudo apt-get install libasound2
# sudo apt-get install libasound2-dev
#########################################################################

#! /bin/bash

set -e

source ./tools.sh
source ./config.sh

cd $MY_DIR

startTime=`date +%Y%m%d-%H:%M:%S`
startTime_s=`date +%s`

if [ -e "output" ]; then
rm -rf output
fi
mkdir output
mkdir output/bin

. build_pkg_config.sh
. build_libfdk_aac.sh
. build_libmp3lame.sh
. build_libopus.sh
. build_sdl2.sh
. build_yasm.sh
. build_libgsm.sh
. build_libspeex.sh
. build_libvpx.sh
. build_libx264.sh
. build_libx265.sh
. build_ffmpeg.sh

endTime=`date +%Y%m%d-%H:%M:%S`
endTime_s=`date +%s`

sumTime=$[ $endTime_s - $startTime_s ]

echo "Total Compilation Time $sumTime seconds"

echo "==========================test ffmpeg!=========================="

if [[ "$enableShared" == true  ]]; then
 export LD_LIBRARY_PATH=$MY_DIR/output/lib/
 cd $MY_DIR/output/bin
 ./ffmpeg -version
else
 cd $MY_DIR/output/bin
 ./ffmpeg -version
fi

编译脚本,注释里面的内容,是编译环境需要的工。具根据自己的环境的实际情况,查漏补缺。依次调用其他的编译脚本:初始化变量、编译对应的模块。(编译的时候可以根据自己的编译进度分别编译对应的模块,可以先注释其他模块的编译脚本,如果存在相互依赖则必须先编译被依赖的模块)

build_libx264.sh

#! /bin/bash
# 编码H.264视频,ffmpeg通过编译参数--enable-gpl --enable-libx264来开启

set -e

X264="x264"
X264_GIT_URL="--depth 1 -b master https://code.videolan.org/videolan/x264.git" #与原始脚本比较此处仅clone需要用的分支
X264_CONFIGURE_COMMAND="./configure
--prefix=$PREFIX
--disable-asm
"

if [[ "$enableShared" == true  ]]; then
 X264_CONFIGURE_COMMAND=$X264_CONFIGURE_COMMAND"
 --enable-shared
 "
else
 X264_CONFIGURE_COMMAND=$X264_CONFIGURE_COMMAND"
 --enable-static
 "
fi

echo $CLONE_GIT_COMMAND$X264_GIT_URL

if [ ! -e $X264 ]; then
 echo "==========================clone x264=========================="
 $CLONE_GIT_COMMAND$X264_GIT_URL
fi

echo "==========================build x264=========================="
if [ -e $X264 ]; then
 cd $X264
 $X264_CONFIGURE_COMMAND
 make clean
 make -j${cpu_num}
 make install
fi
cd $MY_DIR
echo "==========================x264 build successful!=========================="

build_libx265.sh

#! /bin/bash
# 编码H.265视频,ffmpeg通过编译参数--enable-gpl --enable-libx265来开启

set -e

PATH=$PATH:$PREFIX/bin

X265="x265_git"
# 编译之坑:如果编译ffmpeg需要x265.pc但是通过次脚本无法生成,记得将X265_GIT_URL替换成: master https://bitbucket.org/multicoreware/x265_git.git
X265_GIT_URL="--depth 1 -b master https://bitbucket.org/multicoreware/x265_git.git"  #与原始脚本比较此处仅clone需要用的分支

echo $CLONE_GIT_COMMAND$X265_GIT_URL

if [ ! -e $X265 ]; then
 echo "==========================clone x265=========================="
 $CLONE_GIT_COMMAND$X265_GIT_URL
fi

echo "==========================build x265=========================="
if [ -e $X265 ]; then
 cd $X265/build/linux
 if [[ "$enableShared" == true  ]]; then
  switchStatus=on
 else
  switchStatus=off
 fi
 cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=$PREFIX -DENABLE_SHARED=$switchStatus ../../source
 make -j${cpu_num}
 make install
fi
cd $MY_DIR
echo "==========================x265 build successful!=========================="

build_libspeex.sh

#! /bin/bash
# 编译speex和ffmpeg的libspeex库需要用到的libspeex开源代码

set -e
SPEEX="speex"
SPEEX_DOWNLOAD_URL="https://github.com/xiph/speex/archive/refs/tags/"
SPEEX_VERSION="1.2.1"
SPEEX_CONFIGURE_COMMAND="./configure --prefix=$PREFIX --disable-oggtest"

echo "===========================download speex========================="
if [ ! -e $SPEEX"-Speex-"$SPEEX_VERSION".tar.gz" ]; then
 if [[ $SYSTEM == "Darwin" ]]; then
  curl $SPEEX_DOWNLOAD_URL"Speex-"$SPEEX_VERSION".tar.gz" > $SPEEX"-"$SPEEX_VERSION".tar.gz"
 else
  wget $SPEEX_DOWNLOAD_URL"Speex-"$SPEEX_VERSION".tar.gz" -O $SPEEX"-"$SPEEX_VERSION".tar.gz"
 fi
fi

echo "===========================unzip speex============================="
if [ -e $SPEEX"-"$SPEEX_VERSION".tar.gz" ]; then
 if [ -e $SPEEX"-"$SPEEX_VERSION ]; then
  rm -rf $SPEEX"-"$SPEEX_VERSION
 fi
 tar zxvf $SPEEX"-"$SPEEX_VERSION".tar.gz"
fi

echo "==========================build speex=========================="
if [ -e $SPEEX"-Speex-"$SPEEX_VERSION ]; then
 cd $SPEEX"-Speex-"$SPEEX_VERSION
 if [ ! -e "configure" ]; then
 echo "=========================generate configure==================="
  ./autogen.sh
 fi
 $SPEEX_CONFIGURE_COMMAND
#  make clean
 make -j${cpu_num}
 make install
fi
cd $MY_DIR
echo "==========================speex build successful!=========================="

# https://github.com/xiph/speex/archive/refs/tags/Speex-1.2.1.tar.gz

build_libgsm.sh

#! /bin/bash
# 编译gsm和ffmpeg的libgsm库需要用到的libgsm开源代码

set -e
GSM="libgsm"
GSM_GIT_URL="https://github.com/quantum6/libgsm.git"
echo $CLONE_GIT_COMMAND$GSM_GIT_URL

if [ ! -e $GSM ];then
 echo "==========================clone gsm==================="
 $CLONE_GIT_COMMAND$GSM_GIT_URL
fi

echo "===========================build gsm==================="
if [ -e $GSM ];then
cd $GSM
make clean
make -j${cpu_num}
make install
fi

if [ ! -d $PREFIX/include/gsm ];then
 echo "==========================create gsm directory"
 mkdir $PREFIX/include/gsm
fi

cp -rf ./inc/* $PREFIX/include/gsm
cp -rf ./lib/* $PREFIX/lib

cd $MY_DIR
echo "==========================gsm build successful!=========================="

build_ffmpeg.sh

#! /bin/bash

# mac --cc=clang
# 禁用编译器优化选项 --disable-optimizations
# 编译libmp3lame需要使用到--extra-cflags和--extra-ldflags属性

set -e

PATH=$PATH:$PREFIX/lib # 设置环境变量,将$PREFIX/bin目录下的可执行二进制文件设置进去,方便调用

PKG_CONFIG_PATH="$PREFIX/lib/pkgconfig"
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH

FFMPEG="FFmpeg"

# 通用配置
COMMON_FFMPEG_CONFIGURE_COMMAND="./configure
--prefix=$PREFIX
--extra-cflags=-I$PREFIX/include
--extra-ldflags=-L$PREFIX/lib
--pkg-config-flags="--static"
--extra-libs="-lpthread"
--enable-ffplay
--enable-gpl
--enable-version3
--disable-optimizations
--enable-debug
--enable-nonfree
--enable-filter=delogo
"

if [[ "$enableShared" == true  ]]; then
 COMMON_FFMPEG_CONFIGURE_COMMAND=$COMMON_FFMPEG_CONFIGURE_COMMAND"
 --enable-shared
 --disable-static
 "
else
 COMMON_FFMPEG_CONFIGURE_COMMAND=$COMMON_FFMPEG_CONFIGURE_COMMAND"
 --enable-static
 --disable-shared
 "
fi

# linux配置
LINUX_FFMPEG_CONFIGURE_COMMAND=$COMMON_FFMPEG_CONFIGURE_COMMAND"
--enable-libx264
--enable-libx265
--enable-libfdk-aac
--enable-libmp3lame
--enable-libopus
--enable-libvpx
--enable-libgsm
--enable-libspeex
"

# mac配置
MAC_CONFIGURE_COMMAND=$COMMON_FFMPEG_CONFIGURE_COMMAND"
--enable-libfdk-aac
--enable-libx264
--enable-libmp3lame
--enable-hardcoded-tables
--host-cflags=
--host-ldflags=
--cc=clang
"

FFMPEG_GIT_URL="--depth 1 -b release/4.4 https://github.com/FFmpeg/FFmpeg.git"

if [ ! -e $FFMPEG ]; then
 echo "==========================clone FFmpeg=========================="
 $CLONE_GIT_COMMAND$FFMPEG_GIT_URL
fi

echo "==========================build ffmpeg=========================="
if [ -e $FFMPEG ]; then
 cd $FFMPEG
 if [[ $SYSTEM == "Darwin" ]]; then
  $MAC_FFMPEG_CONFIGURE_COMMAND
 else
  $LINUX_FFMPEG_CONFIGURE_COMMAND
 fi
 make clean
 make -j${cpu_num}
 make install
fi
echo "==========================ffmpeg build successful!=========================="


相关文章

网友评论

      本文标题:ubuntu编译安装ffmpeg

      本文链接:https://www.haomeiwen.com/subject/ylhicdtx.html