上回书说道:星球专享 | 关于播放器的一次项目实践~~

目前已经完成了项目的创建,是怎样一个项目呢?

首先是播放器 SDK ,也是项目最核心的模块,然后是对 SDK 进行单元测试的模块,最后是使用 SDK 做播放器的可视化项目模块。

项目工程的每个目录介绍已经在上篇文章中讲过了,这里会说一下如何打开项目。

如图所示,1 和 2 代表两个 CMakeLists.txt 文件,其中 1 代表的是 SDK 工程 CMake 配置文件,2 代表的是播放器工程 CMake 配置文件。

图标 3 作为新增的库文件目录,后面会介绍。

项目根目录是作为 SDK 的目录,而 demo 是在根目录下的子目录中,同时 demo 依赖根目录 SDK 的编译结果,这种项目配置在一些开源项目中还是很常见的。

当用 CLion 打开工程时如果选择了根目录下的 CMakeLists.txt 就是 SDK 工程了,选择了 demo 目录下的就是播放器项目了,差别就是在 CLion 中能否有 PlanetPlayerDemo 这个构建,如下图所示:

选择 SDK 工程打开方式时就只有 2 和 3 的选项了,其中 2 是 SDK 的构建,3 是单测的构建,而 1 是播放器打开方式才有的,前期很多时候都只要 SDK 打开方式就行了。


打开工程之后,接下来就要添加 FFmpeg 的依赖了。

这里并不打算讲要如何编译 FFmpeg ,因为一开始就被编译困住了,很难接下来的学习,反而有一种简单的方式直接拿编译好的库就行了。

如果是 Mac 电脑的话,使用 brew 安装 ffmepg ,电脑上就已经有编译好的库了,而且还很全面。

brew install ffmpeg

众所周知,FFmpeg 是有很多编译选项和依赖选项的,那么上面的命令到底指定了哪些依赖呢?

如上图,✅ 和 ❎ 表示的意思很明确了。

另外箭头所指的 url 地址其实就是 brew 安装 ffmpeg 的编译脚本了,里面指定了哪些依赖内容,比如涉及的 x264、x265 就包含在内了。

我们的播放器项目就是在 Mac 上运行的,所以完全可以直接用 brew 安装好的 ffmpeg 库。

如上命令,在 finder 中打开 ffmpeg 的安装目录。

其中 include 目录就是头文件目录,lib 目录里面放着 ffmpeg 的动态库和静态库。

我们要的就是这两个目录里的东西,直接拷出来用,为此我建立了一个仓库,单独存放这些编译好的库文件(只用静态库就行)。

https://github.com/glumes/lib

这个仓库正好对应之前提的图标 3 的目录。

温馨提示:由于我在家用的 M1 Pro 对应 arm64 架构,所以拿出来的库也是 arm64 架构的,如果你用的非 M1 对应的就是 x86_64 架构,这块等我回公司了补上,也可以自己补上。

接下来就是要在工程中链接 FFmpeg 库了。

首先新建了一个 vendor.cmake 作辅助,判断当前系统是什么平台和架构的:

