openrtp ps流和纯rtp流

改进openrtp 程序

OpenRtp 以RTP协议为主,发送音视频,因为工作量比较大,所以耽误了一些时间,前面一直没有时间来修改这个程序,也有一些人提了意见,现在重视一下,把这个程序做好,让学习rtp协议的人能够受益,以前代码比较杂乱,稍稍整理了一下,修改成为三个程序,1 个是CorePhone,包括协议和编解码,另外两个是RtpDecode 和 RtpEncode,把乱七八糟的非界面程序整理到CorePhone中了,界面里的程序较少.

gitee地址:OpenRTP 源码地址

在这里插入图片描述

整体分为三个部分

使用sdp文件

分别为ps流的sdp文件和纯rtp协议的流

ps流使用vlc接收sdp内容

c 复制代码
m=video 6000 RTP/AVP 96
a=rtpmap:96 MP2P/90000
a=framerate:20
c=IN IP4 127.0.0.1

纯RTP流vlc接收 sdp内容

c 复制代码
v=0
o=- 0 0 IN IP4 127.0.0.1
s=Stream Name
c=IN IP4 127.0.0.1
t=0 0
m=video 6000 RTP/AVP 96
a=rtpmap:96 H264/90000

使用Receive

自己写了一份接收的窗口程序,可以接收ps流和纯RTP流,这个接收是可以自动判别的,虽然不是很好,不过先这样接收,后期再改进

配置文件切换

配置文件如下, 在当前目录下的config.ini 中

c 复制代码
[encode]
code=H264
[resolution]
h=480
w=640
[udp]
udp=RTP
[upstream]
rtmpurl=rtmp://127.0.0.1/live/1001
rtspurl=rtsp://127.0.0.1/live/1003
stream=RTMP

按照这个写了一个c_ini来保存和读取配置

界面如下

c 复制代码
BOOL RTP_Config::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	v_config.ReadINI("./config.ini");
	std::string udp = toLowerCase(v_config.GetValue("udp", "udp"));
	if (udp.compare("ps") == 0 || udp.compare("ps over rtp") == 0)
	{
		v_value.udpmode = EN_PS_OVER_RTP;
		CheckRadioButton(IDC_RTP, IDC_PSRTP, IDC_PSRTP);
	}
	else if (udp.compare("ts")==0 || udp.compare("ts over rtp") == 0)
	{
		v_value.udpmode = EN_TS_OVER_RTP;
		CheckRadioButton(IDC_RTP, IDC_PSRTP, IDC_TSRTP);
	}
	else if (udp.compare("rtp") == 0)
	{
		v_value.udpmode = EN_RTP;
		CheckRadioButton(IDC_RTP, IDC_PSRTP, IDC_RTP);
	}
	///
	std::string  upstream = toLowerCase(v_config.GetValue("upstream", "stream"));
	if (upstream.compare("rtmp") == 0)
	{
		v_value.upstream = enRTMP;
		CheckRadioButton(IDC_RTMP, IDC_RTSP, IDC_RTMP);
		//((CButton*)GetDlgItem(IDC_RTMP))->SetCheck(TRUE);
	}
	else if (upstream.compare("rtsp") == 0)
	{
		CheckRadioButton(IDC_RTMP, IDC_RTSP, IDC_RTSP);
		//((CButton*)GetDlgItem(IDC_RTSP))->SetCheck(TRUE);
		v_value.upstream = enRTSP;
	}
	v_value.urlrtmp = v_config.GetValue("upstream", "rtmpurl");
	v_value.urlrtsp = v_config.GetValue("upstream", "rtspurl");
	SetStr(IDC_EDIT_URL_RTMP, v_value.urlrtmp);
	SetStr(IDC_EDIT_URL_RTSP, v_value.urlrtsp);
	std::string code = toLowerCase(v_config.GetValue("encode", "code"));
	if (code.compare("h264") == 0)
	{
		v_value.encode = EN_H264;
		CheckRadioButton(IDC_H264, IDC_H265, IDC_H264);
	}
	else if (code.compare("h265") == 0)
	{
		v_value.encode = EN_H265;
		CheckRadioButton(IDC_H264, IDC_H265, IDC_H265);
	}
	v_value.w = v_config.GetValueInt("resolution", "w");
	v_value.h = v_config.GetValueInt("resolution", "h");
	return TRUE;  
}

rtmp推流

同时推ps流的同时也是可以直接推送rtmp的,可以打开rtmp服务查看

rtmp 服务,如果注意到源码,我同时写了一份rtmpserver,目的是配合openrtp 同时推流到rtmpserver,实际上rtmp协议和rtp协议也是有相似之处的,抛开udp协议不说,rtp over tcp协议和 rtmp是相似的,不过我这里的rtmp服务程序还没有写好,等我下一次改进再放进去,同时把linux 下匹配好

ts流

增加了ts流程序,但是还没有集成到界面上,需要经过测试

todo

有一些工作正在进行中,主要是考虑怎么安排和怎么做例子

  1. rtp h265 发送和接收
  2. rtp aac 发送和接收
  3. 播放音视频同步,存储到磁盘IO
  4. 接入rtsp 程序 rtmp 程序
  5. 后接AI推理
  6. dlna 协议支持
  7. rtsp 协议支持

运行

注意运行在64位下面,vs2022 打开可能需要修改运行配置

改进

后期等这些协议完成后,我会改进rtp协议,不使用传统的rtp,转而开发我们自己的rtp 实时传输协议,这也是我做这个项目的最大的目的。

相关推荐
R-G-B2 小时前
【07】OpenCV C++实战篇——鼠标在图片上绘制矩形,计算矩形区域内灰度值的累加值显示在图片上,支持连续多次框选,快速计算结果,快速刷新画面不卡顿
c++·opencv·鼠标在图片上绘制矩形·矩形区域内灰度值总和·计算矩形区域内灰度值·矩形区域灰度值累加和·鼠标在图片上连续多次框选矩形
搬码临时工9 小时前
自己本地搭建的服务器怎么接公网?公网IP直连服务器方法,和只有内网IP直接映射到互联网
服务器·网络·tcp/ip
牵牛老人10 小时前
Qt中的QWebSocket 和 QWebSocketServer详解:从协议说明到实际应用解析
开发语言·qt·网络协议
上海云盾商务经理杨杨11 小时前
2025年高防IP隐身术:四层架构拆解源站IP“消失之谜”
网络协议·tcp/ip·网络安全·架构
楠目13 小时前
Shell脚本实现自动封禁恶意扫描IP
服务器·网络·tcp/ip
K神15 小时前
物联网之常见网络配置
物联网·网络协议·go
草莓熊Lotso16 小时前
【洛谷题单】--分支结构(二)
c语言·c++·经验分享·其他·刷题
snowfoootball16 小时前
2025 蓝桥杯C/C++国B 部分题解
c语言·c++·笔记·学习·贪心算法·蓝桥杯
爱吃芒果的蘑菇17 小时前
使用pybind11封装C++API
开发语言·c++·python
无聊的HZ18 小时前
HTTP 请求返回状态码和具体含义?200、400、403、404、502、503、504等
网络·网络协议·http