Skip to content

Commit f727e0f

Browse files
authored
Merge pull request #11 from libxengine/develop
V2.4.0.1001 Merge
2 parents 257134a + cf4221d commit f727e0f

File tree

13 files changed

+242
-483
lines changed

13 files changed

+242
-483
lines changed

CHANGELOG

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
1+
XEngine_StreamMedia V2.4.0.1001
2+
3+
增加:http ts播放流支持
4+
增加:TS流转换代码
5+
优化:转换流协议代码,现在avframe函数都是输入源数据了
6+
修复:srt转换的问题
7+
删除:avpacket没有使用的参数
8+
9+
added:http ts play stream
10+
added:ts convert code
11+
improved:convert stream protocol,now XEngine_AVPacket_AVFrame input source stream
12+
fixed:srt convert problem
13+
delete:avpacket unused parament
14+
=======================================================
115
XEngine_StreamMedia V2.3.0.1001
216

317
增加:队列模块

README.en.md

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,6 @@ This is a cross-platform server, provides a complete demo code
1313
## Software feature
1414
A set of concise and high-performance cross-platform streaming media analysis and push streaming services developed and implemented based on libXEngine
1515

16-
Push stream Protocol:
17-
1. RTMP(H264,H265,AAC)
18-
2. XStream
19-
3. SRT
20-
4. JT1078(planning)
21-
5. GB28181(planning)
22-
6. WEBRTC(planning)
23-
24-
Pull Stream Protocols:
25-
1. srt
26-
2. RTMP(H264,H265,AAC)
27-
3. FLV(H264,H265,AAC)
28-
4. XStream
29-
4. HLS(TS)(planning)
30-
5. webrtc(planning)
31-
6. RTSP(planning)
32-
3316
feature:
3417
1. Support voice intercom(planning)
3518
2. Support video transcoding(planning)
@@ -39,6 +22,30 @@ feature:
3922
6. Support HTTP API Management interface
4023
7. Support HTTP HOOK(planning)
4124

25+
Publish Stream:
26+
27+
| ProtocolName | VideoCodec | AudioCodec | Status |
28+
| -------- | --------- | -------- | -------- |
29+
| RTMP | H264,H265 | AAC | Completed |
30+
| SRT | H264,H265 | AAC | Completed |
31+
| WEBRTC | H264,H265 | AAC | Not Start |
32+
| GB28181 | H264,H265 | AAC | Not Start |
33+
| JT1078 | H264,H265 | AAC | Completed |
34+
| XStream | H264,H265 | AAC | Completed |
35+
36+
Play Stream:
37+
38+
| ProtocolName | VideoCodec | AudioCodec | Status |
39+
| -------- | --------- | -------- | -------- |
40+
| RTMP | H264 | AAC | Completed |
41+
| RTSP | H264,H265 | AAC | Process |
42+
| TS | H264,H265 | AAC | Process |
43+
| SRT | H264,H265 | AAC | Completed |
44+
| WEBRTC | H264,H265 | AAC | Not Start |
45+
| HTTP-FLV | H264 | AAC | Completed |
46+
| XStream | H264,H265 | AAC | Completed |
47+
48+
4249
## install
4350

4451
#### XEngine environment
@@ -71,7 +78,7 @@ make FLAGS=CleanAll Clear Complie
7178

7279
#### MacOS
7380
install srt library after Configure Xengine to Completed
74-
ubuntu:sudo brew install libsrt
81+
brew install libsrt
7582
Linux use Makefile to complie,terminal exection,Requires mac 13 and above
7683

7784
##### Compile Command
@@ -89,14 +96,15 @@ refer to linux
8996

9097
## example
9198
#### publish Stream
92-
rtmp://127.0.0.1/live/qyt  
99+
rtmp://127.0.0.1/live/qyt
93100
srt://127.0.0.1:5603?streamid=#!::h=live/qyt,m=publish
94-
xstream://127.0.0.1:5601(refer example)
101+
xstream://127.0.0.1:5601
102+
95103
#### Pull Stream
96104
http://127.0.0.1:5600/api?stream=play&sms=live/qyt&type=flv(http-flv)
97-
rtmp://127.0.0.1/live/qyt  
105+
rtmp://127.0.0.1/live/qyt
98106
srt://127.0.0.1:5603?streamid=#!::r=live/qyt,m=request
99-
xstream://127.0.0.1:5601?api?stream=play&sms=live/qyt&type=xstream(http-xstream)
107+
http://127.0.0.1:5601?api?stream=play&sms=live/qyt&type=xstream(http-xstream)
100108

