视频监控平台-GB28181-码流转换功能(将PS流转为ES流、H264转为ES、将TS流转为ES流、将ES流转为PS流、将音频流转为PS流)

视频监控平台-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);
		}



以下是一个基于Mmonibuca v4的代码示例,用于将GB28181视频流转换为WebSocket-FLV格式并发送到客户端: ```go package main import ( "fmt" "github.com/Monibuca/engine/v4" "github.com/Monibuca/plugin-gb28181" "github.com/Monibuca/plugin-pusher" "github.com/Monibuca/utils/v4" "github.com/gorilla/websocket" "net/http" "time" ) func main() { // 创建一个Monibuca实例 engine := engine.Default() if err := engine.ConfigFromFile("./config.toml"); err != nil { panic(err) } // 注册GB28181插件,用于接收GB28181视频 engine.InstallPlugin(&gb28181.GB28181{}) // 注册Pusher插件,用于将WebSocket-FLV格式的视频发送到客户端 engine.InstallPlugin(&pusher.Pusher{}) // 创建WebSocket服务器 upgrader := websocket.Upgrader{ // 允许所有的来源连接 CheckOrigin: func(r *http.Request) bool { return true }, } http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { fmt.Println("Upgrade:", err) return } // 创建一个Pusher实例 pusher := pusher.NewPusher(conn, "flv") // 将Pusher实例注册到Monibuca实例中 engine.AddProc(pusher) // 监听GB28181视频的变化,并将转换后的WebSocket-FLV格式的视频发送到客户端 go func() { // 从GB28181插件中获取视频 stream := <-engine.Plugins["GB28181"].(gb28181.GB28181).Streams fmt.Println("stream:", stream) // 将视频流转换为WebSocket-FLV格式的视频 wsflv := utils.NewWebSocketFLV(stream) for { // 发送WebSocket-FLV格式的视频到客户端 pusher.WritePacket(wsflv.ReadPacket()) time.Sleep(time.Millisecond * 40) } }() }) // 启动Monibuca实例 if err := engine.Start(); err != nil { panic(err) } // 启动WebSocket服务器 if err := http.ListenAndServe(":8080", nil); err != nil { panic(err) } } ``` 在此示例中,我们使用了Mmonibuca v4来创建一个WebSocket服务器,并使用GB28181插件来接收GB28181视频。我们还使用了Pusher插件来将WebSocket-FLV格式的视频发送到客户端。 在客户端连接到WebSocket服务器时,我们创建了一个Pusher实例,并将其注册到Monibuca实例中。然后,我们监听GB28181视频的变化,并将其转换为WebSocket-FLV格式的视频。最后,我们将WebSocket-FLV格式的视频发送到客户端。 请注意,此代码示例仅供参考。您需要根据您的具体情况进行调整和修改。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值