ffmpeg——android平臺源碼編譯最新版本4.1
一、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支持,步驟如下:
- vim ~/.bashrc
- 在文件最後面添加:
export NDKROOT=/home/ceshi/ceshi/android-ndk-r17cexport PATH=$NDKROOT:$PATH
- 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