Ubuntu環境下靜態編譯FFmpeg+Cmake使用靜態鏈接FFmpeg庫生成可執行文件

官網指導編譯文檔

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=“HOME/ffmpegbin:HOME/ffmpeg_bin:PATH” ./configure --prefix=“HOME/ffmpegbuild"bindir="HOME/ffmpeg_build" --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=“HOME/ffmpegbuild"bindir="HOME/ffmpeg_build" --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=“HOME/ffmpegbin:HOME/ffmpeg_bin:PATH” PKG_CONFIG_PATH=“HOME/ffmpegbuild/lib/pkgconfig"./configureprefix="HOME/ffmpeg_build/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=“HOME/ffmpegbin:HOME/ffmpeg_bin: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=“HOME/ffmpegbin:HOME/ffmpeg_bin: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=“HOME/ffmpegbin:HOME/ffmpeg_bin:PATH” ./configure --prefix=“HOME/ffmpegbuild"bindir="HOME/ffmpeg_build" --bindir="HOME/ffmpeg_bin” --disable-shared --enable-nasm &&
PATH=“HOME/ffmpegbin:HOME/ffmpeg_bin: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=“HOME/ffmpegbin:HOME/ffmpeg_bin: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" )
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章