接口协议适用平台:(Windows&Linux&ARM)

1. SDK描述

EasyRTMP是一套调用简单、功能完善、运行高效稳定的RTMP功能组件,经过多年实战和线上运行打造,支持RTMP推送断线重连、环形缓冲、智能丢帧、网络事件回调,支持Windows、Linux、arm(hisiv100/hisiv200/hisiv300/hisiv400/etc..)、Android、iOS平台,支持市面上绝大部分的RTMP流媒体服务器,包括Wowza、Red5、ngnix_rtmp、crtmpserver等主流RTMP服务器,能够完美应用于各种行业的直播需求,手机直播、桌面直播、摄像机直播、课堂直播等等方面!

2. API接口函数定义

2.1 SDK激活

函数:
Easy_API int Easy_APICALL EasyHLS_Activate(char *license);

参数:
license: SDK激活码,可在 www.pvale.com 在线获取,或联系我们。

返回:
返回值为第三节的EASY_ACTIVATE_ERR_CODE_ENUM枚举类型

2.2 创建HLSSession 返回为句柄值

函数:
Easy_API Easy_HLS_Handle Easy_APICALL EasyHLS_Session_Create(int nCapacity, bool bAllowCache, int version);

参数:
nCapacity: 直播M3U8中包含多少个ts的描述
bAllowCache: 是否允许换成,默认设置成0
version: M3U8版本号,默认设置成3

返回:
返回值为HLS的handle

2.3 设置HLS参数

函数:
Easy_API void Easy_APICALL EasyHLS_ResetStreamCache(Easy_HLS_Handle handle, const char strRootDir, const char strSubDir, const char* strMediaName, int nTargetDuration, int nFirstTSIFrameCount = 0);

参数:
handle: EasyHLS_Session_Create返回值
strRootDir: 设置切片根目录
strSubDir: 设置切片子目录
strMediaName: HLS流名称
nTargetDuration:每个ts的时长,单位秒
nFirstTSIFrameCount:第一个ts中关键帧个数,demo中设置为2或者1

2.4 获取M3U8信息

函数:
Easy_API const char* Easy_APICALL EasyHLS_GetM3U8File(Easy_HLS_Handle handle);

参数:
handle: EasyHLS_Session_Create返回值

2.5 传入视频数据

函数:
Easy_API int Easy_APICALL EasyHLS_VideoMux(Easy_HLS_Handle handle, unsigned int uiFrameType, unsigned char *data, int dataLength, unsigned long long pcr, unsigned long long pts, unsigned long long dts);

参数:
handle: EasyHLS_Session_Create返回值
uiFrameType: 视频帧类型,关键帧或P帧等 TS_TYPE_PES_VIDEO_I_FRAME、TS_TYPE_PES_VIDEO_P_FRAME
data: 帧数据
dataLength: 帧长度
pcr: TS头信息包含了节目时钟参考PCR(Program Clock Reference),可设置与pts、dts相同
pts: 显示时间戳
dts: 解码时间戳

2.6 传入音频数据

函数:
Easy_API int Easy_APICALL EasyHLS_AudioMux(Easy_HLS_Handle handle, unsigned char *data, int dataLength, unsigned long long pts, unsigned long long dts=~0);

参数:
handle: EasyHLS_Session_Create返回值
data: 帧数据
dataLength: 帧长度
pts: 显示时间戳
dts: 解码时间戳,可与pts相同

2.7 释放HLSSession

函数:
Easy_API void Easy_APICALL EasyHLS_Session_Release(Easy_HLS_Handle handle);

参数:
handle: EasyHLS_Session_Create返回值

3. 结构体描述

