1. 程式人生 > >基於c++實現RTSP/RTMP推流元件PushStream簡介

基於c++實現RTSP/RTMP推流元件PushStream簡介

技術在於交流、溝通,轉載請註明出處並保持作品的完整性。

原文: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_ */