ffmpeg源碼編譯(最新版本4.1、android平臺)

一、ffmpeg介紹:

FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,並能將其轉化爲流的開源計算機程序。採用LGPL或GPL許可證。它提供了錄製、轉換以及流化音視頻的完整解決方案。它包含了非常先進的音頻/視頻編解碼庫libavcodec,爲了保證高可移植性和編解碼質量,libavcodec裏很多code都是從頭開發的。
FFmpeg在Linux平臺下開發,但它同樣也可以在其它操作系統環境中編譯運行,包括Windows、Mac OS X等。這個項目最早由Fabrice Bellard發起,2004年至2015年間由Michael Niedermayer主要負責維護。許多FFmpeg的開發人員都來自MPlayer項目,而且當前FFmpeg也是放在MPlayer項目組的服務器上。項目的名稱來自MPEG視頻編碼標準,前面的"FF"代表"Fast Forward"。
多媒體視頻處理工具FFmpeg有非常強大的功能包括視頻採集功能、視頻格式轉換、視頻抓圖、給視頻加水印等。
以上介紹摘自百度。

二、源碼下載:

官網:https://ffmpeg.org/
github:https://github.com/FFmpeg/FFmpeg

三、環境配置:

這裏主要指NDK配置,編譯android平臺需要NDK支持,步驟如下:

  1. vim ~/.bashrc
  2. 在文件最後面添加:
export NDKROOT=/home/ceshi/ceshi/android-ndk-r17cexport PATH=$NDKROOT:$PATH
  1. source ~/.bashrc

四、配置文件修改:

打開FFmpeg目錄下的configure文件,找到下面幾行:

SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'

替換爲:

SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB)"$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'

目的:修改生成的.so的文件名,可以能夠讓android項目識別

五、腳本編寫:

新建一個腳本文件android_build.sh,添加如下內容:

  #!/bin/bash
  # 清空上次的編譯
  make clean
  #你自己的NDK路徑。
  export NDK = / home / ceshi / ceshi / android - ndk - r17c
  # 設置你的android平臺編譯器的版本 這裏採用Android21
  export SYSROOT = $NDK / platforms / android - 21 / arch - arm /
  #編譯使用的toolchain
  export TOOLCHAIN = $NDK / toolchains / arm - linux - androideabi - 4.9 / prebuilt / linux - x86_64
  export CPU = arm
  # 這個是輸出的路徑
  export PREFIX = $(pwd) / android / $CPU
  export ADDI_CFLAGS = "-marm"
  . / configure --target - os = linux \
  --prefix = $PREFIX --arch = arm \
  --disable - doc \
  --enable - shared \
  --disable - static \
  --disable - x86asm \
  --disable - symver \
  --enable - gpl \
  --disable - ffmpeg \
  --disable - ffplay \
  --disable - ffprobe \
  --disable - doc \
  --disable - symver \
  --cross - prefix = $TOOLCHAIN / bin / arm - linux - androideabi - \
  --enable - cross - compile \
  --sysroot = $SYSROOT \
  --extra - cflags = "-I$NDK/sysroot/usr/include/arm-linux-androideabi -Os -fpic $ADDI_CFLAGS -isysroot $NDK/sysroot" \
  --extra - ldflags = "$ADDI_LDFLAGS" \
  $ADDITIONAL_CONFIGURE_FLAG
  # make clean
  make
  make install

六、編譯:

爲上一步的腳本添加可執行權限,執行。

七、踩過的坑

error 1:

/home/cece/cece/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-nm: /lib64/libc.so.6: version `GLIBC_2.18’ not found (required by /home/cece/cece/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/…/bin/…/lib/bfd-plugins/…/lib64/libc++.so.1)
https://www.jianshu.com/p/feab970fd74c

解決方案:
不影響編譯,不要輕易升級。升級可能會導致系統癱瘓,我升級了一次,果然系統掛了。。。
如需要升級,可參考:https://blog.csdn.net/qq_39295044/article/details/86685789

error 2:

_64/lib/gcc/arm-linux-androideabi/4.9.x/include/stdint.h:9:26: fatal error: stdint.h: No such file or directory

解決方案:
需在–extra-cflags中添加 “-isysroot $NDK/sysroot”
還有有關彙編的頭文件也進行了分離.
需要根據目標平臺進行指定“-I$NDK/sysroot/usr/include/arm-linux-androideabi”,將“arm-linux-androideabi” 改爲需要的平臺就可以

error 3:

 libavcodec / aaccoder.c : In function 'search_for_ms' :
  libavcodec / aaccoder.c : 803 : 25 : error : expected identifier or '(' before numeric constant
  int B0 = 0, B1 = 0;
      ^
  libavcodec / aaccoder.c:865 : 28 : error : lvalue required as left operand of assignment
  B0 += b1 + b2;
  ^
  libavcodec / aaccoder.c:866 : 25 : error : 'B1' undeclared(first use in this function)
  B1 += b3 + b4;
  ^

解決方案:
最新版本命名衝突,修改libavcodec/aaccoder.c 文件 B0改成b0。

error 4:

 libavcodec / hevc_mvs.c : In function 'derive_spatial_merge_candidates' :
  libavcodec / hevc_mvs.c : 208 : 15 : error : 'y0000000' undeclared(first use in this function)
  ((y ## v) >> s->ps.sps->log2_min_pu_size))
    ^

解決方案:
同上,修改變量名,避免衝突即可。

error 5:

 libavcodec / opus_pvq.c : In function 'quant_band_template' :
  libavcodec / opus_pvq.c : 498 : 9 : error : expected identifier or '(' before numeric constant
  int B0 = blocks;

解決方案:
同上,修改變量名,避免衝突即可。

八、補充

不同的NDK版本,編譯時需要的錯誤不一樣,我這裏使用的是android - ndk - r17c,需要注意。

參考鏈接:
https://blog.csdn.net/qq_34902522/article/details/87879145
https://www.jianshu.com/p/feab970fd74c

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章