【Android FFMPEG 开发】Android Studio 中配置 FFMPEG 库注意事项 ( 静态库 链接 libz.so 库 | 导入 FFMPEG 函数库顺序 )
2023-06-13 09:17:42 时间
文章目录
I . 导入 z 库 ( FFMPEG 动态库 与 静态库区别 )
1 . 导入 FFMPEG 静态库 会报以下错误 :
libavformat/id3v2.c:1021: error: undefined reference to 'uncompress'
libavformat/rtmpproto.c:1077: error: undefined reference to 'inflateInit_'
libavformat/rtmpproto.c:1087: error: undefined reference to 'inflate'
libavformat/rtmpproto.c:1105: error: undefined reference to 'inflateEnd'
libavformat/http.c:1646: error: undefined reference to 'inflateEnd'
libavformat/http.c:680: error: undefined reference to 'inflateEnd'
libavformat/http.c:681: error: undefined reference to 'inflateInit2_'
libavformat/http.c:686: error: undefined reference to 'zlibCompileFlags'
libavformat/http.c:1437: error: undefined reference to 'inflate'
libavformat/matroskadec.c:1402: error: undefined reference to 'inflateInit_'
libavformat/matroskadec.c:1410: error: undefined reference to 'inflateEnd'
libavformat/matroskadec.c:1417: error: undefined reference to 'inflate'
libavformat/mov.c:5073: error: undefined reference to 'uncompress'
libavformat/swfdec.c:364: error: undefined reference to 'uncompress'
libavformat/swfdec.c:153: error: undefined reference to 'inflateInit_'
libavformat/swfdec.c:121: error: undefined reference to 'inflate'
libavcodec/cscd.c:93: error: undefined reference to 'uncompress'
libavcodec/flashsv.c:126: error: undefined reference to 'inflateInit_'
libavcodec/flashsv.c:259: error: undefined reference to 'deflateInit_'
libavcodec/flashsv.c:261: error: undefined reference to 'deflateBound'
libavcodec/flashsv.c:262: error: undefined reference to 'deflateEnd'
libavcodec/flashsv.c:191: error: undefined reference to 'inflateReset'
libavcodec/flashsv.c:210: error: undefined reference to 'inflateSync'
libavcodec/flashsv.c:160: error: undefined reference to 'deflateInit_'
libavcodec/flashsv.c:166: error: undefined reference to 'deflate'
libavcodec/flashsv.c:167: error: undefined reference to 'deflateEnd'
libavcodec/flashsv.c:169: error: undefined reference to 'inflateReset'
libavcodec/lcldec.c:134: error: undefined reference to 'inflateReset'
libavcodec/mscc.c:141: error: undefined reference to 'inflateReset'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
2 . 问题原因 : 这是由于没有找到 z 库 ( libz.so ) 导致的 ;
3 . 修改方法 : 在 CMakeList.txt 构建脚本中 , 链接库时链接 z 库 ; 在 target_link_libraries 中 , 添加 z 库的链接 , 如下 :
4 . FFMPEG 静态库 : FFMPEG 使用静态库编译需要增加额外配置 , 如上述的 libz.so 库 ; 因为静态库在打包时就需要将所依赖的库都打包到静态库中 ;
5 . FFMPEG 动态库 : 如果使用的是 FFMPEG 动态库 , 则不需要引入 z 库 , 动态库在运行时才链接其用到的函数库 ;
II . FFMPEG 库引入顺序
1 . 问题产生 : Android Studio 中导入 FFMPEG 库后 , 编译时报如下错误 ;
libavformat/utils.c:5548: error: undefined reference to 'av_bitstream_filter_filter'
libavformat/codec2.c:74: error: undefined reference to 'avpriv_codec2_mode_bit_rate'
libavformat/codec2.c:75: error: undefined reference to 'avpriv_codec2_mode_frame_size'
libavformat/codec2.c:76: error: undefined reference to 'avpriv_codec2_mode_block_align'
libavformat/spdifdec.c:63: error: undefined reference to 'av_adts_header_parse'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
2 . FFMPEG 导入顺序 : FFMPEG 中的 6 个模块 之间有相互依赖关系 , 必须按照指定的顺序进行加载 ;
3 . 问题案例分析 : avcodec 模块 ( 音视频编解码 ) 需要依赖 avformat 模块 ( 音频封装格式 ) ; 因此 , 导入 FFMPEG 函数库时 , avcodec 模块 必须在 avformat 模块之后 ;
4 . 推荐顺序 : ① avfilter , ② avformat , ③ avcodec , ④ avutil , ⑤ swresample , ⑥ swscale ;
# FFMPEG 静态库
# 注意这些库的顺序必须按照如下进行 , 否则会报错
# 这些库之间有依赖的关系 , 必须按照顺序加载库 , 如 avcodec 内部依赖 avformat 库
avfilter
avformat
avcodec
avutil
swresample
swscale
III . Android Studio 中 FFMPEG 静态库引入完整 CMakeList.txt 构建脚本
# I . 指定 CMake 最低版本
cmake_minimum_required(VERSION 3.4.1)
# II . 设置函数库编译
add_library( # 参数 1 : 设置生成的动态库名称
native-lib
# 参数 2 : 设置生成的函数库类型 : ① 静态库 STATIC ② 动态库 SHARED
SHARED
# 参数 3 : 配置要编译的源文件
native-lib.cpp
FFMPEG.cpp
JavaCallHelper.cpp
AudioChannel.cpp
VideoChannel.cpp)
# III . 到预设的目录查找 log 库 , 将找到的路径赋值给 log-lib
# 这个路径是 NDK 的 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so
# 不同的 Android 版本号 和 CPU 架构 需要到对应的目录中查找 , 此处是 29 版本 32 位 ARM 架构的日志库
#
# 可以不配置 :
# 可以不进行该配置, 直接在后面的 target_link_libraries 中链接 log 也不会出错
find_library(
log-lib
log)
# IV . 指定 FFMPEG 头文件查找目录
# CMAKE_SOURCE_DIR 指的是当前的文件地址
include_directories(${CMAKE_SOURCE_DIR}/include)
# V . 指定 FFMPEG 静态库
# CMAKE_CXX_FLAGS 表示会将 C++ 的参数传给编译器
# CMAKE_C_FLAGS 表示会将 C 参数传给编译器
# 参数设置 : 传递 CMAKE_CXX_FLAGS C+= 参数给编译器时 , 在 该参数后面指定库的路径
# CMAKE_SOURCE_DIR 指的是当前的文件地址
# -L 参数指定动态库的查找路径
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/lib")
# V . 链接函数库
# 参数 1 : 本构建脚本要生成的动态库目标
# 参数 2 ~ ... : 后面是之前预编译的动态库或静态库 , 或引入的动态库
target_link_libraries(
native-lib
# FFMPEG 静态库
# 注意这些库的顺序必须按照如下进行 , 否则会报错
# 这些库之间有依赖的关系 , 必须按照顺序加载库 , 如 avcodec 内部依赖 avformat 库
avfilter
avformat
avcodec
avutil
swresample
swscale
# 日志库
${log-lib}
#FFMPEG 使用到了 libz 库 , 没有会报错
# FFMPEG 对于 z 的依赖是以动态库的形式进行的
# 如果 FFMPEG 是动态库 , 那么可以不链接这个库 , 可以运行时链接这个库
# 当前 FFMPEG 是静态库 , 需要在编译时将这个库打包到静态库中
# 推荐使用静态库 , 静态库打包出来的库比动态库小很多 , 一倍左右
z
)
相关文章
- android scaleanimation动画,【Android动画九章】-RotateAnimation(旋转动画)和ScaleAnimation(尺寸动画)…[通俗易懂]
- android 置灰不可点击,Android Studio 运行按钮灰色的完美解决方法
- android studio 导入eclipse乱码解决「建议收藏」
- strictmode android,Android中的StrictMode
- Android Studio 安装教程
- 测试android sdk是否安装成功,配置Android SDK
- android studio报错Gradle project sync failed. Please fix your project and try again
- android系统中toast是什么_Android个人资料简单布局
- android toast位置_android studio toast不显示
- 【Android FFMPEG 开发】Android Studio 工程配置 FFMPEG ( 动态库打包 | 头文件与函数库拷贝 | CMake 脚本配置 )
- 【Android RTMP】RTMPDumb 源码导入 Android Studio ( 交叉编译 | 配置 CMakeList.txt 构建脚本 )
- 【CMake】Android Studio 中使用 CMake 编译单个 C++ 源文件 ( 常用的 CMake 命令解析 )
- 【Android 安装包优化】Android 应用中 7zr 可执行程序准备 ( Android Studio 导入可执行 7zr 程序 | 从 Assets 资源文件拷贝 7zr 到内置存储 )
- 【错误记录】Android Studio 配置 AspectJ 报错 ( all buildscript {} blocks must appear before any plugins {} )
- 【Android Gradle 插件】Module 目录下 build.gradle 配置文件 ( android 闭包块配置 | AppExtension 扩展类型参考文档 )
- 【ijkplayer】编译 Android 版本的 ijkplayer ③ ( 执行 compile-ffmpeg.sh clean 命令 | 下载并配置 android-ndk-r10e )
- 【错误记录】Android Studio 编译时 lint 检查报错 ( WARNING: DSL element ‘android.dataBinding.enabled‘ is obsolet )
- 【错误记录】Android Studio 打包 apk 文件报错 ( The destination folder does not exist or is not writeable )
- 【错误记录】Android Studio 集成 ARoute 编译报错 ( 兼容 support 库和 androidx 库 | add ‘tools:replace=“android:appCo )
- 华为手机Android Studio的Logcat无任何内容输出的解决方案详解手机开发
- Android Studio配置Kotlin环境详解手机开发
- Connecting Android to Oracle: The Ultimate Guide for Seamless Integration.(android连接oracle)