文章目录

  • I . 导入 z 库 ( FFMPEG 动态库 与 静态库区别 )
  • II . FFMPEG 库引入顺序
  • III . Android Studio 中 FFMPEG 静态库引入完整 CMakeList.txt 构建脚本

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 库avfilteravformatavcodecavutilswresampleswscale

III . Android Studio 中 FFMPEG 静态库引入完整 CMakeList.txt 构建脚本


# I . 指定 CMake 最低版本
cmake_minimum_required(VERSION 3.4.1)# II . 设置函数库编译
add_library( # 参数 1 : 设置生成的动态库名称native-lib# 参数 2 : 设置生成的函数库类型 : ① 静态库 STATIC ② 动态库 SHAREDSHARED# 参数 3 : 配置要编译的源文件native-lib.cppFFMPEG.cppJavaCallHelper.cppAudioChannel.cppVideoChannel.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-liblog)# 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 库avfilteravformatavcodecavutilswresampleswscale# 日志库${log-lib}#FFMPEG 使用到了 libz 库 , 没有会报错#   FFMPEG 对于 z 的依赖是以动态库的形式进行的#   如果 FFMPEG 是动态库 , 那么可以不链接这个库 , 可以运行时链接这个库#   当前 FFMPEG 是静态库 , 需要在编译时将这个库打包到静态库中#   推荐使用静态库 , 静态库打包出来的库比动态库小很多 , 一倍左右z
)

【Android FFMPEG 开发】Android Studio 中配置 FFMPEG 库注意事项 ( 静态库 链接 libz.so 库 | 导入 FFMPEG 函数库顺序 )相关推荐

  1. Android开发——Android Studio中配置及使用OpenCV示例

    from: http://www.mobile-open.com/2015/86176.html 本文主要讲述了Android Studio中配置及使用OpenCV示例,现在整理出来分享给Androi ...

  2. 【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )

    文章目录 I . 动态库 与 静态库 II . 编译动态库 III. Android Studio 使用第三方动态库 IV . Android Studio 关键代码 V . 博客资源 I . 动态库 ...

  3. 【Android 逆向】Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | Visual Studio 中 SDK 和 NDK 安装位置 )

    文章目录 一.Visual Studio 中安装 " 使用 C++ 的移动开发 " 开发库 二.Visual Studio 中安装的 Android SDK 和 NDK 位置 三. ...

  4. 【Android Protobuf 序列化】Protobuf 使用 ( protobuf-gradle-plugin 插件简介 | Android Studio 中配置插件 | AS 中编译源文件 )

    文章目录 一.protobuf-gradle-plugin 插件简介 二.Android Studio 中配置 protobuf-gradle-plugin 插件 三.Android Studio 中 ...

  5. 怎么配置android远程服务器地址,在 Android studio 中 配置Gradle 进行 “动态编译期间,指定 远程服务器地址 ,生成多个安装包”...

    需求: 在产品开发中,经常需要发布各个版本,每个版本的服务器地址有不同的服务器地址.比如 开发服务器使用 192.168.1.232服务器, 测试服务器使用 192.168.1.245服务器, 正式上 ...

  6. Android Studio中配置Genymotion模拟器

    Android Studio Android Studio下载地址: https://developer.android.google.cn/studio/index.html 百度网盘:https: ...

  7. android studio socket 失败,Android应用开发Android Studio建立Socket连接失败解决方法

    本文将带你了解Android应用开发Android Studio建立Socket连接失败解决方法,希望本文对大家学Android有所帮助. < Android Studio建立Socket连接失 ...

  8. android studio获取数字签名,Android应用开发Android Studio数字签名打包apk图文步骤教程...

    本文将带你了解Android应用开发Android Studio数字签名打包apk图文步骤教程,希望本文对大家学Android有所帮助. Android Studio数字签名打包release版apk ...

  9. android程序包不存在,Android应用开发Android studio 错误: 程序包 不存在

    本文将带你了解Android应用开发Android studio 错误: 程序包 不存在,希望本文对大家学Android有所帮助. " Android studio 错误: 程序包 不存在 ...

  10. Eclipse IDE 使用技巧和Android App 开发环境搭建和配置

    写在前面: 本片文章只是记录了自己学习时的一些笔记,纯粹是为了自己后面方便查找,片言碎语,不适合大家浏览,请大家不要参考这篇文章. 正文: Eclipse IDE 使用技巧               ...

最新文章

  1. Go 学习笔记(36)— 基于Go方法的面向对象(封装、继承、多态)
  2. 一文看懂机器学习中的常用损失函数
  3. matlab常用函数——软件常用函数
  4. Linux时间date与timedatectl
  5. double类型字符串转换成一个纯数字字符串和一个小数点位数的c++代码
  6. ASP.NET会话(Session)模式
  7. 面试官: MySQL 数据库的优化,你知道有哪些?
  8. winows8.1或winows7 64bit 安装Itunes 64bit 11.1.3 无法打开一直停止工作的解决办法
  9. matlab内维尔差值,基于IGS精密星历的卫星位置内插方法比较
  10. eclipse合并svn分支方法
  11. 湘源控规计算土石方流程
  12. windows自动更新下载的目录
  13. MYCNCART博客系统
  14. phpstorm License Server激活 官网下载版本直接激活
  15. 城市微光,大抵如此--爱摸鱼的美工(15)
  16. 学生个人网页设计作品 HTML+CSS+JavaScript仿小米商城(8页) 学生个人网页模板 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计代做
  17. 【MM小贴士】SAP 采购申请与采购订单的匹配关系
  18. 串口TXD和RXD的线序导致不能通信的问题
  19. 你对三农金融了解多少,三农又会带来什么
  20. 智能优化算法——哈里鹰算法(Matlab实现)

热门文章

  1. Java中的String数据类型归纳
  2. 心得体悟帖---回避型人格
  3. 黑马lavarel教程---9、缓存操作
  4. 报错:org.apache.hadoop.hive.metastore.HiveMetaException: Failed to get schema version.
  5. 2017-2018-1 2015335 《信息安全系统设计基础》 第4周课上实践 (新补的,但不完整)...
  6. 随机数的产生可用于的场景验证码 密码
  7. Robot Perception for Indoor Navigation《室内导航中的机器人感知》
  8. 云计算入门学习资料,linux云计算学习大纲
  9. 2.25-3.2 周记
  10. .net remoting在wpf中的应用