一 下载源码 FFMPEG
https://github.com/FFmpeg/FFmpeg/tree/release/4.3
二 编写脚本
支持https 就必须添加open SSL 的编译 具体可以查看我的另一个关于open SSL 的
然后我们配置的一些路径 涉及 ndk 的一定要查看你用的ndk 版本 是否存在这些路径这是第一步
然后如果支持dash 需要你加入
--enable-demuxer=dash
--enable-libxml2
三 遇到问题 汇总
在打包编译的过程中遇到了很多问题。。。感觉上是一步一个坎。不过坚持下来感觉还是很有收获
- 爆出一些 在你的 什么系统目录中创建文件 但是没权限的问题。
这些问题一般是 NDK 或者 tool chain。等等这些 配置路径 有问题。 才会在你的usr/local/创建文件。不然都是在你的输出目录中创建 的。
-
提示没有libxml-2.0 可能是系统没有安装
尝试mac 终端 执行
brew install libxml2
安装 libxml2
发现它输出了提示 需要配置这些才能找到 libxml2
重新执行脚本编译 还是提示不存在 。继续检查问题
最后还是重新做了libxml2库的交叉编译
libxml2 做完交叉编译。后面更新了 脚本中libxml2的 头文件和 lib 库 位置 解决了问题
交叉编译 遇到的问题。
- python 库找不到。 我自己电脑重新装了个python 。
- FFmpeg 编译提示 libxml2 使用了一些 libm 的 函数。提示libm 找不到。于是 在ffmpeg
的脚本中增加了 -lm 配置。提示交叉编译去寻找libm库 这个 ndk 中有 - --extra-ldflags “... -lm”
最后ffmpeg 终于打出来了 运行时又遇到问题
- 提示找不到 这些库的函数 但是其实打出来的so 是存在这些函数的。
我目前遇到的问题 都是libavdevice 和 libswresample.so 这两个库 中的函数找不到 其他的库没有问题。
解决方案直接使用extern"C"{} 包含用到的这两个库的头文件解决 运行 顺利!!!
由于使用FFPlay 作为解码 但是FFPlay 依赖了SDL2 于是 又是长途跋涉 编译SDL2 。移植到Android 一开始 不知道怎么用。看了网上教程 成功打出了SO 。但是运行时又发现了错误
A signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
2023-07-14 14:34:12.585 32214-32214 DEBUG crash_dump64 A Cause: null pointer dereference
2023-07-14 14:34:12.585 32214-32214 DEBUG crash_dump64 A x0 0000000000000000 x1 000000718cce7f2c x2 0000000000000001 x3 0000000000000046
2023-07-14 14:34:12.585 32214-32214 DEBUG crash_dump64 A x4 0000000000000021 x5 00000000095f2afe x6 0000000000000010 x7 7f7f7f7f7f7f7f7f
2023-07-14 14:34:12.585 32214-32214 DEBUG crash_dump64 A x8 2153fb133faec1e2 x9 2153fb133faec1e2 x10 0000000000000001 x11 0000000000000000
2023-07-14 14:34:12.585 32214-32214 DEBUG crash_dump64 A x12 0000006e0b5f9eb0 x13 000000000000001b x14 0000000000000000 x15 000023fea22b16d4
2023-07-14 14:34:12.585 32214-32214 DEBUG crash_dump64 A x16 00000071967f8740 x17 0000007199d362f4 x18 0000006df69c0000 x19 0000006dfdff7000
2023-07-14 14:34:12.585 32214-32214 DEBUG crash_dump64 A x20 0000006dfdff7000 x21 0000006dfdff7000 x22 0000000000007d8b x23 0000000000007d8b
2023-07-14 14:34:12.585 32214-32214 DEBUG crash_dump64 A x24 0000006e0b5fbcb0 x25 0000006e0b5fbcb0 x26 0000006e0b5fbff8 x27 00000000000fc000
2023-07-14 14:34:12.585 32214-32214 DEBUG crash_dump64 A x28 0000006e0b503000 x29 0000006e0b5fb6a0
2023-07-14 14:34:12.585 32214-32214 DEBUG crash_dump64 A lr 0000006dfdede0c4 sp 0000006e0b5fb680 pc 0000006dfdede0c4 pst 0000000060001000
2023-07-14 14:34:12.585 32214-32214 DEBUG crash_dump64 A backtrace:
2023-07-14 14:34:12.585 32214-32214 DEBUG crash_dump64 A #00 pc 00000000000430c4 /data/app/~~gIZm42M6DxNHr3fUBYvqEQ==/com.example.myapplication-_P36bPxgYfbo3B-q6_6iKg==/lib/arm64/libSDL2.so (Android_JNI_GetManifestEnvironmentVariables+56) (BuildId: f86a91bd5bd4523559afe28c1d3e7f863ec43bb5)
提示SDL 中 so NULLPtr ,结果去源码看了下。这里空指针是没有拿到javaVm 对象。
解决方案 发现需要systemloadlibrary. sdl 的库。因为sdl 通过jnionload 获取javaVm 对象。
于是 System.loadLibrary("SDL2")
RUN 发现又出幺蛾子了。提示找不到SDLActvity waht happened ??? ?? 难道我还的把源码里的java 文件放我项目里吗?
最后妥协了 把SDL 的java 文件放到我的项目里
RUN 发现又出问题了。一堆什么系统native 库报错。最后尝试调用了
SDL.setupJNI()
解决问题。这次RUN 出来了。
附加:
发现 ffmpeg avformat_open_input crash ? 这是什么原因 。
查找crash 崩溃可以按这个链接查看 Android NDK开发崩溃signal 11 (SIGSEGV), code 1 (SEGV_MAPERR) 的解决方法_ 十 月的博客-CSDN博客大家遇到这种问题检查 是否空指针或者野指针