(一)Android 编译ffmpeg动态链接库 Mac OS系统

主要目的:通过ffmpeg,利用脚本打出属于自己的音视频处理so库。

1、下载ffmpeg的源码

官网地址:http://www.ffmpeg.org/download.html
里面有Linux、macOS、Windows系统的版本,根据自己的需要下载对应的版本。下载完成后把源码放在你喜欢的路径,如:/Users/ccc/ffmpeg

2、 安装Androidstudio

官网地址: https://developer.android.google.cn/studio

3、下载NDK

这个NDK不需要另外下载,直接在AndroidStudio里面的SDK Manager里面下载就行。
image.png

顺便把CMake也装上,这个也有用。

到这里,需要的工具基本齐了,下面开始编译自己的so库。

4、经常看到网上其他的文章介绍,接下来都是修改configure文件,怎么改?为什么要改?不改行不行?

怎么改:在configure文件中,搜索Toolchain options,增加一个自定义的参数配置。

Toolchain options:
  --arch=ARCH              select architecture [$arch]
  --cpu=CPU                select the minimum required CPU (affects
                           instruction selection, may crash on older CPUs)
  --cross-prefix=PREFIX    use PREFIX for compilation tools [$cross_prefix]
  # 增长这一行
  --cross-prefix-clang=PREFIX    use PREFIX for compilation tools [$cross_prefix_clang]
  --progs-suffix=SUFFIX    program name suffix []
  --enable-cross-compile   assume a cross-compiler is used
  --sysroot=PATH           root of cross-build tree

再搜索CMDLINE_SET,也增加上面的自定义参数配置。

CMDLINE_SET="
    $PATHS_LIST
    ar
    arch
    as
    assert_level
    build_suffix
    cc
    objcc
    cpu
    cross_prefix
    #增长这一行
    cross_prefix_clang
    custom_allocator
    cxx
    dep_cc

最后再搜索set_default target_os,进行一下修改:

set_default target_os
if test "$target_os" = android; then
    cc_default="clang"
    # 增长这一行
    cxx_default="clang++"
fi

ar_default="${cross_prefix}${ar_default}"
# 修改这一行
cc_default="${cross_prefix_clang}${cc_default}" 
# 修改这一行
cxx_default="${cross_prefix_clang}${cxx_default}"
nm_default="${cross_prefix}${nm_default}"
pkg_config_default="${cross_prefix}${pkg_config_default}"
ranlib_default="${cross_prefix}${ranlib_default}"
strip_default="${cross_prefix}${strip_default}"
windres_default="${cross_prefix}${windres_default}"

sysinclude_default="${sysroot}/usr/include"

这样修改之后咱们在编译时就可使用咱们新增的cross_prefix_clang参数了,而后其余的如nm,ar,ranlib,strip则继续使用cross_prefix参数。

为什么要这样改?
首先,需要先了解编译库的流程。
①编写自定义的编译脚本
②脚本根据各个配置项,去寻找对应的库工具路径
③生成动态链接库
而上面的修改,目的就是为了第二步能正常找到对应的库工具。配置中的nm,ar,ranlib,strip这些的前缀,是arm-linux-androideabi-,而cc,cxx这两个是arm-linux-androideabi21-这样的前缀,而且他们放的位置也不一样。所以增加一个自定义的配置项,用于指向不同的目录。

我们可以看一看ndk目录,验证一下:ndk/24.0.8215888/toolchains/llvm/prebuilt/darwin-x86_64/bin
image.png
image.png

图中的-clang和-clang++前面,都是跟版本的,nm,ar,ranlib,strip就不是,如果我们不修改configure文件里的配置项,就会编译失败。

编写编译脚本

在ffmepg的文件夹中新建一个文件夹build-android,里面再新建一个build-android.sh文件。

#!/bin/bash
#NDK路径
export NDK=/Users/chenjy/Library/Android/sdk/ndk/20.0.5594570
#CPU类型
export CPU=armv7-a
# 目标Android版本
API=19
#架构类型
export ARCH=arm
export SYSROOT=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/sysroot
#交叉编译工具链
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
#编译成功后,存放的路径
export PREFIX=./build-android/dist

cd .. #回到ffmpeg根目录

echo "start configure"
./configure \
--prefix=$PREFIX \
--enable-shared \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--cross-prefix-clang=$TOOLCHAIN/bin/armv7a-linux-androideabi21- \
--target-os=android --arch=$ARCH --cpu=$CPU \
--enable-gpl --enable-version3 \
--disable-programs --disable-ffmpeg --disable-ffplay --disable-ffprobe \
--disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages \
--disable-avdevice  --disable-postproc --disable-avfilter \
--disable-debug  \
--sysroot=$SYSROOT \
--extra-cflags="-I$SYSROOT/usr/include" \
--extra-ldflags="-L$SYSROOT/usr/lib" \
--enable-small \
--enable-jni \
--enable-mediacodec 
--disable-everything \
--enable-decoder=hevc --enable-decoder=h264  --enable-decoder=aac \
--enable-parser=h264 --enable-parser=hevc --enable-parser=aac \
--enable-demuxer=flv --enable-demuxer=mov --enable-demuxer=avi --enable-demuxer=mpegts \
--enable-protocol=file --enable-protocol=hls
 
echo "make clean start"
make clean
echo "make start"
make -j4
echo "make finished"
make install
echo "make install finished"

打开终端,转到脚本文件的所在路径,然后输入./build-android.sh,然后等待编译完成,就能在输出路径中找到所有的链接库。
image.png

到这里为止,就已经编译出我们需要的so库了,之后就是怎么在android项目中使用了。这个会在以后的文章中进行记录。

还有一个问题,就是能不能不修改configure文件?

其实也是可以,只需要明确指定cc和cxx的路径就行。

--cc=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang \
--cxx=$TOOLCHAIN/bin/armv7a-linux-androideabi21-clang++ \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \

脚本部分配置项解释

1.—prefix:指定编译输出的文件路径
2.—target-os:指定目标操作系统
3.--disable-static:禁止生成静态库
4.—disable-programs:禁止生成ffplay、ffmpeg等可执行文件
5.—disable-doc:禁止生成文档
6.—enable-shared:生成动态链接库
7.enable-cross-compile:开启交叉编译(跨平台编译)
8.make -j12:定义用几个CPU编译

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容