101109
#### Management HTTP API
102110
http://127.0.0.1:5600/api?function=publish&method=get
@@ -116,7 +124,10 @@ http://127.0.0.1:5600/api?function=pull&method=get
116124
4. New Pull Request
117125

118126
## Follow us
119-
If you think this software is helpful to you, please give us a START
127+
128+
如果你觉得这个软件对你有帮助,请你给我们一个START吧
129+
也可以通过微信关注我们
130+
![qrcode](https://www.xyry.org/qrcode.jpg)
120131

121132
## post issues
122133

README.md

Lines changed: 53 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,21 @@
22

33
# XEngine_StreamMedia
44

5-
本仓库有开发和主分支,如果要使用,请使用master分支下的代码  
6-
只要仓库不是在暂停状态,那么就会有人一直维护和开发,请放心使用  
5+
本仓库有开发和主分支,如果要使用,请使用master分支下的代码
6+
只要仓库不是在暂停状态,那么就会有人一直维护和开发,请放心使用
77

88
## 介绍
99

10-
c c++ 流媒体服务器  
11-
c c++ streammedia server  
12-
这是一个支持多种流协议的流媒体服务器,他支持推流和拉流,支持各种主流标准协议的流媒体服务器
13-
他还可以作为抽帧服务和转码服务使用.
14-
这是一个跨平台的流媒体服务器,提供了完整的演示代码  
10+
c c++ 流媒体服务器
11+
c c++ streammedia server
12+
这是一个支持多种流协议的流媒体服务器,他支持推流和拉流,支持各种主流标准协议的流媒体服务器
13+
他还可以作为抽帧服务和转码服务使用
14+
这是一个跨平台的流媒体服务器,提供了完整的演示代码
1515

1616
## 软件架构
17-
基于libXEngine开发并实现的一套简洁高性能跨平台流媒体解析推流服务  
18-
19-
推流支持:
20-
1. RTMP(H264,H265,AAC)
21-
2. XStream
22-
3. SRT
23-
4. JT1078
24-
5. GB28181(planning)
25-
6. WEBRTC(planning)
26-
27-
拉流支持:
28-
1. srt
29-
2. RTMP(H264,H265,AAC)
30-
3. FLV(H264,H265,AAC)
31-
4. XStream
32-
5. HLS(TS)(planning)
33-
6. webrtc(planning)
34-
7. RTSP(planning)
35-
36-
特性:  
17+
基于libXEngine开发并实现的一套简洁高性能跨平台流媒体解析推流服务
18+
19+
特性:
3720
1. 支持语音对讲(planning)
3821
2. 支持视频转码(planning)
3922
3. 支持抽帧(planning)
@@ -42,18 +25,41 @@ c c++ streammedia server  
4225
6. 支持HTTP API管理接口
4326
7. 支持HTTP HOOK(planning)
4427

28+
推流协议:
29+
30+
| 协议名称 | 视频格式 | 音频格式 | 当前状态 |
31+
| -------- | --------- | -------- | -------- |
32+
| RTMP | H264,H265 | AAC | 已完成 |
33+
| SRT | H264,H265 | AAC | 已完成 |
34+
| WEBRTC | H264,H265 | AAC | 未开始 |
35+
| GB28181 | H264,H265 | AAC | 未开始 |
36+
| JT1078 | H264,H265 | AAC | 已完成 |
37+
| XStream | H264,H265 | AAC | 已完成 |
38+
39+
拉流协议:
40+
41+
| 协议名称 | 视频格式 | 音频格式 | 当前状态 |
42+
| -------- | --------- | -------- | -------- |
43+
| RTMP | H264 | AAC | 已完成 |
44+
| RTSP | H264,H265 | AAC | 进行中 |
45+
| TS | H264,H265 | AAC | 进行中 |
46+
| SRT | H264,H265 | AAC | 已完成 |
47+
| WEBRTC | H264,H265 | AAC | 未开始 |
48+
| HTTP-FLV | H264 | AAC | 已完成 |
49+
| XStream | H264,H265 | AAC | 已完成 |
50+
4551
## 安装教程
4652

4753
#### XEngine环境
4854

49-
在编译之前必须安装XEngine,可以参考其Readme文档  
50-
GITEE:https://gitee.com/xyry/libxengine  
51-
GITHUB:https://github.com/libxengine/xengine  
55+
在编译之前必须安装XEngine,可以参考其Readme文档
56+
GITEE:https://gitee.com/xyry/libxengine
57+
GITHUB:https://github.com/libxengine/xengine
5258

5359
#### 快速部署
5460

5561
git clone https://gitee.com/xyry/libxengine.git 或者 git clone https://github.com/libxengine/xengine.git
56-
window执行XEngine_WINEnv.bat 脚本.
62+
window执行XEngine_WINEnv.bat 脚本
5763
Linux执行:sudo ./XEngine_LINEnv.sh -i 3
5864
macos执行:./XEngine_LINEnv.sh -i 3
5965

@@ -65,21 +71,21 @@ macos执行:./XEngine_LINEnv.sh -i 3
6571
#### Linux
6672
配置完XEngine后需要安装srt库
6773
ubuntu:sudo apt install libsrt-openssl-dev
68-
Rockylinux:sudo dnf install srt-devel
74+
Rockylinux:sudo dnf install srt-devel
6975

70-
Linux使用Makefile编译  
71-
UBUNTU22.04 或者 RockyLinux 9 x64均可  
76+
Linux使用Makefile编译
77+
UBUNTU22.04 或者 RockyLinux 9 x64均可
7278

7379
###### 编译命令
7480

75-
在XEngine_Source目录下执行命令  
76-
make 编译  
77-
make FLAGS=InstallAll 安装库程序  
78-
make FLAGS=CleanAll 清理编译  
81+
在XEngine_Source目录下执行命令
82+
make 编译
83+
make FLAGS=InstallAll 安装库程序
84+
make FLAGS=CleanAll 清理编译
7985

8086
#### MacOS
8187
配置完XEngine后需要安装srt库
82-
ubuntu:sudo brew install libsrt
88+
brew install libsrt
8389
使用makefile编译,控制台运行,需要mac 13以及以上版本
8490

8591
###### 编译命令
@@ -99,15 +105,15 @@ ubuntu:sudo brew install libsrt
99105
## 示例
100106

101107
#### 推流示例
102-
rtmp://127.0.0.1/live/qyt  
108+
rtmp://127.0.0.1/live/qyt
103109
srt://127.0.0.1:5603?streamid=#!::h=live/qyt,m=publish
104-
xstream://127.0.0.1:5601(参考例子)
110+
xstream://127.0.0.1:5601
105111

106112
#### 拉流示例
107113
http://127.0.0.1:5600/api?stream=play&sms=live/qyt&type=flv(http-flv)
108-
rtmp://127.0.0.1/live/qyt  
114+
rtmp://127.0.0.1/live/qyt
109115
srt://127.0.0.1:5603?streamid=#!::r=live/qyt,m=request
110-
xstream://127.0.0.1:5601?api?stream=play&sms=live/qyt&type=xstream(http-xstream)
116+
http://127.0.0.1:5601?api?stream=play&sms=live/qyt&type=xstream(http-xstream)
111117

112118
#### 管理接口示例
113119
http://127.0.0.1:5600/api?function=publish&method=get
@@ -129,8 +135,10 @@ http://127.0.0.1:5600/api?function=pull&method=get
129135

130136
## 关注我们
131137

132-
如果你觉得这个软件对你有帮助,请你给我们一个START吧
138+
如果你觉得这个软件对你有帮助,请你给我们一个START吧  
139+
也可以通过微信关注我们  
140+
![qrcode](https://www.xyry.org/qrcode.jpg)
133141

134142
## 提交问题
135143

136-
如果你有问题或者发现程序有BUG和意见,可以在issues中提交
144+
如果你有问题或者发现程序有BUG和意见,可以在issues中提交

XEngine_Release/XEngine_Config/XEngine_Config.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
"LogLeave":32
4848
},
4949
"XVer":[
50+
"V2.4.0.1001 Build20231026",
5051
"V2.3.0.1001 Build20231007",
5152
"V2.2.0.1001 Build20230804",
5253
"V2.1.0.1001 Build20230726",

XEngine_Source/XEngine_ServiceApp/XEngine_StreamMediaApp/StreamMedia_PullStream/PullStream_ClientGet.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,37 @@ bool PullStream_ClientGet_Handle(LPCXSTR lpszClientAddr, XCHAR*** ppptszListHdr,
150150
ModuleSession_PullStream_Insert(lpszClientAddr, tszSMSAddr, tszPushAddr, enStreamType);
151151
ModuleSession_PushStream_ClientInsert(tszPushAddr, lpszClientAddr, enStreamType);
152152
}
153+
else if (0 == _tcsxnicmp(tszVluBuffer, "ts", 2))
154+
{
155+
int nPATLen = 0;
156+
int nPMTLen = 0;
157+
enStreamType = ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PULL_TS;
158+
159+
memset(tszRVBuffer, '\0', sizeof(tszRVBuffer));
160+
memset(tszSDBuffer, '\0', sizeof(tszSDBuffer));
161+
162+
HLSProtocol_TSPacket_PATInfo(tszPushAddr, (XBYTE*)tszRVBuffer, &nPATLen);
163+
HLSProtocol_TSPacket_PMTInfo(tszPushAddr, (XBYTE*)tszRVBuffer + nPATLen, &nPMTLen);
164+
nRVLen = nPATLen + nPMTLen;
165+
//返回数据,为HTTP CHUNKED
166+
nSDLen = _xstprintf(tszSDBuffer, _X("HTTP/1.1 200 OK\r\n"
167+
"Connection: Close\r\n"
168+
"Content-Type: video/x-stream\r\n"
169+
"Server: XEngine/%s\r\n"
170+
"Access-Control-Allow-Origin: *\r\n"
171+
"Access-Control-Allow-Credentials: true\r\n"
172+
"Transfer-Encoding: chunked\r\n\r\n"
173+
"%x\r\n"), BaseLib_OperatorVer_XTypeStr(), nRVLen);
174+
memcpy(tszSDBuffer + nSDLen, tszRVBuffer, nRVLen);
175+
nSDLen += nRVLen;
176+
memcpy(tszSDBuffer + nSDLen, _X("\r\n"), 2);
177+
nSDLen += 2;
178+
179+
XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_HTTP);
180+
181+
ModuleSession_PullStream_Insert(lpszClientAddr, tszSMSAddr, tszPushAddr, enStreamType);
182+
ModuleSession_PushStream_ClientInsert(tszPushAddr, lpszClientAddr, enStreamType);
183+
}
153184
else
154185
{
155186
ModuleProtocol_Packet_Comm(tszRVBuffer, &nRVLen, NULL, 500, "not support");

XEngine_Source/XEngine_ServiceApp/XEngine_StreamMediaApp/StreamMedia_PushStream/PushStream_JT1078Task.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ bool PushStream_JT1078Task_Handle(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer,
9696
ModuleSession_PushStream_Create(lpszClientAddr, tszSMSAddr, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_JT1078);
9797
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("JT1078:%s,流媒体服务创建,设备ID:%s,通道:%d,创建地址:%s"), lpszClientAddr, tszDeviceNumber, pSt_RTPHdr->byChannel, tszSMSAddr);
9898
}
99-
//H264
99+
100100
if (3 == pSt_RTPHdr->byType)
101101
{
102102
//音频
@@ -132,7 +132,7 @@ bool PushStream_JT1078Task_Handle(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer,
132132
{
133133
XEngine_AVPacket_AVHdr(lpszClientAddr, ptszMsgBuffer, nMLen, 0, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_JT1078);
134134
}
135-
XEngine_AVPacket_AVFrame(ptszSDBuffer, &nSDLen, ptszRVBuffer, &nRVLen, lpszClientAddr, ptszMsgBuffer, nMLen, -1, 0, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_JT1078);
135+
XEngine_AVPacket_AVFrame(ptszSDBuffer, &nSDLen, ptszRVBuffer, &nRVLen, lpszClientAddr, ptszMsgBuffer, nMLen, 0);
136136
}
137137
}
138138
}

