Skip to content

Commit

Permalink
Merge pull request #11 from libxengine/develop
Browse files Browse the repository at this point in the history
V2.4.0.1001 Merge
  • Loading branch information
xengine-qyt authored Oct 26, 2023
2 parents 257134a + cf4221d commit f727e0f
Show file tree
Hide file tree
Showing 13 changed files with 242 additions and 483 deletions.
14 changes: 14 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,3 +1,17 @@
XEngine_StreamMedia V2.4.0.1001

增加:http ts播放流支持
增加:TS流转换代码
优化:转换流协议代码,现在avframe函数都是输入源数据了
修复:srt转换的问题
删除:avpacket没有使用的参数

added:http ts play stream
added:ts convert code
improved:convert stream protocol,now XEngine_AVPacket_AVFrame input source stream
fixed:srt convert problem
delete:avpacket unused parament
=======================================================
XEngine_StreamMedia V2.3.0.1001

增加:队列模块
Expand Down
57 changes: 34 additions & 23 deletions README.en.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,6 @@ This is a cross-platform server, provides a complete demo code
## Software feature
A set of concise and high-performance cross-platform streaming media analysis and push streaming services developed and implemented based on libXEngine

Push stream Protocol:
1. RTMP(H264,H265,AAC)
2. XStream
3. SRT
4. JT1078(planning)
5. GB28181(planning)
6. WEBRTC(planning)

Pull Stream Protocols:
1. srt
2. RTMP(H264,H265,AAC)
3. FLV(H264,H265,AAC)
4. XStream
4. HLS(TS)(planning)
5. webrtc(planning)
6. RTSP(planning)

feature:
1. Support voice intercom(planning)
2. Support video transcoding(planning)
Expand All @@ -39,6 +22,30 @@ feature:
6. Support HTTP API Management interface
7. Support HTTP HOOK(planning)

Publish Stream:

| ProtocolName | VideoCodec | AudioCodec | Status |
| -------- | --------- | -------- | -------- |
| RTMP | H264,H265 | AAC | Completed |
| SRT | H264,H265 | AAC | Completed |
| WEBRTC | H264,H265 | AAC | Not Start |
| GB28181 | H264,H265 | AAC | Not Start |
| JT1078 | H264,H265 | AAC | Completed |
| XStream | H264,H265 | AAC | Completed |

Play Stream:

| ProtocolName | VideoCodec | AudioCodec | Status |
| -------- | --------- | -------- | -------- |
| RTMP | H264 | AAC | Completed |
| RTSP | H264,H265 | AAC | Process |
| TS | H264,H265 | AAC | Process |
| SRT | H264,H265 | AAC | Completed |
| WEBRTC | H264,H265 | AAC | Not Start |
| HTTP-FLV | H264 | AAC | Completed |
| XStream | H264,H265 | AAC | Completed |


## install

#### XEngine environment
Expand Down Expand Up @@ -71,7 +78,7 @@ make FLAGS=CleanAll Clear Complie

#### MacOS
install srt library after Configure Xengine to Completed
ubuntu:sudo brew install libsrt
brew install libsrt
Linux use Makefile to complie,terminal exection,Requires mac 13 and above

##### Compile Command
Expand All @@ -89,14 +96,15 @@ refer to linux

## example
#### publish Stream
rtmp://127.0.0.1/live/qyt  
rtmp://127.0.0.1/live/qyt
srt://127.0.0.1:5603?streamid=#!::h=live/qyt,m=publish
xstream://127.0.0.1:5601(refer example)
xstream://127.0.0.1:5601

#### Pull Stream
http://127.0.0.1:5600/api?stream=play&sms=live/qyt&type=flv(http-flv)
rtmp://127.0.0.1/live/qyt  
rtmp://127.0.0.1/live/qyt
srt://127.0.0.1:5603?streamid=#!::r=live/qyt,m=request
xstream://127.0.0.1:5601?api?stream=play&sms=live/qyt&type=xstream(http-xstream)
http://127.0.0.1:5601?api?stream=play&sms=live/qyt&type=xstream(http-xstream)

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

