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

相关推荐
枫叶丹41 小时前
【Qt开发】Qt系统(一)-> 定时器 QTimerEvent 和 QTimer
c语言·开发语言·数据库·c++·qt·系统架构
xu_yule3 小时前
算法基础(数论)—费马小定理
c++·算法·裴蜀定理·欧拉定理·费马小定理·同余方程·扩展欧几里得定理
宇宙超级无敌暴龙战士7 小时前
旮旯c语言三个任务
c++·c
BanyeBirth8 小时前
C++差分数组(二维)
开发语言·c++·算法
Fcy6488 小时前
C++ map和multimap的使用
开发语言·c++·stl
CC.GG8 小时前
【C++】STL容器----unordered_map和unordered_set的使用
java·数据库·c++
lengjingzju9 小时前
基于IMake的 GCC 编译与链接选项深度解析:构建高效、安全、可调试的现代软件
c++·安全·性能优化·软件构建·开源软件
xu_yule9 小时前
算法基础(数论)—算法基本定理
c++·算法·算数基本定理
CoderCodingNo10 小时前
【GESP】C++五级真题(结构体排序考点) luogu-B3968 [GESP202403 五级] 成绩排序
开发语言·c++·算法
星轨初途12 小时前
郑州轻工业大学2025天梯赛解题
c++·经验分享·笔记·算法·链表·剪枝