XEngine_Source/XEngine_ServiceApp/XEngine_StreamMediaApp/StreamMedia_PushStream/PushStream_RTMPTask.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,10 @@ bool PushStream_RTMPTask_Handle(XENGINE_RTMPHDR* pSt_RTMPHdr, LPCXSTR lpszClient
5252
{
5353
int nRVLen = 0;
5454
int nSDLen = 0;
55+
int nPMLen = 0;
5556
XCHAR* ptszRVBuffer = (XCHAR*)malloc(XENGINE_MEMORY_SIZE_MAX);
5657
XCHAR* ptszSDBuffer = (XCHAR*)malloc(XENGINE_MEMORY_SIZE_MAX);
58+
XCHAR* ptszMSGBuffer = (XCHAR*)malloc(XENGINE_MEMORY_SIZE_MAX);
5759

5860
if (XENGINE_STREAMMEDIA_RTMP_MSGTYPE_CONNREQ == pSt_RTMPHdr->byTypeID)
5961
{
@@ -423,7 +425,8 @@ bool PushStream_RTMPTask_Handle(XENGINE_RTMPHDR* pSt_RTMPHdr, LPCXSTR lpszClient
423425
{
424426
XEngine_AVPacket_AVHdr(lpszClientAddr, lpszMsgBuffer, nMsgLen, 1, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_RTMP);
425427
}
426-
XEngine_AVPacket_AVFrame(ptszSDBuffer, &nSDLen, ptszRVBuffer, &nRVLen, lpszClientAddr, lpszMsgBuffer, nMsgLen, 0, 1, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_RTMP);
428+
RTMPProtocol_Help_ParseAudio(&st_RTMPAudio, ptszMSGBuffer, &nPMLen, lpszMsgBuffer + sizeof(XENGINE_RTMPAUDIO), nMsgLen - sizeof(XENGINE_RTMPAUDIO));
429+
XEngine_AVPacket_AVFrame(ptszSDBuffer, &nSDLen, ptszRVBuffer, &nRVLen, lpszClientAddr, ptszMSGBuffer, nPMLen, 1);
427430
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _X("RTMP推流端:%s,接受推流数据"), lpszClientAddr);
428431
}
429432
else if (XENGINE_STREAMMEDIA_RTMP_MSGTYPE_VIDEO == pSt_RTMPHdr->byTypeID)
@@ -436,13 +439,16 @@ bool PushStream_RTMPTask_Handle(XENGINE_RTMPHDR* pSt_RTMPHdr, LPCXSTR lpszClient
436439
{
437440
XEngine_AVPacket_AVHdr(lpszClientAddr, lpszMsgBuffer, nMsgLen, 0, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_RTMP);
438441
}
439-
XEngine_AVPacket_AVFrame(ptszSDBuffer, &nSDLen, ptszRVBuffer, &nRVLen, lpszClientAddr, lpszMsgBuffer, nMsgLen, 0, 0, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_RTMP);
442+
RTMPProtocol_Help_ParseVideo(&st_RTMPVideo, ptszMSGBuffer, &nPMLen, lpszMsgBuffer + sizeof(XENGINE_RTMPVIDEO), nMsgLen - sizeof(XENGINE_RTMPVIDEO));
443+
XEngine_AVPacket_AVFrame(ptszSDBuffer, &nSDLen, ptszRVBuffer, &nRVLen, lpszClientAddr, ptszMSGBuffer, nPMLen, 0);
440444
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _X("RTMP推流端:%s,接受推流数据,数据大小:%d"), lpszClientAddr, nMsgLen);
441445
}
442446

443447
free(ptszRVBuffer);
444448
free(ptszSDBuffer);
449+
free(ptszMSGBuffer);
445450
ptszRVBuffer = NULL;
446451
ptszSDBuffer = NULL;
452+
ptszMSGBuffer = NULL;
447453
return true;
448454
}

0 commit comments

Comments
 (0)