## Follow us
If you think this software is helpful to you, please give us a START

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

## post issues

Expand Down
98 changes: 53 additions & 45 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,38 +2,21 @@

# XEngine_StreamMedia

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

## 介绍

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

## 软件架构
基于libXEngine开发并实现的一套简洁高性能跨平台流媒体解析推流服务  

推流支持:
1. RTMP(H264,H265,AAC)
2. XStream
3. SRT
4. JT1078
5. GB28181(planning)
6. WEBRTC(planning)

拉流支持:
1. srt
2. RTMP(H264,H265,AAC)
3. FLV(H264,H265,AAC)
4. XStream
5. HLS(TS)(planning)
6. webrtc(planning)
7. RTSP(planning)

特性:  
基于libXEngine开发并实现的一套简洁高性能跨平台流媒体解析推流服务

特性:
1. 支持语音对讲(planning)
2. 支持视频转码(planning)
3. 支持抽帧(planning)
Expand All @@ -42,18 +25,41 @@ c c++ streammedia server  
6. 支持HTTP API管理接口
7. 支持HTTP HOOK(planning)

推流协议:

| 协议名称 | 视频格式 | 音频格式 | 当前状态 |
| -------- | --------- | -------- | -------- |
| RTMP | H264,H265 | AAC | 已完成 |
| SRT | H264,H265 | AAC | 已完成 |
| WEBRTC | H264,H265 | AAC | 未开始 |
| GB28181 | H264,H265 | AAC | 未开始 |
| JT1078 | H264,H265 | AAC | 已完成 |
| XStream | H264,H265 | AAC | 已完成 |

拉流协议:

| 协议名称 | 视频格式 | 音频格式 | 当前状态 |
| -------- | --------- | -------- | -------- |
| RTMP | H264 | AAC | 已完成 |
| RTSP | H264,H265 | AAC | 进行中 |
| TS | H264,H265 | AAC | 进行中 |
| SRT | H264,H265 | AAC | 已完成 |
| WEBRTC | H264,H265 | AAC | 未开始 |
| HTTP-FLV | H264 | AAC | 已完成 |
| XStream | H264,H265 | AAC | 已完成 |

## 安装教程

#### XEngine环境

在编译之前必须安装XEngine,可以参考其Readme文档  
GITEE:https://gitee.com/xyry/libxengine  
GITHUB:https://github.com/libxengine/xengine  
在编译之前必须安装XEngine,可以参考其Readme文档
GITEE:https://gitee.com/xyry/libxengine
GITHUB:https://github.com/libxengine/xengine

#### 快速部署

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

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

Linux使用Makefile编译  
UBUNTU22.04 或者 RockyLinux 9 x64均可  
Linux使用Makefile编译
UBUNTU22.04 或者 RockyLinux 9 x64均可

###### 编译命令

在XEngine_Source目录下执行命令  
make 编译  
make FLAGS=InstallAll 安装库程序  
make FLAGS=CleanAll 清理编译  
在XEngine_Source目录下执行命令
make 编译
make FLAGS=InstallAll 安装库程序
make FLAGS=CleanAll 清理编译

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

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

#### 推流示例
rtmp://127.0.0.1/live/qyt  
rtmp://127.0.0.1/live/qyt
srt://127.0.0.1:5603?streamid=#!::h=live/qyt,m=publish
xstream://127.0.0.1:5601(参考例子)
xstream://127.0.0.1:5601

#### 拉流示例
http://127.0.0.1:5600/api?stream=play&sms=live/qyt&type=flv(http-flv)
rtmp://127.0.0.1/live/qyt  
rtmp://127.0.0.1/live/qyt
srt://127.0.0.1:5603?streamid=#!::r=live/qyt,m=request
xstream://127.0.0.1:5601?api?stream=play&sms=live/qyt&type=xstream(http-xstream)
http://127.0.0.1:5601?api?stream=play&sms=live/qyt&type=xstream(http-xstream)

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

