乐享无线技术分享站

乐享无线技术分享
乐享无线,资源分享,互联网产品、技术分享
  1. 首页
  2. 开发
  3. 正文

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

2022年7月8日 3948点热度 2人点赞 0条评论

主要目的:通过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编译

标签: 暂无
最后更新:2022年7月9日

乐

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

取消回复
归档
  • 2022 年 10 月
  • 2022 年 7 月
最新 热点 随机
最新 热点 随机
Spring为何需要三级缓存解决循环依赖,而不是二级缓存? Tomcat&Spring&Dubbo优雅关闭流程分析 网站https访问配置证书 Jenkins结合gitee自动化部署SpringBoot项目 Docker:制作Python环境连接Oracle的镜像 Anaconda环境下Python中pydot与graphviz模块的下载与安装方法
Linux实用基础1 mac安装xdebug Android 编译ffmpeg动态链接库 Mac OS系统 Mac安装jdk的图文教程 网站https访问配置证书 ADB环境变量配置
标签聚合

COPYRIGHT © 2022 乐享无线技术分享站. ALL RIGHTS RESERVED.

粤ICP备2021126988号-1