技术在于交流、沟通,转载请注明出处并保持作品的完整性。
原文: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.多轨道上送音视频给服务器,还需要在上送的时候做好音视频同步问题。
PushStream组件目前支持协议
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/H265/G711A/G711U/AAC,后续有新要求编码类型可以添加。
/**************************************************************************
* 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
#include
#ifdef PUSHSTREAM_EXPORTS
#define DLLEXPORT __declspec(dllexport)
//#define DLLEXPORT
#else
#define DLLEXPORT
#endif
#else
#define DLLEXPORT
#define WINAPI
#endif //WIN32
#include
///////////////////////////////////////////////////////////////////////////
#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_ */