typedef enum __EASY_ACTIVATE_ERR_CODE_ENUM
{
EASY_ACTIVATE_INVALID_KEY = -1, /* 无效Key */
EASY_ACTIVATE_TIME_ERR = -2, /* 时间错误 */
EASY_ACTIVATE_PROCESS_NAME_LEN_ERR = -3, /* 进程名称长度不匹配 */
EASY_ACTIVATE_PROCESS_NAME_ERR = -4, /* 进程名称不匹配 */
EASY_ACTIVATE_VALIDITY_PERIOD_ERR= -5, /* 有效期校验不一致 */
EASY_ACTIVATE_PLATFORM_ERR = -6, /* 平台不匹配 */
EASY_ACTIVATE_COMPANY_ID_LEN_ERR= -7, /* 授权使用商不匹配 */
EASY_ACTIVATE_SUCCESS = 0, /* 激活成功 */
}EASY_ACTIVATE_ERR_CODE_ENUM;
/* 视频编码 */
#define EASY_SDK_VIDEO_CODEC_H264 0x1C /* H.264 */
#define EASY_SDK_VIDEO_CODEC_H265 0x48323635 /* H.265 */
#define EASY_SDK_VIDEO_CODEC_MJPEG 0x08 /* MJPEG */
#define EASY_SDK_VIDEO_CODEC_MPEG4 0x0D /* MPEG4 */
/* 音频编码 */
#define EASY_SDK_AUDIO_CODEC_AAC 0x15002 /* AAC */
#define EASY_SDK_AUDIO_CODEC_G711U 0x10006 /* G711 ulaw*/
#define EASY_SDK_AUDIO_CODEC_G711A 0x10007 /* G711 alaw*/
#define EASY_SDK_AUDIO_CODEC_G726 0x1100B /* G726 */
#define EASY_SDK_EVENT_CODEC_ERROR 0x63657272 /* ERROR */
#define EASY_SDK_EVENT_CODEC_EXIT 0x65786974 /* EXIT */
/* 音视频帧标识 */
#define EASY_SDK_VIDEO_FRAME_FLAG 0x00000001 /* 视频帧标志 */
#define EASY_SDK_AUDIO_FRAME_FLAG 0x00000002 /* 音频帧标志 */
#define EASY_SDK_EVENT_FRAME_FLAG 0x00000004 /* 事件帧标志 */
#define EASY_SDK_RTP_FRAME_FLAG 0x00000008 /* RTP帧标志 */
#define EASY_SDK_SDP_FRAME_FLAG 0x00000010 /* SDP帧标志 */
#define EASY_SDK_MEDIA_INFO_FLAG 0x00000020 /* 媒体类型标志*/
/* 视频关键字标识 */
#define EASY_SDK_VIDEO_FRAME_I 0x01 /* I帧 */
#define EASY_SDK_VIDEO_FRAME_P 0x02 /* P帧 */
#define EASY_SDK_VIDEO_FRAME_B 0x03 /* B帧 */
#define EASY_SDK_VIDEO_FRAME_J 0x04 /* JPEG */
/* 连接类型 */
typedef enum __EASY_RTP_CONNECT_TYPE
{
EASY_RTP_OVER_TCP = 0x01, /* RTP Over TCP */
EASY_RTP_OVER_UDP /* RTP Over UDP */
}EASY_RTP_CONNECT_TYPE;
/* 媒体信息 */
typedef struct __EASY_MEDIA_INFO_T
{
Easy_U32 u32VideoCodec; /* 视频编码类型 */
Easy_U32 u32VideoFps; /* 视频帧率 */
Easy_U32 u32VideoQueueSize; /* 视频缓存大小 */
Easy_U32 u32AudioCodec; /* 音频编码类型 */
Easy_U32 u32AudioSamplerate; /* 音频采样率 */
Easy_U32 u32AudioChannel; /* 音频通道数 */
Easy_U32 u32AudioBitsPerSample; /* 音频采样精度 */
Easy_U32 u32AudioQueueSize; /* 音频缓存大小 */
Easy_U32 u32VpsLength; /* H.265格式VPS长度 */
Easy_U32 u32SpsLength; /* SPS数据长度 */
Easy_U32 u32PpsLength; /* PPS数据长度 */
Easy_U32 u32SeiLength; /* SEI信息数据长度 */
Easy_U8 u8Vps[255]; /* VPS数据内容 */
Easy_U8 u8Sps[255]; /* SPS数据内容 */
Easy_U8 u8Pps[128]; /* PPS数据内容 */
Easy_U8 u8Sei[128]; /* SEI数据内容 */
}EASY_MEDIA_INFO_T;
struct EASY_AV_Frame
{
Easy_U32 u32AVFrameFlag; /* 帧标志 视频 or 音频 */
Easy_U32 u32AVFrameLen; /* 帧的长度 */
Easy_U32 u32VFrameType; /* 视频的类型,I帧或P帧 */
Easy_U8 *pBuffer; /* 数据 */
Easy_U32 u32TimestampSec; /* 时间戳(秒)*/
Easy_U32 u32TimestampUsec; /* 时间戳(微秒) */
};
/* 推送事件类型定义 */
enum EASY_RTMP_STATE_T
{
EASY_RTMP_STATE_CONNECTING = 1, /* 连接中 */
EASY_RTMP_STATE_CONNECTED, /* 连接成功 */
EASY_RTMP_STATE_CONNECT_FAILED, /* 连接失败 */
EASY_RTMP_STATE_CONNECT_ABORT, /* 连接异常中断 */
EASY_RTMP_STATE_PUSHING, /* 推流中 */
EASY_RTMP_STATE_DISCONNECTED, /* 断开连接 */
EASY_RTMP_STATE_ERROR
};
enum{
TS_TYPE_PAT = 0x01000000,
TS_TYPE_PMT = 0x02000000,
TS_TYPE_PES = 0x03f00000,
TS_TYPE_PES_AUDIO = 0x03100000,
TS_TYPE_PES_VIDEO_I_FRAME = 0x03200000,
TS_TYPE_PES_VIDEO_P_FRAME = 0x03400000,
TS_TYPE_PES_VIDEO_E_FRAME = 0x03800000,
};