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

相关推荐
wangnaisheng6 分钟前
彩虹编码映射实现:C++与C#
c++·c#
waves浪游7 分钟前
进程控制(下)
linux·运维·服务器·开发语言·c++
努力进修12 分钟前
【JavaEE初阶】UDP协议和TCP协议
tcp/ip·udp·java-ee
兵哥工控12 分钟前
mfc两个线程的创建、启动、安全结束实例
c++·mfc·多线程·线程安全退出
小龙报13 分钟前
【算法通关指南:算法基础篇 】双指针专题:1.唯一的雪花 2.逛画展 3.字符串 4.丢手绢
c语言·数据结构·c++·人工智能·深度学习·算法·信息与通信
Yusei_052317 分钟前
Redis核心特性与应用全解析
开发语言·数据库·c++·redis·缓存
爱尔兰极光17 分钟前
计算机网络--TCP传输
网络·tcp/ip·计算机网络
Larry_Yanan8 小时前
Qt多进程(一)进程间通信概括
开发语言·c++·qt·学习
J ..9 小时前
C++ 多线程编程基础与 std::thread 使用
c++
你的冰西瓜9 小时前
C++标准模板库(STL)全面解析
开发语言·c++·stl