基於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_ */