ubuntu环境下静态编译ffmpeg+cmake使用静态链接ffmpeg库生成可执行文件

原文连接: https://blog.csdn.net/qq1124034012/article/details/94555466


官网指导编译文档http://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu

本文依据官方文档,根据自身需求定制编译选项,由于目前只需要和视频编码有关的第三方库,所以和音频有关的第三库就不编译。又因为项目涉及到需要调用FFmpeg库生成的可执行文件需是静态链接,而目前暂时无法解决硬解的静态链接,故在编译FFmpeg源码中去掉和硬解相关的所有选项,在文末中可参考我的调用ffmpge库的cmake文件可,已通过测试,生成的可执行文件是静态链接文件

一、编译前准备

1.编译环境

查看系统信息uname -a or lsb_release -a

Linux as2 4.4.0-142-generic #168-Ubuntu SMP Wed Jan 16 21:00:45 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

2.安装依赖包

sudo apt-get update -qq && sudo apt-get -y install \

  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

备注:服务器用户可以省略ffplay和x11grab依赖项:libsdl2-dev libva-dev libvdpau-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev

3.新建编译目录

官网文档是新建/bin存放二进制文件,我自己是/ffmpeg_bin,以下都是~/ffmpeg_bin

mkdir -p ~/ffmpeg_sources ~/ffmpeg_bin ~/ffmpeg_bin

二、第三方库编译安装

本指南假设您希望安装一些最常见的第三方库。每个部分都为您提供安装该库所需的命令。

对于每个部分,将整个代码块复制粘贴到shell中。

如果不需要某些特性,则可以跳过相关部分(如果不需要),然后删除适当的./配置在FFmpeg中的选项。例如,如果不需要libvpx,请跳过该部分,然后删除。-启用-libvpx从安装FFmpeg部分。

提示:若要显著加快具有多个核的系统上的编译过程,可以使用-j每个选项制作,使命令,例如Make-J4.

1.NASM

汇编编译器

cd ~/ffmpeg_sources &&

wget https://www.nasm.us/pub/nasm/releasebuilds/2.14.02/nasm-2.14.02.tar.bz2 &&

tar xjvf nasm-2.14.02.tar.bz2 &&

cd nasm-2.14.02 &&

./autogen.sh &&

PATH=“H O M E / f f m p e g b i n : HOME/ffmpeg_bin:HOME/ffmpegbin:PATH” ./configure --prefix=“H O M E / f f m p e g b u i l d " − − b i n d i r = " HOME/ffmpeg_build" --bindir="HOME/ffmpegbuild"−−bindir="HOME/ffmpeg_bin” &&

make -j4 &&

make install

2.Ysam

汇编编译器

cd ~/ffmpeg_sources &&

wget -O yasm-1.3.0.tar.gz https://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz &&

tar xzvf yasm-1.3.0.tar.gz &&

cd yasm-1.3.0 &&

./configure --prefix=“H O M E / f f m p e g b u i l d " − − b i n d i r = " HOME/ffmpeg_build" --bindir="HOME/ffmpegbuild"−−bindir="HOME/ffmpeg_bin” &&

make -j4 &&

make install

3.libx264

cd ~/ffmpeg_sources &&

git -C x264 pull 2> /dev/null || git clone --depth 1 https://code.videolan.org/videolan/x264.git &&

cd x264 &&

PATH=“H O M E / f f m p e g b i n : HOME/ffmpeg_bin:HOME/ffmpegbin:PATH” PKG_CONFIG_PATH=“H O M E / f f m p e g b u i l d / l i b / p k g c o n f i g " . / c o n f i g u r e − − p r e f i x = " HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="HOME/ffmpegbuild/lib/pkgconfig"./configure−−prefix="HOME/ffmpeg_build” --bindir=“KaTeX parse error: Expected 'EOF', got '&' at position 47: …c --enable-pic &̲& \ PATH="HOME/ffmpeg_bin:$PATH” make -j4 &&

make install

4.libx265

sudo apt-get install mercurial libnuma-dev &&

cd ~/ffmpeg_sources &&

if cd x265 2> /dev/null; then hg pull && hg update && cd …; else hg clone https://bitbucket.org/multicoreware/x265; fi &&

cd x265/build/linux &&

PATH=“H O M E / f f m p e g b i n : HOME/ffmpeg_bin:HOME/ffmpegbin:PATH” cmake -G “Unix Makefiles” -DCMAKE_INSTALL_PREFIX=“KaTeX parse error: Expected 'EOF', got '&' at position 53: …f ../../source &̲& \ PATH="HOME/ffmpeg_bin:$PATH” make -j4 &&

make install

5.libvpx(暂时不需要)

cd ~/ffmpeg_sources &&

git -C libvpx pull 2> /dev/null || git clone --depth 1 https://chromium.googlesource.com/webm/libvpx.git &&

cd libvpx &&

PATH=“H O M E / f f m p e g b i n : HOME/ffmpeg_bin:HOME/ffmpegbin:PATH” ./configure --prefix=“KaTeX parse error: Expected 'EOF', got '&' at position 96: …epth --as=yasm &̲& \ PATH="HOME/ffmpeg_bin:$PATH” make -j4 &&

make install

6.libfdk-aac(暂时不需要)

cd ~/ffmpeg_sources &&

git -C fdk-aac pull 2> /dev/null || git clone --depth 1 https://github.com/mstorsjo/fdk-aac &&

cd fdk-aac &&

autoreconf -fiv &&

./configure --prefix="$HOME/ffmpeg_build" --disable-shared &&

make -j4 &&

make install

7.libmp3lame(暂时不需要)

cd ~/ffmpeg_sources &&

wget -O lame-3.100.tar.gz https://downloads.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz &&

