ubuntu编译安装ffmpeg

当前所有的步骤都将先在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!=========================="


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354

推荐阅读更多精彩内容