改进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
有一些工作正在进行中,主要是考虑怎么安排和怎么做例子
- rtp h265 发送和接收
- rtp aac 发送和接收
- 播放音视频同步,存储到磁盘IO
- 接入rtsp 程序 rtmp 程序
- 后接AI推理
- dlna 协议支持
- rtsp 协议支持
运行
注意运行在64位下面,vs2022 打开可能需要修改运行配置
改进
后期等这些协议完成后,我会改进rtp协议,不使用传统的rtp,转而开发我们自己的rtp 实时传输协议,这也是我做这个项目的最大的目的。