tar xzvf lame-3.100.tar.gz &&

cd lame-3.100 &&

PATH=“H O M E / f f m p e g b i n : HOME/ffmpeg_bin:HOME/ffmpegbin:PATH” ./configure --prefix=“H O M E / f f m p e g b u i l d " − − b i n d i r = " HOME/ffmpeg_build" --bindir="HOME/ffmpegbuild"−−bindir="HOME/ffmpeg_bin” --disable-shared --enable-nasm &&

PATH=“H O M E / f f m p e g b i n : HOME/ffmpeg_bin:HOME/ffmpegbin:PATH” make -j4 &&

make install

8.libopus(暂时不需要)

cd ~/ffmpeg_sources &&

git -C opus pull 2> /dev/null || git clone --depth 1 https://github.com/xiph/opus.git &&

cd opus &&

./autogen.sh &&

./configure --prefix="$HOME/ffmpeg_build" --disable-shared &&

make -j4 &&

make install

9.libaom(暂时不需要)

cd ~/ffmpeg_sources &&

git -C aom pull 2> /dev/null || git clone --depth 1 https://aomedia.googlesource.com/aom &&

mkdir -p aom_build &&

cd aom_build &&

PATH=“H O M E / f f m p e g b i n : HOME/ffmpeg_bin:HOME/ffmpegbin:PATH” cmake -G “Unix Makefiles” -DCMAKE_INSTALL_PREFIX=“KaTeX parse error: Expected 'EOF', got '&' at position 64: …NASM=on ../aom &̲& \ PATH="HOME/ffmpeg_bin:$PATH” make &&

make install

三、FFmpeg编译安装

查看./configure --help,根据自身需求选择编译选项,目前我无法解决如果开启硬解功能,无法链接到和硬解相关的静态库,故关掉和硬解相关的所有选项。

如果没有特殊需求,直接抄官方编译文档就行了。

cd ~/ffmpeg_sources && \ wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 && \ tar xjvf ffmpeg-snapshot.tar.bz2 && \ cd ffmpeg && \ PATH="$HOME/ffmpeg_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/ffmpeg_bin" \ --enable-gpl \ --enable-libx264 \ --enable-libx265 \ --disable-amf \ --disable-audiotoolbox \ --disable-cuvid \ --disable-d3d11va \ --disable-dxva2 \ --disable-ffnvcodec \ --disable-nvdec \ --disable-nvenc \ --disable-v4l2-m2m \ --disable-vaapi \ --disable-vdpau \ --disable-videotoolbox \ --enable-libfreetype \ --enable-nonfree && \ PATH="$HOME/ffmpeg_binn:$PATH" make -j4 && \ make install && \ hash -r


四、使用FFmpeg库

在**/ffmpeg_build**文件中可找到头文件和lib库,重点关注**ffmpeg_build/lib/pkgconfig**文件夹中的一大堆pc文件,如果要写cmake文件或者makefile文件都要参考这些pc文件,pc文件保存了ffmpeg库所需的lib库,无论是静态链接还是动态链接编写,都要参考。这是我的cmake静态链接文件,目前写的比较粗糙,下一版本打算把和FFmpeg相关的cmake文件封装成独立的cmake 包,如果是编写Makefile文件,参考官方自带的~ffmpeg_build/share/ffmpeg/examples/Makefile文件。

set(PROJECT_NAME rtsptool)

project(${PROJECT_NAME} CXX)

set(SRC_LIST main.cpp)

# C++11

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") 

set(CMAKE_CXX_STANDARD 11)

set(CMAKE_CXX_FLAGS "-static ${CMAKE_CXX_FLAGS}")

include_directories("/home/lh/git/rtsptool/src/third")

include_directories("/home/lh/git/rtsptool/src/third/ffmpeg")

# 设定执行文件生成路径

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "~/git/rtsptool/bin")

add_executable(${PROJECT_NAME} ${SRC_LIST})

target_link_libraries(${PROJECT_NAME} /home/lh/ffmpeg_build/lib/libavformat.a)

target_link_libraries(${PROJECT_NAME} /home/lh/ffmpeg_build/lib/libavfilter.a)

target_link_libraries(${PROJECT_NAME} /home/lh/ffmpeg_build/lib/libavcodec.a)

target_link_libraries(${PROJECT_NAME} /home/lh/ffmpeg_build/lib/libswresample.a)

target_link_libraries(${PROJECT_NAME} /home/lh/ffmpeg_build/lib/libavutil.a)

target_link_libraries(${PROJECT_NAME} /home/lh/ffmpeg_build/lib/libswscale.a)

target_link_libraries(${PROJECT_NAME} /home/lh/ffmpeg_build/lib/libx264.a)

target_link_libraries(${PROJECT_NAME} /home/lh/ffmpeg_build/lib/libx265.a)

#libavformat

target_link_libraries(${PROJECT_NAME}  "z" "m" )

#ibavfilter

target_link_libraries(${PROJECT_NAME}  "pthread" "m" "va" "freetype" "z" "png12" "z" "m" )

#libavcodec

target_link_libraries(${PROJECT_NAME}  "pthread" "m" "z"  "pthread" "m" "dl"  "stdc++" "m" "rt" "dl" "numa"  )

#libswresample

target_link_libraries(${PROJECT_NAME}  "m")

#libavutil

target_link_libraries(${PROJECT_NAME}  "pthread"  "m" "Xv" "X11" "Xext" )

#libswscale

target_link_libraries(${PROJECT_NAME}  "m" )

#libx264

target_link_libraries(${PROJECT_NAME}  "pthread" "m" "dl" )

#libx265

target_link_libraries(${PROJECT_NAME}  "stdc++" "m" "rt" "dl" "numa" )


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

推荐阅读更多精彩内容