linux+ndk静态编译,Linux+NDK编译ffmpeg遇到的问题

2023-11-20

1 修改FFmpeg的configure

下载FFmpeg源代码之后,首先需要对源代码中的configure文件进行修改。由于编译出来的动态库文件名的版本号在.so之后(例如libavcodec.so.5.100.1),而Android平台不能识别这样文件名,所以需要修改这种文件名。在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)'

2 编库

软解库

编译多个库的脚本如下,生成libavcodec-57.so libavdevice.so libavformat-57.so libavutil.so libswscale-4.so libavcodec.so libavfilter-6.so libavformat.so libswresample-2.so libswscale.so libavdevice-57.so libavfilter.so libavutil-55.so libswresample.so等库:

#! /bin/sh

NDK=../../NDK/android-ndk-r12b

SYSROOT=$NDK/platforms/android-9/arch-arm/

TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64

CPU=arm

PREFIX=../test

ADDI_CFLAGS="-marm"

build_one()

{

./configure --prefix=$PREFIX --enable-shared --disable-static --disable-doc --disable-ffserver --enable-cross-compile --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- --target-os=linux --arch=arm --sysroot=$SYSROOT --extra-cflags="-Os -fpic $ADDI_CFLAGS" --extra-ldflags="$ADDI_LDFLAGS" $ADDITIONAL_CONFIGURE_FLAG

make clean

make

make install

}

build_one

将编译的多个库整合为一个ffmpeg.so库的编译脚本如下,注意:当整合为一个动态库时,要先编译出.a的静态库(修改./configure后的参数--enable-shared --disable-static为--disable-shared --enable-static),再将各静态库合并为一个动态库:

#! /bin/sh

NDK=../../NDK/android-ndk-r12b

SYSROOT=$NDK/platforms/android-9/arch-arm/

TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64

CPU=arm

PREFIX=../test

ADDI_CFLAGS="-marm"

export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt

export PLATFORM=$NDK/platforms/android-14/arch-arm

build_one()

{

./configure --prefix=$PREFIX --disable-shared --enable-static --disable-doc --disable-ffserver --enable-cross-compile --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- --target-os=linux --arch=arm --sysroot=$SYSROOT --extra-cflags="-Os -fpic $ADDI_CFLAGS" --extra-ldflags="$ADDI_LDFLAGS" $ADDITIONAL_CONFIGURE_FLAG

make clean

make

make install

}

build_one

$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -L$PREFIX/lib -soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavfilter/libavfilter.a libswresample/libswresample.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a libavdevice/libavdevice.a -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker $PREBUILT/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a

最初编译脚本如下:

#! /bin/bash

NDK=../../NDK/android-ndk-r12b

SYSROOT=$NDK/platforms/android-9/arch-arm/

TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64

CPU=arm

PREFIX=../test

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

遇到的问题:

0 Cygwin编不出,要在Linux环境下编译

1 执行xxx.sh时提示Permission denied

原因:没有执行权限

解决:执行chmod a+x xxx.sh命令,赋予执行权限

2 --prefix=../test command not found, --enable-shared command not found, --disable-staticcommand not found......

解决:将./configure后的\换行删除,该命令并成一行

3 arm-linux-androideabi-gcc is unable to create an executable file.

原因:TOOLCHAIN路径错误

解决:将arm-linux-androideabi-4.8改为arm-linux-androideabi-4.9,android-ndk-r12b下没有4.8路径

硬解库

编译脚本如下:

#!/bin/bash

export NDK=../../NDK/android-ndk-r12b

echo "Fetching Android system headers"

git clone --depth=1 --branch gingerbread-release git://github.com/CyanogenMod/android_frameworks_base.git ../android-source/frameworks/base

git clone --depth=1 --branch gingerbread-release git://github.com/CyanogenMod/android_system_core.git ../android-source/system/core

echo "Fetching Android libraries for linking"

