Mac平臺編譯FFmpeg for Android

其實網(wǎng)絡(luò)上有很多關(guān)于編譯FFmpeg的文檔,但是真正到自己編譯的時候還是會遇到一些意想不到的問題。原因可能是平臺不一樣,也可能是FFmpeg版本不一樣導(dǎo)致別人的方法照搬過來不能work。那我下面就分享一下自己編譯FFmpeg的過程:

一、工作環(huán)境

FFmpeg version:????3.4.2

編譯平臺: ? ? ? ? ? ? ? ?MacOS

NDK version: ? ? ? ? ?15.2.4203891


二、準備工作

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的路徑,一定要選擇比你的目標機器使用的版本低的,比如你的手機是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)化工具,看起來沒什么用,整段注掉,編譯通過。(有知道的朋友可以交流一下這個具體是什么東西)

當腳本在沒有任何報錯的情況下跑完,就可以去之前設(shè)置的目錄里面看成果了。打開你*.sh文件里指定的放編譯結(jié)果的目錄, $PREFIX 目錄下生成 include和lib兩個文件夾,將lib文件夾中的 pkgconfig 目錄和so的鏈接文件刪除,只保留so文件,然后include 和lib兩個目錄拷貝出來這就是我們想要的了。


以上就是我的整個編譯過程,謝謝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容