编译准备
- librtmp依赖 openssl、zlib。
- openssl的编译请看 openssl源码编译。
- zlib的编译请看windows 编译zlib
- rtmpdump源码:RTMPDump
编译过程
- rtmpdump 源码规模不大,并且后续要做跨平台构建,所以自己写CMakeLists.txt 构建。
编译问题
- 问题描述:rtmp_sys.h 与 系统库中 ucrt/errno.h 对 宏EWOULDBLOCK 的定义冲突
问题定位:检查 ucrt/errno.h 发现,如果没有预定义 _CRT_NO_POSIX_ERROR_CODES,则定义 EWOULDBLOCK 。
解决方法:CMakeLists.txt中增加add_definitions(-D_CRT_NO_POSIX_ERROR_CODES)
避免ucrt中预定义。 - 问题描述:rtmp_sys.h 与 系统库中 ucrt/stdio.h 对 宏vsnprintf 的定义冲突
问题定位:检查源码后确认,两份源码对该宏/方法的使用、及参数列表的定义完全一致。
解决方法:考虑到rtmp源码仅有一处宏定义,影响较小,删除 rtmp_sys.h 中 宏vsnprintf的定义。
备注:宏snprintf 存在相同问题。 - 问题描述:“ctx”使用未定义的 struct“hmac_ctx_st”。
问题定位:网上搜了相关问题的解决方案,找到 OpenSSL 1.1.0 Changes,该文档内提及自1.1.0开始,openssl将所有的结构体定义从头文件移至源码文件中。
解决方法:有两种方法- 降级使用1.1.0以下的openssl,我采用该方法。
- 修改rtmp引用的ssl相关接口,更新至1.1.0+的新接口。