在IOS上使用jrtplib

发布时间 2023-04-23 17:19:35作者: 幻cat

  最近因项目需求,需要在IOS上使用jrtplib,故在此记录编译流程。

  正统流程应通过cmake编译,但因笔者对于不甚了解,因此做了一些取巧的操作。

 

  本文基于jrtplib 3.11.2和jthread 1.3.3 

 

一、编译jthread

  首先在github上下载jthread源码:https://github.com/j0r1/JThread

  然后新建一个IOS 静态库工程,工程名称笔者命名为了JThread。

 

  然后像项目中添加源文件如下:

   在此处笔者添加了一个文件 jthreadconfig.h。但是事实上源码中并没有这个文件,而是jthreadconfig.h.in。

  事实上,这个.h文件就是由这个.in文件通过cmake生成的。

1.1 生成jthreadconfig.h文件

  笔者这儿没有使用cmake,而是通过直接修改.in文件内容后修改文件后缀生成的.h文件。

  将.in 文件内容更换如下:

#ifndef JTHREADCONFIG_H
#define JTHREADCONFIG_H

#define JTHREAD_IMPORT
#define JTHREAD_EXPORT
#ifndef JTHREAD_COMPILING
    #define JTHREAD_IMPORTEXPORT JTHREAD_EXPORT
#else
    #define JTHREAD_IMPORTEXPORT JTHREAD_IMPORT
#endif /* JTHREAD_COMPILING */



#endif /* JTHREADCONFIG_H */

1.2 编译

  选择需要的架构即可执行编译。编译的结果默认会放在 /Users/${username}/Library/Developer/Xcode/DerivedData/下的JThread相关文件夹中。

二、编译jrtplib

  与jthread相同,jrtplib中有几个文件也是通过cmake生成而来的:

    • rtpconfig.h
    • rtplibraryversioninternal.h
    • rtptypes.h

  可按照如下修改文件内容,并修改文件后缀。

2.1 生成rtptypes.h

  修改.in文件内容为:

#include "rtpconfig.h"

#include <stdint.h>
#include <sys/types.h>

2.2 生成rtplibraryversioninternal.h

  修改.in文件内容为:

#ifndef RTPLIBRARYVERSIONINTERNAL_H

#define RTPLIBRARYVERSIONINTERNAL_H

#define JRTPLIB_VERSION_MAJOR 3
#define JRTPLIB_VERSION_MINOR 11
#define JRTPLIB_VERSION_DEBUG 2

#endif // RTPLIBRARYVERSIONINTERNAL_H

  这儿只是用于标识库的版本

2.3 生成rtpconfig.h

  修改.in文件内容为:

#ifndef RTPCONFIG_UNIX_H

#define RTPCONFIG_UNIX_H

#ifndef JRTPLIB_UNUSED
/**
 * Provide a macro to use for marking method parameters as unused.
 */
#define JRTPLIB_UNUSED(x) (void)(x)
#endif // JRTPLIB_UNUSED

#define JRTPLIB_IMPORT
#define JRTPLIB_EXPORT
#ifdef JRTPLIB_COMPILING
    #define JRTPLIB_IMPORTEXPORT JRTPLIB_EXPORT
#else
    #define JRTPLIB_IMPORTEXPORT JRTPLIB_IMPORT
#endif // JRTPLIB_COMPILING

#define JRTPLIB_NO_COPY(ClassName) \
    private: \
        ClassName(const ClassName &); \
        ClassName &operator=(const ClassName &);

#define RTP_HAVE_SYS_FILIO

#define RTP_HAVE_SYS_SOCKIO

// Little endian system

#define RTP_SOCKLENTYPE_UINT

#define RTP_HAVE_SOCKADDR_LEN

#define RTP_SUPPORT_IPV4MULTICAST

#define RTP_SUPPORT_THREAD

#define RTP_SUPPORT_SDESPRIV

#define RTP_SUPPORT_PROBATION

#define RTP_SUPPORT_GETLOGINR

#define RTP_SUPPORT_IPV6

#define RTP_SUPPORT_IPV6MULTICAST

#define RTP_SUPPORT_IFADDRS

#define RTP_SUPPORT_SENDAPP

#define RTP_SUPPORT_MEMORYMANAGEMENT

// No support for sending unknown RTCP packets

#define RTP_SUPPORT_NETINET_IN

// Not using winsock sockets

// No QueryPerformanceCounter support

// No ui64 suffix

// Stdio snprintf version

#define RTP_HAVE_ARRAYALLOC

// No rand_s support

// No strncpy_s support

// No SRTP support

// No SRTP2 support

#define RTP_HAVE_CLOCK_GETTIME

#define RTP_HAVE_POLL

// No 'WSAPoll' support

#define RTP_HAVE_MSG_NOSIGNAL

#endif //RTPCONFIG_UNIX_H

  这儿的内容是根据源文件下的最外层CMakeLists.txt的配置生成的。其中一些宏定义是通过源文件下的test文件夹下的测试工程确定是否添加的。

  需要注意的有大小端宏定义问题,具体看系统是使用大端模式还是小端模式。笔者这儿使用了小端模式,因为手机都是小端模式。

2.4 添加文件

  同JThread工程一样,使用Xcode创建一个jrtplib的IOS静态库工程,然后添加源文件。

  笔者在添加源文件时,没有选择添加extratransmitters文件夹中的rtpfaketransmitter。因为笔者不需要使用到。

2.5 添加依赖jThread

  关于添加静态库jThread的以来有三步

    1. 添加头文件搜索路径
    2. 添加库文件搜索路径
    3. 添加具体链接的二进制库文件(相当于vs中的附加依赖项)

2.6 编译

  选择需要的架构即可执行编译。编译的结果默认会放在 /Users/${username}/Library/Developer/Xcode/DerivedData/下的JRTPLIB相关文件夹中。