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

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

文章目录

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 库的链接 , 如下 :


image.png


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开发 iOS开发
如何在Android Studio中配置Flutter环境?
如何在Android Studio中配置Flutter环境?
3283 160
|
Android开发 Windows
Android studio 报错Connect to 127.0.0.1:8888 [/127.0.0.1] failed: Connection refused: connect(已解决)
这是一篇关于解决Android Studio报错“Connect to 127.0.0.1:8888 failed: Connection refused”的文章。问题通常因系统代理设置被Android Studio自动保存导致。解决方法是找到系统中Android Studio使用的gradle.properties文件(位于Windows的C:\Users\你的电脑用户名\.gradle或Mac的/Users/.{你的用户目录}/.gradle),删除或注释掉多余的代理配置后保存并重新Sync项目。希望此经验能帮助快速解决同类问题!
3090 36
|
Java Android开发
Android studio中build.gradle文件简单介绍
本文解析了Android项目中build.gradle文件的作用,包括jcenter仓库配置、模块类型定义、包名设置及依赖管理,涵盖本地、库和远程依赖的区别。
1231 19
|
前端开发 Java 编译器
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
729 36
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
703 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
存储 Java 开发工具
Android开发的技术与开发流程
Android开发的技术与开发流程
778 1
|
编解码 Android开发 iOS开发
安卓与iOS开发:平台差异下的技术创新之路
在数字时代的浪潮中,移动应用开发如同两股潮流——安卓与iOS,各自携带着独特的技术生态和文化基因。本文将深入探讨这两大平台的开发环境、编程语言和工具的差异,以及它们如何塑造了不同的用户体验和技术趋势。通过比较分析,我们旨在揭示跨平台开发的可能性和挑战,同时探索未来技术创新的方向。让我们一起跟随代码的足迹,穿越安卓的开放草原和iOS的精密园林,发现那些隐藏在平台差异之下的创新机遇。
316 28
|
安全 Android开发 Swift
安卓与iOS开发:平台差异与技术选择
【8月更文挑战第26天】 在移动应用开发的广阔天地中,安卓和iOS两大平台各占一方。本文旨在探索这两个系统在开发过程中的不同之处,并分析开发者如何根据项目需求选择合适的技术栈。通过深入浅出的对比,我们将揭示各自平台的优势与挑战,帮助开发者做出更明智的决策。
415 5
|
移动开发 搜索推荐 Android开发
安卓与iOS开发:一场跨平台的技术角逐
在移动开发的广阔舞台上,两大主角——安卓和iOS,持续上演着激烈的技术角逐。本文将深入浅出地探讨这两个平台的开发环境、工具和未来趋势,旨在为开发者揭示跨平台开发的秘密,同时激发读者对技术进步的思考和对未来的期待。
|
移动开发 开发工具 Android开发
探索安卓与iOS开发的差异:技术选择的影响
【8月更文挑战第17天】 在移动应用开发的广阔天地中,安卓和iOS两大平台各领风骚。本文通过比较这两个平台的编程语言、开发工具及市场策略,揭示了技术选择对开发者和产品成功的重要性。我们将从开发者的视角出发,深入探讨不同平台的技术特性及其对项目实施的具体影响,旨在为即将步入移动开发领域的新手提供一个清晰的指南,同时给予资深开发者新的思考角度。
315 3

热门文章

最新文章