视频监控平台-GB28181-码流转换功能
需要讨论和交流联系QQ:123011785
1、将PS流转为ES流,输出为一帧ES流
2、简单组合成一帧,一般为私有流(根据mark标志组合)
3、主要针对payloadtype 98,解复用且组成一帧ES流(根据mark标志组合)
4、将不完整的MPEG4帧组合成一个完整帧
5、将不完整的MPEG2帧组合成一个完整帧
6、主要针对无序的ES流组合成一帧ES流
7、将TS流转为ES流(输出不一定为完整帧)
8、将ES流转为PS流,输入必须为一帧es流
9、将音频流转为PS流
各种码流之间的转换,粘贴一下头文件
#ifndef __STREAMPARSE_H_
#define __STREAMPARSE_H_
#ifndef __int64
#define __int64 long long
#endif
typedef enum
{
STREAMPARSE_NONE,
STREAMPARSE_PSTOES = 96, //将PS流转为ES流,输出为一帧ES流
STREAMPARSE_MERGEAFRAME = 97, //简单组合成一帧,一般为私有流(根据mark标志组合)
STREAMPARSE_RTPH264TOES = 98, //主要针对payloadtype 98,解复用且组成一帧ES流(根据mark标志组合)
STREAMPARSE_MERGEAMPEG4 = 99, //将不完整的MPEG4帧组合成一个完整帧
STREAMPARSE_MERGEAMPEG2 = 100, //将不完整的MPEG2帧组合成一个完整帧
STREAMPARSE_ESTOES = 110 , //主要针对无序的ES流组合成一帧ES流
STREAMPARSE_TSTOES = 111, //将TS流转为ES流(输出不一定为完整帧)
STREAMPARSE_ESTOPS = 1096, //将ES流转为PS流,输入必须为一帧es流
STREAMPARSE_AUDIOTOPS = 1008, //将音频流转为PS流
}StreamParseType_E;
typedef struct _StreamParseParamIn
{
unsigned char *pBufIn; //输入流
int nSizeIn; //输入流大小
StreamParseType_E PayLoadType; //处理输入流的类型
bool bMark; //mark标记
}StreamParseParamIn;
typedef struct _StreamParseParamOut
{
unsigned char* pBufOut; //输出流
int nSizeOut; //输出流大小
__int64 pts; //输出流PTS(显示时间戳)
__int64 dts; //输出流DTS(解码时间戳)
unsigned char streamtype; //输出流类型 0xE0:视频,0xC0音频 (针对PayLoadType为96的时候用)
}StreamParseParamOut;
#ifdef __cplusplus
extern "C"{
#endif
//初始化
int STREAMPARSE_Init();
//打开一个句柄
int STREAMPARSE_Open();
//关闭句柄
int STREAMPARSE_Close(int Handle);
//解析或者转换码流
int STREAMPARSE_Parse(int Handle, StreamParseParamIn* pIn, StreamParseParamOut* pOut);
#ifdef __cplusplus
}
#endif
#endif
用法:
long m_StreamParseHandle = STREAMPARSE_Open();
StreamParseParamIn In;
In.pBufIn = pBuffer;
In.nSizeIn = newsize;
In.bMark = false;
In.PayLoadType = STREAMPARSE_ESTOPS;
StreamParseParamOut Out;
STREAMPARSE_Parse(pVideoReqSession->m_StreamParseHandle, &In, &Out);
if( Out.nSizeOut > 0 )
{
SendRtpPacket(pVideoReqSession, Out.pBufOut, Out.nSizeOut, 96);
}