## 关注我们

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

## 提交问题

如果你有问题或者发现程序有BUG和意见,可以在issues中提交
如果你有问题或者发现程序有BUG和意见,可以在issues中提交
1 change: 1 addition & 0 deletions XEngine_Release/XEngine_Config/XEngine_Config.json
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
"LogLeave":32
},
"XVer":[
"V2.4.0.1001 Build20231026",
"V2.3.0.1001 Build20231007",
"V2.2.0.1001 Build20230804",
"V2.1.0.1001 Build20230726",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,37 @@ bool PullStream_ClientGet_Handle(LPCXSTR lpszClientAddr, XCHAR*** ppptszListHdr,
ModuleSession_PullStream_Insert(lpszClientAddr, tszSMSAddr, tszPushAddr, enStreamType);
ModuleSession_PushStream_ClientInsert(tszPushAddr, lpszClientAddr, enStreamType);
}
else if (0 == _tcsxnicmp(tszVluBuffer, "ts", 2))
{
int nPATLen = 0;
int nPMTLen = 0;
enStreamType = ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PULL_TS;

memset(tszRVBuffer, '\0', sizeof(tszRVBuffer));
memset(tszSDBuffer, '\0', sizeof(tszSDBuffer));

HLSProtocol_TSPacket_PATInfo(tszPushAddr, (XBYTE*)tszRVBuffer, &nPATLen);
HLSProtocol_TSPacket_PMTInfo(tszPushAddr, (XBYTE*)tszRVBuffer + nPATLen, &nPMTLen);
nRVLen = nPATLen + nPMTLen;
//返回数据,为HTTP CHUNKED
nSDLen = _xstprintf(tszSDBuffer, _X("HTTP/1.1 200 OK\r\n"
"Connection: Close\r\n"
"Content-Type: video/x-stream\r\n"
"Server: XEngine/%s\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Access-Control-Allow-Credentials: true\r\n"
"Transfer-Encoding: chunked\r\n\r\n"
"%x\r\n"), BaseLib_OperatorVer_XTypeStr(), nRVLen);
memcpy(tszSDBuffer + nSDLen, tszRVBuffer, nRVLen);
nSDLen += nRVLen;
memcpy(tszSDBuffer + nSDLen, _X("\r\n"), 2);
nSDLen += 2;

XEngine_Network_Send(lpszClientAddr, tszSDBuffer, nSDLen, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_HTTP);

ModuleSession_PullStream_Insert(lpszClientAddr, tszSMSAddr, tszPushAddr, enStreamType);
ModuleSession_PushStream_ClientInsert(tszPushAddr, lpszClientAddr, enStreamType);
}
else
{
ModuleProtocol_Packet_Comm(tszRVBuffer, &nRVLen, NULL, 500, "not support");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ bool PushStream_JT1078Task_Handle(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer,
ModuleSession_PushStream_Create(lpszClientAddr, tszSMSAddr, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_JT1078);
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("JT1078:%s,流媒体服务创建,设备ID:%s,通道:%d,创建地址:%s"), lpszClientAddr, tszDeviceNumber, pSt_RTPHdr->byChannel, tszSMSAddr);
}
//H264

if (3 == pSt_RTPHdr->byType)
{
//音频
Expand Down Expand Up @@ -132,7 +132,7 @@ bool PushStream_JT1078Task_Handle(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer,
{
XEngine_AVPacket_AVHdr(lpszClientAddr, ptszMsgBuffer, nMLen, 0, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_JT1078);
}
XEngine_AVPacket_AVFrame(ptszSDBuffer, &nSDLen, ptszRVBuffer, &nRVLen, lpszClientAddr, ptszMsgBuffer, nMLen, -1, 0, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_JT1078);
XEngine_AVPacket_AVFrame(ptszSDBuffer, &nSDLen, ptszRVBuffer, &nRVLen, lpszClientAddr, ptszMsgBuffer, nMLen, 0);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,10 @@ bool PushStream_RTMPTask_Handle(XENGINE_RTMPHDR* pSt_RTMPHdr, LPCXSTR lpszClient
{
int nRVLen = 0;
int nSDLen = 0;
int nPMLen = 0;
XCHAR* ptszRVBuffer = (XCHAR*)malloc(XENGINE_MEMORY_SIZE_MAX);
XCHAR* ptszSDBuffer = (XCHAR*)malloc(XENGINE_MEMORY_SIZE_MAX);
XCHAR* ptszMSGBuffer = (XCHAR*)malloc(XENGINE_MEMORY_SIZE_MAX);

if (XENGINE_STREAMMEDIA_RTMP_MSGTYPE_CONNREQ == pSt_RTMPHdr->byTypeID)
{
Expand Down Expand Up @@ -423,7 +425,8 @@ bool PushStream_RTMPTask_Handle(XENGINE_RTMPHDR* pSt_RTMPHdr, LPCXSTR lpszClient
{
XEngine_AVPacket_AVHdr(lpszClientAddr, lpszMsgBuffer, nMsgLen, 1, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_RTMP);
}
XEngine_AVPacket_AVFrame(ptszSDBuffer, &nSDLen, ptszRVBuffer, &nRVLen, lpszClientAddr, lpszMsgBuffer, nMsgLen, 0, 1, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_RTMP);
RTMPProtocol_Help_ParseAudio(&st_RTMPAudio, ptszMSGBuffer, &nPMLen, lpszMsgBuffer + sizeof(XENGINE_RTMPAUDIO), nMsgLen - sizeof(XENGINE_RTMPAUDIO));
XEngine_AVPacket_AVFrame(ptszSDBuffer, &nSDLen, ptszRVBuffer, &nRVLen, lpszClientAddr, ptszMSGBuffer, nPMLen, 1);
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _X("RTMP推流端:%s,接受推流数据"), lpszClientAddr);
}
else if (XENGINE_STREAMMEDIA_RTMP_MSGTYPE_VIDEO == pSt_RTMPHdr->byTypeID)
Expand All @@ -436,13 +439,16 @@ bool PushStream_RTMPTask_Handle(XENGINE_RTMPHDR* pSt_RTMPHdr, LPCXSTR lpszClient
{
XEngine_AVPacket_AVHdr(lpszClientAddr, lpszMsgBuffer, nMsgLen, 0, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_RTMP);
}
XEngine_AVPacket_AVFrame(ptszSDBuffer, &nSDLen, ptszRVBuffer, &nRVLen, lpszClientAddr, lpszMsgBuffer, nMsgLen, 0, 0, ENUM_XENGINE_STREAMMEDIA_CLIENT_TYPE_PUSH_RTMP);
RTMPProtocol_Help_ParseVideo(&st_RTMPVideo, ptszMSGBuffer, &nPMLen, lpszMsgBuffer + sizeof(XENGINE_RTMPVIDEO), nMsgLen - sizeof(XENGINE_RTMPVIDEO));
XEngine_AVPacket_AVFrame(ptszSDBuffer, &nSDLen, ptszRVBuffer, &nRVLen, lpszClientAddr, ptszMSGBuffer, nPMLen, 0);
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _X("RTMP推流端:%s,接受推流数据,数据大小:%d"), lpszClientAddr, nMsgLen);
}

free(ptszRVBuffer);
free(ptszSDBuffer);
free(ptszMSGBuffer);
ptszRVBuffer = NULL;
ptszSDBuffer = NULL;
ptszMSGBuffer = NULL;
return true;
}
Loading

0 comments on commit f727e0f

Please sign in to comment.