基于c++实现RTSP/RTMP推流组件PushStream简介

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hiwubihe/article/details/84639975

技术在于交流、沟通,转载请注明出处并保持作品的完整性。

原文:https://blog.csdn.net/hiwubihe/article/details/84639975 

[本系列相关文章]

本篇介绍一个基于C++开发的RTSP/RTMP推流组件PushStream,PushStream推流基础组件是一款推送流媒体音/视频流给标准RTSP流媒体服务器 (如EasyDarwin、Wowza) 或者RTMP流媒体服务器 (如Nginx) 的流媒体推送库,目前开发版本支持(Windows/Linux(32 & 64)等平台,针对该组件进行二次开发可以避免了稍显复杂的RTSP,RTMP流程,及H264,AAC,FLV等音视频编解码,封装格式,以及如何把这些编码格式的音视频打包等细节处理,只需要调用结构API接口,即可非常轻松稳定的把音视频推送到流媒体,以便流媒体进行进行处理和转发。

总体架构

                                                         

                                     

PushStream组件调用方便性

 1.不需要了解和流媒体服务器信令交互过程,RTSP/RTMP协议是怎么信令交互的,而且不同服务器信令还有所不同,如EasyDarwin和Wowza服务器信令有细微区别,搞清楚这些都是需要时间成本的。

2.不需要了解H264,AAC,G711A/U等常见的编码格式,是怎么打包成RTP/RTCP。

3.上送流如果是通过其他协议还需要解封装,如果音视频流是通过GB28182上送的PS流,还需要了解PS流封装格式,需要解封装。

4.上送RTMP服务器,需要了解RTMP信令交互过程,RTMP协议上送流是通过封装成FLV格式,需要了解FLV格式。

5.多轨道上送音视频给服务器,还需要在上送的时候做好音视频同步问题。

接口调用流程

                                            

API接口介绍

  1. PSTREAM_SetLogCallBack 设置日志回调,把PushStream库日志反馈在用户程序的日志里,方便调试库。

/**************************************************************************
* Function Name  : PSTREAM_SetLogCallBack
* Description    : 设置库日志回调
* Parameters     : pLogFunc	(日志回调函数)	
* Parameters     : pUserData(日志回调用户数据)
* Return Type    : void
* Last Modified  : wubihe
***************************************************************************/

DLLEXPORT void  WINAPI PSTREAM_SetLogCallBack(PSTREAM_LogCBFun pLogFunc,	void* pUserData);

  2. PSTREAM_CreatePushHandle 创建推流句柄,应用程序需要推送一路流就需要创建一个推流句柄,返回句柄标志该路流,传入后续API中。需要传入参数流转发类型,这里有三种PSTREAM_RTSP_RTP_TCP(RTSP/RTP OVER TCP),PSTREAM_RTSP_RTP_UDP(RTSP/RTP OVER UDP),和PSTREAM_RTMP_FLV(RTMP/FLV)传输协议。

/**************************************************************************
* Function Name  : PSTREAM_CreatePushHandle
* Description    : 创建推流流句柄
* Parameters     : eType 流传输类型
* Return Type    : 0 非法
* Last Modified  : wubihe
***************************************************************************/
DLLEXPORT PSTREAM_HANDLE  WINAPI  PSTREAM_CreatePushHandle(PSTREAM_TRANS_TYPE eType);

3. PSTREAM_SetMsgCallBack设置某路流消息回调,用于判断视频流传输是否出现异常,进行相关处理。 

/**************************************************************************
* Function Name  : PSTREAM_SetMsgCallBack
* Description    : 设置消息回调
* Parameters     : pMsgFunc	(消息回调函数)	
* Parameters     : pUserData(消息回调用户数据)
* Return Type    : voidp
* Last Modified  : wubihe
***************************************************************************/

DLLEXPORT void  WINAPI PSTREAM_SetMsgCallBack(PSTREAM_HANDLE hHandle ,PSTREAM_MsgCBFun pMsgFunc,	void* pUserData);

4. PSTREAM_AddStream推流器中添加轨道如音频轨道,视频轨道,可以是单轨道也可以是双轨道,需要给点轨道编码类型。传入参数需要轨道的编码类型,目前支持H264/G711A/G711U/AAC,后续有新要求编码类型可以添加。H265由于目前RTP协议支持不够,所以没有添加。 

/**************************************************************************
* Function Name  : PSTREAM_AddStream
* Description    : 推流器添加流
* Parameters     : iHandle	   推流器句柄
* Parameters     : eCodeType   流编码类型
* Return Type    : int 流句柄 >=0 为合法句柄,<0非法 最大支持2路
* Last Modified  : wubihe
***************************************************************************/
DLLEXPORT int  WINAPI  PSTREAM_AddStream(PSTREAM_HANDLE iHandle,	PSTREAM_ENCODE_TYPE eCodeType);

5.  PSTREAM_DataInput 用户从编码器或者网络流中接受到数据,需要不断的调用该接口把数据送给PushStream,PushStream内部会对数据流的结构进行分析,这样用户完全不需要知道数据流的格式,快速完成开发。 传入参数需要传入推流器句柄,轨道句柄和编码数据。

/**************************************************************************
* Function Name  : PSTREAM_DataInput
* Description    : 推流器数据输入
* Parameters     : iHandle		句柄
* Parameters     : iStream		流句柄
* Parameters     : pDate		帧信息
* Parameters     : iLen			帧长度
* Return Type    : bool 
* Last Modified  : wubihe
***************************************************************************/
DLLEXPORT bool  WINAPI PSTREAM_DataInput(PSTREAM_HANDLE iHandle,int iStream,unsigned char *pDate,int iLen);

6.  PSTREAM_StartPush调用该接口,程序向知道URL推送数据,在该接口调用之前用户需要 PSTREAM_DataInput数据给PushStream,PushStream内部完成结构探测,如保存SPS/PPS信息等。所以这个接口可能需要调用多次,失败在循环调用即可。 传入参数需要URL,URL需要和创建的推流器一致,RTSP推流器必须传入RTSP的URL,RTMP同样道理。 

/**************************************************************************
* Function Name  : PSTREAM_StartPush
* Description    : 推流器开始推流,调用该接口成功前提是本地数据探测准备好
* Parameters     : iHandle			句柄
* Parameters     : pUrl				推流URL
* Parameters     : eTransProtocal	推流传输格式(RTMP/FLV,RTSP/TCP等)
* Return Type    : int				依据错误代码 E_PUSH_NOTREADY需要等待一会调用
* Last Modified  : wubihe
***************************************************************************/
DLLEXPORT int  WINAPI PSTREAM_StartPush(PSTREAM_HANDLE iHandle,unsigned char *pUrl);

7. PSTREAM_StopPush推流器停止推流。 

/**************************************************************************
* Function Name  : PSTREAM_StopPush
* Description    : 推流器停止推流
* Parameters     : iHandle			句柄
* Return Type    : bool 
* Last Modified  : wubihe
***************************************************************************/
DLLEXPORT bool  WINAPI PSTREAM_StopPush(PSTREAM_HANDLE iHandle);

 8. PSTREAM_DestroyPushHandle销毁推流器句柄。 

/**************************************************************************
* Function Name  : PSTREAM_DestroyMuxHandle
* Description    : 推流器销毁
* Parameters     : iHandle		推流器句柄
* Return Type    : void 
* Last Modified  : wubihe
***************************************************************************/
DLLEXPORT void WINAPI  PSTREAM_DestroyPushHandle(PSTREAM_HANDLE iHandle);

接口头文件

/*******************************************************************************
Copyright (c) wubihe Tech. Co., Ltd. All rights reserved.
--------------------------------------------------------------------------------
 
Date Created:	2014-10-25
Author:	        wubihe QQ:1269122125 Email:[email protected]
Description:	推流工具库,协议支持RTMP/RTSP

--------------------------------------------------------------------------------
Modification History
DATE          AUTHOR          DESCRIPTION
--------------------------------------------------------------------------------

********************************************************************************/
#ifndef IPUSHSTREAM_H_
#define IPUSHSTREAM_H_

#ifdef WIN32
#include <windows.h>
#include <windef.h>
#ifdef PUSHSTREAM_EXPORTS
#define DLLEXPORT __declspec(dllexport)
//#define   DLLEXPORT
#else
#define DLLEXPORT
#endif
#else
#define DLLEXPORT
#define WINAPI
#endif //WIN32

#include <string>
///////////////////////////////////////////////////////////////////////////
#ifdef __cplusplus
extern "C"
{
#endif

/******************************************************************************
PushSteam.dll宏定义
*******************************************************************************/





/******************************************************************************
PushSteam.dll错误码定义,PushSteam.dll库错误码的范围:0-255
*******************************************************************************/
#define E_PUSH_SUCCESS		(0)				//成功
#define E_PUSH_NOTREADY		(1)				//初始化数据未准备好
#define E_PUSH_CONN_FAILURE	(2)				//连接失败




/******************************************************************************
PushSteam.dll数据结构定义
*******************************************************************************/
///日志级别类型
typedef enum _PSTREAM_LOG_LEVEL
{
	PSTREAM_LOG_TRACE =		0,
	PSTREAM_LOG_DEBUG =		1,                      
	PSTREAM_LOG_INFO  =		2,                      
	PSTREAM_LOG_WARN  =		3,                      
	PSTREAM_LOG_ERROR =		4, 
	PSTREAM_LOG_FATAL =		5
} PSTREAM_LOG_LEVEL;

//流编码类型
typedef enum _PSTREAM_ENCODE_TYPE
{
	PSTREAM_VIDEO_TYPE_H264		=		0,
	PSTREAM_VIDEO_TYPE_H265		=		1,                      
	PSTREAM_AUDIO_TYPE_G711A	=		2,   
	PSTREAM_AUDIO_TYPE_AAC		=		3,
	PSTREAM_STREAM_SUPPORT_NUM	=		4
} PSTREAM_ENCODE_TYPE;

//流传输类型
typedef enum _PSTREAM_TRANS_TYPE
{
	PSTREAM_RTSP_RTP_TCP		=		0,
	PSTREAM_RTSP_RTP_UDP		=		1,                      
	PSTREAM_RTMP_FLV		=		2,   
	PSTREAM_TRANS_SUPPORT_NUM	=		3
} PSTREAM_TRANS_TYPE;


//消息回调类型
typedef enum _PSTREAM_MSG_TYPE
{
	PSTREAM_MSG_TYPE_OFFLINE	=		0,                      
	PSTREAM_MSG_SUPPORT_NUM		=		1
} PSTREAM_MSG_TYPE;

//帧信息
typedef struct tagPStremFrameInfo
{
	//帧数据
	unsigned char * pFrame		;
	//帧大小
	int		iFrameLen	;
	//帧PTS
	LONG64		lPts		; 
	//帧DTS
	LONG64		lDts            ;           
} PStremFrameInfo;

//推流器句柄
typedef LONG64	PSTREAM_HANDLE;

/****************************************************************************
                        General Callback
                          通用回调接口
****************************************************************************/
typedef void(CALLBACK *PSTREAM_LogCBFun)(PSTREAM_LOG_LEVEL nLogLevel, const char *szMessage, void* pUserData );  
typedef void(CALLBACK *PSTREAM_MsgCBFun)(PSTREAM_HANDLE lHandle, PSTREAM_MSG_TYPE eType,void* pUserData );  

/****************************************************************************
                        General System Interface
                            通用系统接口
****************************************************************************/

/**************************************************************************
* Function Name  : PSTREAM_SetLogCallBack
* Description    : 设置库日志回调
* Parameters     : pLogFunc	(日志回调函数)	
* Parameters     : pUserData(日志回调用户数据)
* Return Type    : void
* Last Modified  : wubihe
***************************************************************************/

DLLEXPORT void  WINAPI PSTREAM_SetLogCallBack(PSTREAM_LogCBFun pLogFunc,	void* pUserData);


/**************************************************************************
* Function Name  : PSTREAM_CreateMuxHandle
* Description    : 创建推流流句柄
* Parameters     : eType 流传输类型
* Return Type    : 0 非法
* Last Modified  : wubihe
***************************************************************************/
DLLEXPORT PSTREAM_HANDLE  WINAPI  PSTREAM_CreatePushHandle(PSTREAM_TRANS_TYPE eType);


/**************************************************************************
* Function Name  : PSTREAM_SetMsgCallBack
* Description    : 设置消息回调
* Parameters     : pMsgFunc	(消息回调函数)	
* Parameters     : pUserData(消息回调用户数据)
* Return Type    : voidp
* Last Modified  : wubihe
***************************************************************************/

DLLEXPORT void  WINAPI PSTREAM_SetMsgCallBack(PSTREAM_HANDLE hHandle ,PSTREAM_MsgCBFun pMsgFunc,	void* pUserData);



/**************************************************************************
* Function Name  : PSTREAM_AddStream
* Description    : PS流复用器中添加流
* Parameters     : iHandle	   推流器句柄
* Parameters     : eCodeType   流编码类型
* Return Type    : int 流句柄 >=0 为合法句柄,<0非法 最大支持2路
* Last Modified  : wubihe
***************************************************************************/
DLLEXPORT int  WINAPI  PSTREAM_AddStream(PSTREAM_HANDLE iHandle,	PSTREAM_ENCODE_TYPE eCodeType);

/**************************************************************************
* Function Name  : PSTREAM_DataInput
* Description    : 推流器数据输入
* Parameters     : iHandle		句柄
* Parameters     : iStream		流句柄
* Parameters     : pDate		帧信息
* Parameters     : iLen			帧长度
* Return Type    : bool 
* Last Modified  : wubihe
***************************************************************************/
DLLEXPORT bool  WINAPI PSTREAM_DataInput(PSTREAM_HANDLE iHandle,int iStream,unsigned char *pDate,int iLen);
/**************************************************************************
* Function Name  : PSTREAM_StartPush
* Description    : 推流器开始推流,调用该接口成功前提是本地数据探测准备好
* Parameters     : iHandle			句柄
* Parameters     : pUrl				推流URL
* Parameters     : eTransProtocal	推流传输格式(RTMP/FLV,RTSP/TCP等)
* Return Type    : int				依据错误代码 E_PUSH_NOTREADY需要等待一会调用
* Last Modified  : wubihe
***************************************************************************/
DLLEXPORT int  WINAPI PSTREAM_StartPush(PSTREAM_HANDLE iHandle,unsigned char *pUrl);


/**************************************************************************
* Function Name  : PSTREAM_StopPush
* Description    : 推流器停止推流
* Parameters     : iHandle			句柄
* Return Type    : bool 
* Last Modified  : wubihe
***************************************************************************/
DLLEXPORT bool  WINAPI PSTREAM_StopPush(PSTREAM_HANDLE iHandle);

/**************************************************************************
* Function Name  : PSTREAM_DestroyMuxHandle
* Description    : 推流器销毁
* Parameters     : iHandle		推流器句柄
* Return Type    : void 
* Last Modified  : wubihe
***************************************************************************/
DLLEXPORT void WINAPI  PSTREAM_DestroyPushHandle(PSTREAM_HANDLE iHandle);
#ifdef __cplusplus
}
#endif



#endif /* IPUSHSTREAM_H_ */

                                           

                                               

                                    

猜你喜欢

转载自blog.csdn.net/hiwubihe/article/details/84639975