其實網(wǎng)絡(luò)上有很多關(guān)于編譯FFmpeg的文檔,但是真正到自己編譯的時候還是會遇到一些意想不到的問題树叽。原因可能是平臺不一樣,也可能是FFmpeg版本不一樣導(dǎo)致別人的方法照搬過來不能work谦絮。那我下面就分享一下自己編譯FFmpeg的過程:
一题诵、工作環(huán)境
FFmpeg version:????3.4.2
編譯平臺: ? ? ? ? ? ? ? ?MacOS
NDK version: ? ? ? ? ?15.2.4203891
二、準(zhǔn)備工作
1. 下載FFmpeg源碼:http://ffmpeg.org
2. 修改源碼目錄下的配置文件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平臺識別层皱,直接復(fù)制粘貼就可以性锭。
三、寫編譯腳本
1. 指定臨時目錄?
export TMPDIR=/Users/Tian/Downloads/ffmpeg_install
指定一個臨時目錄叫胖,可以是任何路徑草冈,但必須保證存在,ffmpeg編譯要用;
2. 指定NDK路徑?
NDK=/Users/Tian/Library/Android/sdk/ndk-bundle
3. 指定使用NDK Platform版本?
SYSROOT=$NDK/platforms/android-16/arch-arm/?
這里指定的ndk platform的路徑怎棱,一定要選擇比你的目標(biāo)機器使用的版本低的方淤,比如你的手機是android-15版本,那么就選擇低于15的
4.指定編譯工具鏈?
TOOLCHAIN=/Users/Tian/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
注意:這里很多博客里面最后一個目錄都是linux-x86_64蹄殃,如果用這個編譯的話會報錯:C compiler test failed,如果你也有這個問題可以檢查有沒有對應(yīng)的目錄你踩。
5.指定編譯后的安裝目錄?
PREFIX=/Users/Tian/Downloads/ffmpeg_install/
這個目錄是ffmpeg編譯后的so的輸出目錄诅岩,會有一個include和lib文件夾生成在這里脐瑰,這也是我們之后要在android apk中使用的道偷。
下面是我的腳本:
#!/bin/bash
export TMPDIR=/Users/Tian/Downloads
NDK=/Users/Tian/Library/Android/sdk/ndk-bundle
SYSROOT=$NDK/platforms/android-16/arch-arm/
TOOLCHAIN=/Users/Tian/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
CPU=arm
PREFIX=/Users/Tian/Downloads/ffmpeg_install/
ADDI_CFLAGS="-marm"
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-doc \
--disable-symver \
--enable-small \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
build_one
四、運行腳本
首先要給腳本文件添加執(zhí)行權(quán)限前塔,然后運行膝藕。
這里我會報錯:fatal error: linux/perf_event.h: No such file or directory式廷,發(fā)現(xiàn)是libavutil/timer.h 找不到?linux/perf_event.h 引起的。查了一下linux/perf_event.h是linux平臺的效能優(yōu)化工具芭挽,看起來沒什么用滑废,整段注掉,編譯通過袜爪。(有知道的朋友可以交流一下這個具體是什么東西)
當(dāng)腳本在沒有任何報錯的情況下跑完蠕趁,就可以去之前設(shè)置的目錄里面看成果了。打開你*.sh文件里指定的放編譯結(jié)果的目錄辛馆, $PREFIX 目錄下生成 include和lib兩個文件夾俺陋,將lib文件夾中的 pkgconfig 目錄和so的鏈接文件刪除,只保留so文件昙篙,然后include 和lib兩個目錄拷貝出來這就是我們想要的了腊状。
以上就是我的整個編譯過程,謝謝苔可。