# Libraries from any froyo/gingerbread device/emulator should work

# fine, since the symbols used should be available on most of them.

if [ ! -d "../android-libs" ]; then

if [ ! -f "../update-cm-7.0.3-N1-signed.zip" ]; then

wget https://jaist.dl.sourceforge.net/project/nexusoneandroid/update-cm-7.0.3-N1-signed.zip -P../

fi

unzip ../update-cm-7.0.3-N1-signed.zip system/lib/* -d../

mv ../system/lib ../android-libs

rmdir ../system

fi

SYSROOT=$NDK/platforms/android-9/arch-arm

# Expand the prebuilt/* path into the correct one

TOOLCHAIN=`echo $NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64`

export PATH=$TOOLCHAIN/bin:$PATH

ANDROID_SOURCE=../android-source

ANDROID_LIBS=../android-libs

ABI="armeabi-v7a"

rm -rf ../build/stagefright

mkdir -p ../build/stagefright

DEST=../build/stagefright

FLAGS="--target-os=linux --cross-prefix=arm-linux-androideabi- --arch=arm --cpu=armv7-a"

FLAGS="$FLAGS --sysroot=$SYSROOT"

FLAGS="$FLAGS --disable-avdevice --disable-decoder=h264 --disable-decoder=h264_vdpau --enable-decoder=libstagefright_h264"

EXTRA_CFLAGS="-I$ANDROID_SOURCE/frameworks/base/include -I$ANDROID_SOURCE/system/core/include"

EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/media/libstagefright"

EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/include/media/stagefright/openmax"

EXTRA_CFLAGS="$EXTRA_CFLAGS -I$NDK/sources/cxx-stl/gnu-libstdc++/4.9/include -I$NDK/sources/cxx-stl/gnu-libstdc++/4.9/libs/$ABI/include"

EXTRA_CFLAGS="$EXTRA_CFLAGS -march=armv7-a -mfloat-abi=softfp -mfpu=neon"

EXTRA_LDFLAGS="-Wl,--fix-cortex-a8 -L$ANDROID_LIBS -Wl,-rpath-link,$ANDROID_LIBS -L$NDK/sources/cxx-stl/gnu-libstdc++/4.9/libs/$ABI -lstagefright -lstdc++ -lutils -lbinder -lgnustl_static -lgnustl_shared"

#EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lcutils -ldl -lstlport -lc -lm -lz -ldl -llog -lstdc++ -lstagefright -lbinder -lstlport -lstdc++ -lstl"

EXTRA_CXXFLAGS="-Wno-multichar -fno-exceptions -fno-rtti"

DEST="$DEST/$ABI"

FLAGS="$FLAGS --prefix=$DEST"

mkdir -p $DEST

echo $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" --extra-cxxflags="$EXTRA_CXXFLAGS" > $DEST/info.txt

./configure $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" --extra-cxxflags="$EXTRA_CXXFLAGS" | tee $DEST/configuration.txt

[ $PIPESTATUS == 0 ] || exit 1

make clean

make -j4 || exit 1

make install

export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt

export PLATFORM=$NDK/platforms/android-14/arch-arm

PREFIX=../build/stagefright/armeabi-v7a

#合并包

$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-ld -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -L$PREFIX/lib -soname libffmpeg.so -shared -nostdlib -Bsymbolic --whole-archive --no-undefined -o $PREFIX/libffmpeg.so libavcodec/libavcodec.a libavfilter/libavfilter.a libswresample/libswresample.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a -lc -lm -lz -ldl -llog --dynamic-linker=/system/bin/linker $PREBUILT/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux+ndk静态编译,Linux+NDK编译ffmpeg遇到的问题 的相关文章

  • Android AutoCompleteTextView实现自动补全

    辛苦堆砌 转载请注明出处 谢谢 最近工作用到了自动补全 这里做一个简单记录 首先上我们的布局
  • 类函数重载

    函数重载必然发生在同一个作用域 重载函数 本事为不同函数 函数名和参数列表决定函数 函数必须发生在同一个作用域中 include
  • IDEA 编写JDBC 第一个示例

    知心惟有雕梁燕 自来相伴 东风不管琵琶怨 落花吹遍 一 新建一个Module 二 在此Module下新建一个包 在包再建一个包 命名为lib 三 导入mysql驱动 四 将mysql驱动添加到项目的库里 五 代码实现 package Con
  • 协同过滤算法代码

    此算法主要用来推荐的 找出ui uj两个用户同时打过分的课程集合 function getPSet uid ujd select 课程编号 from 评分 where 用户编号 ui and 课程编号 in select 课程编号 from
  • linux使用date命令获取系统时间

    转载自Linux系统date命令的参数及获取时间戳的方法 date指令相关用法示例 date 用法 date OPTION FORMAT date u utc universal MMDDhhmm CC YY ss 直接输入date dat
  • 微信小程序开发之——用户登录-登录流程(1)

    一 概述 新建微信小程序自带用户登录简化 小程序登录流程时序 二 新建微信小程序自带用户登录简化 新建的微信小程序默认有用户登录功能 将多余功能去除后 简化如下 2 1 index wxml
  • 文心一言续写太监小说《名侦探世界的巫师》

    名侦探世界的巫师 是我的童年回忆 总是想着续写一下 但是又没有时间和文笔 文心一言出了 由于目前大模型貌似可以联网 可以尝试搞一波 目录 文章1 前六个故事还能看 后面就是在重复 故事2 辣眼睛 毁童年 非请勿看 故事3 流水账 故事4 其
  • JDK介绍

    JDK JRE和JVM之间的关系 JVM是运行环境 JRE是含运行环境和相关的类库 跟node环境是一个意思 JDK目录介绍 目录名称 说明 bin 该路径下存放了JDK的各种工具命令 javac和java就放在这个目录 conf 该路径下
  • C++学习笔记(十六):对vector进行更多的操作——泛型算法

    先强调一下 这里的泛型算法实际不光光是对vector的操作 对于 顺序容器 均可以 但是什么是顺序容器 我们都知道 容器就是一些特定类型对象的集合 而顺序容器为程序员提供了控制元素存储和访问的能力 这种容器的一个显著的特征 就是容器中元素的
  • ES6.x版本单机三节点配置discovery.zen.ping.unicast.hosts 错误

    问题 在同一个机子利用不同端口搭建3个ES节点 单节点正常运行 集群间无法联通 找不到主节点 表现 cluster uuid 一直没有注册成功 curl 0 0 0 0 29200 name es 01 cluster name es te
  • 浏览器地址栏输入url以后发生了什么

    在浏览器输入url后会发生的过程 1 DNS对域名进行解析 2 建立TCP连接 三次握手 3 发送HTTP请求 4 服务器处理请求 5 返回响应结果 6 关闭TCP连接 四次挥手 7 浏览器解析HTML 8 浏览器布局渲染 1 浏览器对输入
  • 华为OD机试 - 需要打开多少监控器(Java & JS & Python)

    题目描述 某长方形停车场 每个车位上方都有对应监控器 当且仅当在当前车位或者前后左右四个方向任意一个车位范围停车时 监控器才需要打开 给出某一时刻停车场的停车分布 请统计最少需要打开多少个监控器 输入描述 第一行输入m n表示长宽 满足1
  • 按照 C++ 11 标准,数组,指针,传递问题!

    一 一维数组 静态 int array 100 定义了数组array 并未对数组进行初始化 静态 int array 100 1 2 定义并初始化了数组array 动态 int array new int 100 delete array
  • Java 日历的制作 心得 写给自己

    之前已经跟着老师做过一次这个日历 但是时间一久便又拿出来自己再复习一遍 果然不出所料 已经做不出来了 而且因为在学习的时候使用的是Myeclipse 其中话中操作是由软件自己操作的 每写出一句代码软件也会自动提示哪里有问题 半傻瓜式的操作果
  • HTML5的多个video标签:截取视频源的封面图poster,监听视频播放状态的功能;

    在日常项目中 html5的video标签还是比较常用到的 开发过程中 我们都会使用到 通过监听video标签的播放 暂停 停止等等来使用 我们是否也会遇到过 有些浏览器在显示这标签 兼容不太友好 video标签的封面是一层黑色的 ok 那么
  • git-基本操作-1

    1安装 window上安装git 官网直接下载 下载完成后需要在git bash命令行中输入 git config global user name yourname git config global user email yourema
  • 非常详细的小程序搜索历史功能

    前言 我们在进行一些项目开发时 很有可能会涉及到在搜索框中搜索某一个词条 从而进行相应的检索 在这里就会出现一个优化功能 我们在搜索后的某一个词条 我希望能够显示在历史记录中 这样一个小的tip 可以给用户带来更高的使用体验 历史记录并不会
  • goland环境配置

    goland modules环境配置 下载和安装goland 环境配置 配置环境变量GOPATH 配置go modules GOPROXY代理的系统变量 工程目录中新建三个工作目录 goland中启用go modules 新建一个go程序
  • 浅谈图数据库

    本文主要讨论图数据库背后的设计思路 原理还有一些适用的场景 以及在生产环境中使用图数据库的具体案例 从社交网络谈起 下面这张图是一个社交网络场景 每个用户可以发微博 分享微博或评论他人的微博 这些都是最基本的增删改查 也是大多数研发人员对数

随机推荐

  • 【电子技术】什么是LFSR?

    目录 0 前言 1 数学基础 1 1 逻辑异或 1 2 模2乘法 和 模2除法 2 线性反馈移位寄存器LFSR 3 抽头和特征多项式 4 阶线性反馈移位寄存器实例 0 前言 线性反馈移位寄存器 Linear Feedback Shift R
  • mysql jdbc 实现读写分离

    这种方式直接在代码级别实现了mysql 读写分离 很简单 只需要改一下配置文件 就搞定了 是不是很嗨 jdbc driverClassName com mysql jdbc ReplicationDriver jdbc url jdbc m
  • Windows10安装Markdown安装教程(超级详细)

    markdown其实就是我们平常写博客的地方 下面我来详细介绍它的安装教程 首先到官网去安装 markdown 点击download 我反正点击download后它自动就下载了 然后下载好后是安装包 双击 然后一直next 最后它会跳出来
  • 被火车撞了都不能忘记的几道题(你会了吗?)

    目录 一 删除有序链表中的重复元素I 二 删除有序链表重复元素II 三 环形单链表中插入一个元素 四 单链表翻转II 五 奇偶链表 一 删除有序链表中的重复元素I 1 对应牛客网链接 删除有序链表中重复的元素 I 牛客题霸 牛客网 nowc
  • 吴恩达机器学习笔记1:手写linear regression

    最近手写了linear regression 有以下几点收获 做batch gradient descent时 注意每一轮迭代要使用同一个error同时更新所有参数 归一化的时候 要注意记录相应的均值和方差 后续对新样本做预测时也需要使用这
  • OpenHarmony 3.1 Beta版本关键特性解析——探秘隐式查询

    以下内容来自开发者分享 不代表 OpenHarmony 项目群工作委员会观点 徐浩 隐式查询是 OpenAtom OpenHarmony 以下简称 OpenHarmony 的一个基础能力 被广泛应用于各种应用中 如视频播放 阅读器播放等 应
  • 【优化】Spring热部署Devtools:不用每次修改一点点就重启Spring

    第一步 add dev
  • linux ip add address,Linux IPv6 地址配置

    添加IPV6地址 ip 6 addr add dev ip 6 addr add 2001 0db8 0 f101 1 64 dev eth0 ifconfig inet6 add ifconfig eth0 inet6 add 2001
  • nacos 部署 Could not retrieve transation read-only status server

    nacos 低版本 部署的时候 mysql 数据库版本高于驱动时 数据操作时 会报 Unknown system variable tx read only Could not retrieve transation read only s
  • 测试udp服务的端口是否可用

    测试tcp服务的端口是否可用 可以使用 telnet ip port 但是如果这个用在upd服务上 就会报错 因为telnet走的是tcp协议 比如说192 168 80 131在8888端口上上启了个udp的服务 这时使用telnet 1
  • 【快速选择算法】O(n)时间复杂度

    快速选择的期望时间复杂度为O n 最坏时间复杂度为O n 2 当每次划分只划分为n 1个和1个时 由于划分时间复杂度为O n 最坏时间复杂度为O n 2 void quickselect vector
  • statsmodels.tsa.arima.model.ARIMA用户手册(中文)(statsmodels包)

    0 前言 class statsmodels tsa arima model ARIMA endog exog None order 0 0 0 seasonal order 0 0 0 0 trend None enforce stati
  • SpringSecuit详解,写的很好

    转自 https www jianshu com p 08cc28921fd0 8 6 Spring Boot集成Spring Security 开发Web应用 对页面的安全控制通常是必须的 比如 对于没有访问权限的用户需要转到登录表单页面
  • 3.基于STM32C8T6的四旋翼无人机的飞控制作----理论准备3,四旋翼姿态控制理论

    4 四旋翼姿态控制理论 四旋翼的姿态控制理论是真正动手前必须学习的一部分理论 要先明白如何通过控制四个电机来控制飞机姿态 才明白如何编写控制程序 姿态控制要简单分为两部分 第一部分为飞行参数及作用概念 第二部分为PID控制理论 第一部分 飞
  • 由问题引发的线程栈空间探究

    起因 在一段C 程序中使用sprintf函数 程序运行时挂掉了 看了半天觉得程序写得没啥毛病 单独把这段程序搂出来放在main函数里运行结果是正确的 经过大师的指点 怀疑时栈空间不够导致的 网上查了一些资料记录一下 ulimit a查看栈空
  • html足球球面插件,三维效果的黄金足球球面揭示开场片头AE模板

    足球之星 体育运动主题的开场片头包装动画 适用于赛事直播 比赛回顾等等 开场片头将足球的球面进行了揭盖展示 在其中出现的是主要球员的图像 足球的三维效果和质感做得非常不错 这都是在3D软件中创建而成的 也都已经提前进行了预渲染处理 光效部分
  • 程序猿要chatpgpt干掉了?

    如何拥抱被chatpgpt拉开的人工智能大时代 昨天 chatgpt 4 发布了 我看到好多技术圈的人都惶恐着 以后咱们都要失业了 o 和之前差不多的是毫无意外地又引动了一大波舆论 虽然之前的消息发布也是引动 风波 的中心 但是好像4的发布
  • Android 实现隐私政策提示弹窗(完整版)

    android studio版本 2021 2 1 例程名称 pravicydialog 功能 1 启动app后弹窗隐私协议2 屏蔽返回键3 再次启动不再显示隐私协议 本例程的绝大部分代码来自下面链接 因为本人改了一些 增加了一些功能 所以
  • 蓝桥杯python,acwimg,备赛笔记

    目录 一 python基本的语法 二 掌握python标准库 三 acwimg算法课 四 注意事项 四 刷题 五 用python刷算法题中的小技巧 六 完整代码 一 python基本的语法 学到面向对象就差不多了 不需要太深入学习面向对象后
  • linux+ndk静态编译,Linux+NDK编译ffmpeg遇到的问题

    1 修改FFmpeg的configure 下载FFmpeg源代码之后 首先需要对源代码中的configure文件进行修改 由于编译出来的动态库文件名的版本号在 so之后 例如libavcodec so 5 100 1 而Android平台不