if (CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64")set(arch arm64)
elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")set(arch x64)
endif ()if (WIN32)set(platform win)
elseif (APPLE)set(platform mac)
else ()message(FATAL_ERROR "not support current platform")
endif ()

然后添加链接 FFmpeg 库的方法:

可以看到链接库时用到了上面指定的平台和架构信息,这和我们的目录结构是相互依赖的。

有了这两个方法,在 SDK 工程和播放器工程都可以复用了。

接下来在 SDK 工程中的配置就和平常配置一样了,依赖好 ffmpeg 的库。

set(path ${CMAKE_CURRENT_SOURCE_DIR})# SDK 的头文件
set(PLANET_INCLUDES ./ include src)include(${CMAKE_CURRENT_SOURCE_DIR}/vendor.cmake)# 模拟第三方库依赖
add_subdirectory(3rdparty/test1)
list(APPEND PLANET_INCLUDES 3rdparty/test1/src)add_subdirectory(3rdparty/test2)
list(APPEND PLANET_INCLUDES 3rdparty/test2/src)# 添加 FFmpeg 头文件的依赖
list(APPEND PLANET_INCLUDES ${path}/lib/ffmpeg/${platform}/${arch}/include)
# 自定义方法 链接 ffmpeg 库目录
link_ffmpeg_directory(${path})# SDK 的源文件
file(GLOB_RECURSE PLANET_FILESsrc/*.*)# 编译 SDK 的静态库
add_library(PlanetPlayer STATIC ${PLANET_FILES})# 包含头文件内容
target_include_directories(PlanetPlayer PUBLIC ${PLANET_INCLUDES})# 链接三方库
target_link_libraries(PlanetPlayer  gtest TEST1 TEST2)# 自定义方法 链接 ffmpeg
link_ffmpeg_library(PlanetPlayer ${path})

同样在播放器项目中也要做配置,依赖 SDK 以及 ffmpeg 的库。

# 设置 SDK 的根目录
set(ProjectPath ${CMAKE_CURRENT_SOURCE_DIR}/../../PlanetPlayer)# 自定义方法 链接 ffmpeg 库目录
link_ffmpeg_directory(${path})# 播放器项目的头文件
set(DEMO_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR}/src)# SDK 提供的头文件
list(APPEND DEMO_INCLUDES ${ProjectPath}/include)# 播放器项目的源文件
file(GLOB_RECURSE DEMO_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.*)# 添加 SDK 的目录
add_subdirectory(${ProjectPath}/ PlanetPlayer)# 播放器项目
add_executable(PlanetPlayerDemo ${DEMO_SOURCE_FILES})# 包含头文件内容
target_include_directories(PlanetPlayerDemo PUBLIC ${DEMO_INCLUDES})# 链接三方库
target_link_libraries(PlanetPlayerDemo PlanetPlayer)# 自定义方法 链接 ffmpeg
link_ffmpeg_library(PlanetPlayerDemo ${path})

这里有个问题,就是既然 SDK 依赖了 ffmepg ,播放器依赖了 SDK ,为什么播放器还有依赖 ffmpeg ?

这是因为编译的 SDK 是个静态库,但是并没有把 ffmpeg 的静态库合并进来,导致播放器仅链接了 SDK 的库会找不到 ffmpeg 函数的符号表,后续再把这个功能补上。

另外也说明了,音视频做工程搭建也是有很多学问的。

以上就是本篇文章的内容了,搞定了库依赖就可以开始撸代码啦!!!

关于播放器实践的专栏,后续大部分进展都会放在知识星球里面了,尤其是源码会在星球内同步更新,当然也会挑一些干货在公众号同步。

目前 音视频开发进阶知识星球 还在让利中,非常低的价格就可以获得业内一线开发人员的答疑解惑

与其在群里面提问石沉大海,不如来星球有问必答,而且这个价格还是管一年的哦,一年的时间可以说是相当划算了。

同时星球内非常欢迎大家提问,尤其是我不会的问题,我会去找业内好朋友请教,既回答了你的问题又帮助了我提高。

想要加入的可以通过扫如下二维码进星球哦,iPhone 用户如果不能访问小程序的话,也可以加我微信 ezglumes 拉你进星球。

一个音视频领域专业问答的小圈子!

推荐阅读:

音视频开发工作经验分享 || 视频版

OpenGL ES 学习资源分享

开通专辑 | 细数那些年写过的技术文章专辑

Android NDK 免费视频在线学习!!!

你想要的音视频开发资料库来了

推荐几个堪称教科书级别的 Android 音视频入门项目

觉得不错,点个在看呗~

星球专享 | 播放器 FFmpeg 依赖库的配置相关推荐

  1. 星球专享 | 关于播放器的一次项目实践~~

    众所周知,前段时间开通了知识星球,旨在为音视频的开发和学习提供更专业的问答氛围. 一个关于音视频领域专业问答的小圈子!! 同时也考虑在星球内出一些干货教程,回馈大家的信任,一番思索之后,决定在星球内出 ...

  2. Android播放器基础封装库PlayerBase

    简述 视频播放是我们开发中比较常见的场景.这两年关于视频方面的热度不断提升,可以说前两年是直播年,今年是小视频年,各种短视频应用铺天盖地.对于视频的业务场景也越来越丰富,功能也越来越多.对于我们开发来 ...

  3. 【物联网智能网关-15】WAV播放器(WinForm+WavPlay库实例)

    2002年在首钢实施焦炉四大机车自动化项目的时候,为了使系统更加友好,便增加了语音提示功能.不过控制设备是PLC,所以语音模块是通过IO进行控制的.接触WAV解码,是在2009年,为TI DM355平 ...

  4. Linux FFmpeg依赖库编译

    凡是用到视频音频的地方,都用到ffmpeg.很多时候我们需要用到另外一些依赖库,来实现一些别的功能,比如使用libfreetype库在视频顶部的指定文件中绘制文本字符串或文本.这里是记录一下FFmpe ...

  5. 帧率ffmepg 摄像头_H5超级播放器+FFmpeg实现摄像头在线查看

    1.m3u8 模式输出,直接输出到指定目录(IIS 站点目录),如下在cmd界面输入命令: ffmpeg -rtsp_transport tcp -i "rtsp://admin:密码@19 ...

  6. 海豚播放器 ffmpeg 编译之经历

    最近从网上下载了海豚播放器后想对这款播放器进行一下研究,但是查看时他的ffmpeg已经编译成功,于是自己想对其编译一下,但是这个编译过程让自己真的很痛苦啊,自己原先编译成功过ffmpeg,但是还是在编 ...

  7. 用QT做一个rtsp / rtmp实时流的播放器 ffmpeg

    老早之前用qt集成ffmpeg 做过一个播放器 那个是基于sdl的命令行窗口 这次做成GUI的方式 直接做成一个播放器  可以输入rtsp或者rtmp流地址 效果图如下 那个长的输入框输入rtsp地址 ...

  8. 【Android 高性能音频】Oboe 播放器开发 ( 为 OpenSL ES 配置参数以获得最佳延迟 | Oboe 音频流 | Oboe 音频设备 )

    文章目录 一.获得最佳延迟 二.Oboe 音频流 三.Oboe 音频设备 Oboe GitHub 主页 : GitHub/Oboe ① 简单使用 : Getting Started ② Oboe 全指 ...

  9. 【Android 安全】DEX 加密 ( 代理 Application 开发 | multiple-dex-core 依赖库开发 | 配置元数据 | 获取 apk 文件并准备相关目录 )

    文章目录 一.multiple-dex-core 依赖库作用 二.配置目录元数据 三.multiple-dex-core 代理 Application 四.获取 apk 文件并准备相关目录 五.相关代 ...

最新文章

  1. CentOS7解决配置静态IP还是会出现动态IP地址的问题
  2. Redis和Memcache的区别总结
  3. Windows服务器上Mqtt服务器EMQX的安装使用
  4. SAP Gateway OData服务的语言决定逻辑 - language determination
  5. 第八届蓝桥杯第一题购物单
  6. nohup启动jar_nohup命令详解
  7. 7款纯CSS3实现的炫酷动画应用
  8. 安川伺服驱动器的常用故障代码
  9. 跨网页的新手引导_用户体验之如何设计一个完美的新手引导流程?(附带案例)...
  10. 2013校园招聘阶段小结
  11. PC端BOSS直聘如何在不点开消息的情况下查看最新消息以及其所招的职位信息
  12. 应对双11挑战,阿里巴巴智能化运维体系演进与建设
  13. linux命令之 whatis
  14. DirectFB代码导读
  15. 三星首次公开投资区块链,布局始于三年前
  16. windows内核情景分析 --- DPC 目的信令点编码
  17. BZOJ2178: 圆的面积并(格林公式)
  18. CTFShow-电子取证篇Writeup
  19. java邮件开发--电子邮件基础
  20. NYIST_ACM工作室寒假周赛2题解

热门文章

  1. mPOS终端的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  2. 一位北大博士的自白:假如大学可以重来,我一定这样上!
  3. 使用Mathematica绘制蔓叶线图形(Cissoid of Diocles)
  4. 笔记连载 | Day19【综合实验】之【数字钟】【Intel Cycle IV FPGA平台验证】
  5. 听说虾皮、斗鱼要求校招生转 Go 了…
  6. 关于计算机的知识和发明家,计算机历史发展历程中国历史上最牛的三大发明家是谁?...
  7. android office转pdf,怎么把安卓手机的PDF转换成Word?3款实用工具分享
  8. Oracle 中文日期转换
  9. 网络常用密码忘记破解方法
  10. 用arduino从零开始做一个《儿童算术智能出题机》——NO.1硬件篇(MAX7219、矩阵键盘、GD3800D、3D打印)