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

相关推荐
向阳@向远方7 分钟前
第二章 简单程序设计
开发语言·c++·算法
Mr_Xuhhh39 分钟前
信号与槽的总结
java·开发语言·数据库·c++·qt·系统架构
liulilittle1 小时前
VGW 虚拟网关用户手册 (PPP PRIVATE NETWORK 基础设施)
开发语言·网络·c++·网关·智能路由器·路由器·通信
ruanjiananquan992 小时前
c,c++语言的栈内存、堆内存及任意读写内存
java·c语言·c++
创小匠2 小时前
创客匠人视角下创始人 IP 打造与知识变现的底层逻辑重构
人工智能·tcp/ip·重构
持梦远方2 小时前
C 语言基础入门:基本数据类型与运算符详解
c语言·开发语言·c++
en-route3 小时前
HTTP 缓存
网络协议·http·缓存
江理不变情3 小时前
图像质量对比感悟
c++·人工智能
apocelipes4 小时前
记一次ADL导致的C++代码编译错误
c++·开发工具和环境
Code Warrior5 小时前
【每日算法】专题五_位运算
开发语言·c++