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 实时传输协议,这也是我做这个项目的最大的目的。

相关推荐
Ajiang282473530428 分钟前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
速盾cdn3 小时前
速盾:CDN是否支持屏蔽IP?
网络·网络协议·tcp/ip
yaoxin5211233 小时前
第二十七章 TCP 客户端 服务器通信 - 连接管理
服务器·网络·tcp/ip
内核程序员kevin3 小时前
TCP Listen 队列详解与优化指南
linux·网络·tcp/ip
‘’林花谢了春红‘’5 小时前
C++ list (链表)容器
c++·链表·list
机器视觉知识推荐、就业指导7 小时前
C++设计模式:建造者模式(Builder) 房屋建造案例
c++
Yang.999 小时前
基于Windows系统用C++做一个点名工具
c++·windows·sql·visual studio code·sqlite3
熬夜学编程的小王9 小时前
【初阶数据结构篇】双向链表的实现(赋源码)
数据结构·c++·链表·双向链表
zz40_9 小时前
C++自己写类 和 运算符重载函数
c++